原创 6位LED数字钟程序

2007-3-19 20:44 4519 3 3 分类: MCU/ 嵌入式


最主要是MAX7219与单片机的数据传输上有问题.开机就只能显示000000
大家帮帮忙..谢谢了...dh_zeng@163.com

/***************************************************************/
//                     6
LED数字钟程序   

//  
系统所使用的器件:AT89S52(晶震频率:11.0592MHZ)
//  
采用MAX7219驱动6LED

/***************************************************************/

#include "reg52.h"            /*
头文件*/
#include "stdio.h"        
#include "intrins.h"
#define char unsigned char
char data timedata[6]={0x00,0x00,0x00,0x00,0x00,0x00};         //
计时单元数据初值
char data dis[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0a,0x00};     //
显示单元数据
char data con1s=0x00,con04s=0x00,con=0x00;                     //
秒定时用
sbit key0=P2^5;        //
调时按键
sbit key1=P2^4;        //
1操作
sbit key2=P2^3;        //
1操作
//
/***************/
//1ms
延时函数//
/***************/
delay1ms(int t)
{
int i,j;
for(i=0;i   for(j=0;j<120;j++);
}
/***************/
//
键扫描子函数//
/***************/
keyscan()
{
  EA=0;
if(key0==0)
  {
  delay1ms(10);
  while(key0==0);
  if(dis[con]==10)
    {dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];}
  con++;TR0=0;ET0=0;TR1=1;ET1=1;
  if(con>=6)
    {con=0;TR1=0;ET1=0;TR0=1;ET0=1;}
   }
   //
   if(con!=0)
   {
     if(key1==0)
      {
      delay1ms(10);
      while(key1==0);
      timedata[con]++;
       if(timedata[con]>=10)
         {timedata[con]=0;}
      dis[con]=timedata[con];dis[6]=0x0a;
      }
    }
  //
   if(con!=0)
   {
    if(key2==0)
    {
      delay1ms(10);
      while(key2==0);
        if(timedata[con]==0)
          {timedata[con]=0x09;}
        else{timedata[con]--;}
     dis[con]=timedata[con];dis[6]=0x0a;
    }
   }
EA=1;
}
//
/***************/
//
显示函数//
/***************/
/*
预编译定义*/
sbit cs="P2"^1;  /*
键盘显示控制线定义*/
sbit clk="P2"^0;
sbit din="P2"^2;
scan()
  {
    /*
内部函数说明*/
void init(void);//
初始化max7219
void dspclr(void);
void send(char reg_addr,char reg_data);


//
各控制寄存器的地址
#define no_op         0                  //
不工作寄存器地址,用于级联
#define disp0         1                  //disp1
数码管显示控制寄存器
#define disp1         2                  //disp2
数码管显示控制寄存器
#define disp2         3                  //disp3
数码管显示控制寄存器
#define disp3         4                  //disp4
数码管显示控制寄存器
#define disp4         5                  //disp5
数码管显示控制寄存器
#define disp5         6                  //disp6
数码管显示控制寄存器
#define decode_mode   9                  //
译码方式寄存器地址
#define intensity     10                 //
显示亮度控制寄存器地址
#define scan_limit    11                 //
扫描范围控制寄存器地址
#define shutdown      12                 //
调电模式控制寄存器地址
#define disptest      15                 //
显示测试控制寄存器地址
      
  
    SP=0x60;
    init();    
    send(disp5,0);send(disp4,0);send(disp3,0);
    send(disp2,0);send(disp1,0);send(disp0,0);
   // timedata[3]
上显示4timedata[0]上显示1,其他依次类      
    while(1);
   send(disp5,timedata[6]);send(disp4,timedata[5]);send(disp3,timedata[4]);
   send(disp2,timedata[3]);send(disp1,timedata[2]);send(disp0,timedata[1]);
}

   
/*******************************************************/
/*
功能:初始化设置MAX7219*/
void init(void)
{
        delay1ms(1012);
        send(intensity,0x0a);//
设置显示亮度为最亮
        send(scan_limit,0x05);//
设置扫描6位数码管
        send(decode_mode,0xff);//
设置译码方式
        send(shutdown,0x01);//
设置工作方式为正常工作
        send(disptest,0x00);//
关闭显示测试模式
}       

/*****************************************************************************************/


/*******************************************************/
/*
功能:给MAX7219发送数据或命令

*/
void send(char reg_addr,char reg_data)
{
      char data i;     
      cs=0;
      clk=0;
   for(i=8;i!=0;i--)
          {
              if((reg_addr&0x80)==0x80)
               din=1;
              else
              din=0;
              reg_addr=reg_addr<<1;
              clk=1;
              _nop_();
              clk=0;
       }
    for(i=8;i!=0;i--)
          {
              if((reg_data&0x80)==0x80)
               din=1;
              else
              din=0;
              reg_data=reg_data<<1;
              clk=1;
              _nop_();
              clk=0;
        }
     din=0;
     cs=1;        

}                   
/***************/
//
初使化函数//
/***************/
clearmen()
{
int i;
for(i=0;i<6;i++)
  {dis=timedata;}
TH0=0x3C;TL0=0xB0;     //50ms
定时初值(T0使用)
TH1=0x3C;TL1=0xB0;     //50ms
定时初值(T1使用)
TMOD=0x11;ET0=1;ET1=1;TR1=0;TR0=1;EA=1;
}
/***************/
//
主函数//
/***************/
main()
{
clearmen();
while(1)
   {
   scan();
   keyscan();
   }
}
/********************/
//1s
中断处理函数//
/********************/
void time_intt0(void) interrupt 1
{
ET0=0;TR0=0;TH0=0x3C;TL0=0xB0;TR0=1;
con1s++;
if(con1s==20)
   {con1s=0x00;
    timedata[0]++;
    if(timedata[0]>=10)
      {
       timedata[0]=0;timedata[1]++;
       if(timedata[1]>=6)
        {
          timedata[1]=0;timedata[2]++;
          if(timedata[2]>=10)
            {
              timedata[2]=0;timedata[3]++;
              if(timedata[3]>=6)
                {
                  timedata[3]=0;timedata[4]++;
                  if(timedata[4]>=10)
                     {
                       timedata[4]=0;timedata[5]++;
                      }
                      if(timedata[5]==2)
                      {
                      if(timedata[4]==4)
                      {
                        timedata[4]=0;timedata[5]=0;
                      }
                      }                
                }
            }
          }
        }
dis[0]=timedata[0];dis[1]=timedata[1];dis[2]=timedata[2];
dis[3]=timedata[3];dis[4]=timedata[4];dis[5]=timedata[5];
  }
   ET0=1;
}
/********************/
//0.4s
闪烁中断函数//
/********************/
void time_intt1(void) interrupt 3
{
   EA=0;TR1=0;TH1=0x3C;TL1=0xB0;TR1=1;
   con04s++;
if(con04s==8)
   {
     con04s=0x00;
     dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];
    }
    EA=1;
}
//**********************************OVER********************************//<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条