原创 学习板做的时钟(C)

2006-10-23 09:44 2750 10 10 分类: MCU/ 嵌入式

#include "reg52.h"
#define uchar unsigned char
uchar code dis_7[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //解码
uchar code scan_con[6]={0xff,0xff,0xf7,0xfb,0xfd,0xfe};                        //列扫描控制字
uchar data timedata[6]={0x01,0x00,0x00,0x00,0x00,0x00};                        //计时单元数据初值,共6个,时 分  秒
uchar data dis[8]={0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x00};                   //0x0a是全灭
uchar data conls="0x00",con04s="0x00",con="0x01";
uchar i="0"; 
sbit sound="P3"^3;
sbit key0=P1^4;
sbit key1=P1^5;
sbit key2=P1^6;
sbit key3=P1^7;


 


//
//1ms秒延时
//
delay1ms(int t)
{int i,j;
for(i="0";i    for(j="0";j<120;j++)
 ;
}
//
//显示子函数
//
scan()
{uchar k;
for(k="2";k<6;k++)     //只显示时和分,秒不显示,因为只有4位数码管
 {P2=dis_7[dis[k]];P1=scan_con[k];
delay1ms(1);
  P2=0xff;
 }
}
//
//实现跑马灯效果,用来表示秒
//
miao()
{      i++;
       if(i==1){P0=0xfe;}
    else if(i==2){P0=0xfd;}
    else if(i==3){P0=0xfb;}
    else if(i==4){P0=0xf7;}
    else if(i==5){P0=0xef;}
    else if(i==6){P0=0xdf;}
    else if(i==7){P0=0xbf;}
    else if(i==8){P0=0x7f;i="0";}
}


//
//初始化函数
//


clearmen()
{
int i;
for(i="0";i<6;i++)
 {dis=timedata;}
 TH0=0X4b;TL0=0Xff;                      //50ms
 TH1=0X4b;TL1=0Xff;                      //50ms
 P0=0xff;
 TMOD="0X11";ET0=1;TR0=1;ET1=0;TR1=0;EA="1"; //定是器1、2都工作于方式1
}



//
//键扫描子函数
//
keyscan()
{



if(key0==0)
 {EA="0";sound="0";
 delay1ms(10);
  while(key0==0){sound="0";}
  sound="1";
 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="1";TR1=0;ET1=0;TR0=1;ET0=1;}
  }
if(con!=1)
{
  if(key1==0)
   {sound="0";
    delay1ms(10);
 while(key1==0){sound="0";}
 sound="1";
 timedata[con]++;
  if(timedata[con]>=10)
    {timedata[con]=0;}
    dis[con]=timedata[con];dis[6]=0x0a;
   }
}



if(con!=1)
{
   if(key2==0)
   { sound="0";
     delay1ms(10);
  while(key2==0){sound="0";}
     sound="1";
     if(timedata[con]==0)
    {timedata[con]=0x09;}
    else{timedata[con]--;}
  dis[con]=timedata[con];dis[6]=0x0a;
   }


}


EA="1";
}
//
//主函数
//
main()
{clearmen();


while(1)
 {
 scan();
 keyscan();
 }
}
//
//1S中断处理函数
//
void time_intt0(void) interrupt 1
{                                                  //第一个
  TR0=0;TH0=0X4b;TL0=0Xff;TR0=1;                   //重载初值
   conls++;
   if(conls==20)                                   //一秒到了?
  {
       miao();
       conls="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.4秒闪烁中断函数
//


void time_intt1(void) interrupt 3
{
 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];
  }
 
}



 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /4 下一条