赞助论坛
  • 3835阅读
  • 0回复

6位LED电子钟程序 [复制链接]

楼层直达
kmwgm  
发帖
5
精华
0
金币
29
威望
0
贡献
0
好评
0
注册
2011-02-15
楼主    kmwgm 发表于: 2014-03-07 14:51:29 
一个6位电子钟程序
特点:
时位为0时不显示。
时位、分位小数点以秒闪烁
调整时、分时所调位闪动闪动。
走时精度可调到每天小于1秒。
LED为共阳极

C语言程序:
       
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
int i,sec,min,h,flag;
sbit sg=P2^4;
sbit ss=P2^3;
sbit mg=P2^2;
sbit ms=P2^7;
sbit hg=P2^6;
sbit hs=P2^5;
sbit key_ch=P3^5;
sbit key_add=P3^6;
sbit key_minus=P3^7;
uchar code table[16]=
   {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code table1[16]=
   {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};    
void init();
void delay(uint);
void secont_display();
void minute_display();
void hour_display();
void control();
void time();
void main()
{
   init();
   while(1)
   {
      secont_display();
       minute_display();
       hour_display();
        control();
   }
}
void init()//初始化
{
   
   i=0;
   sec=0;
   min=0;
   h=0;
   flag=0;
   P1=0xff;
   P2=0xff;
   P3=0xff;
   EA=1;
   ET0=1;
   TMOD=0x01;
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   TR0=1;
}
void delay(uint z)//延时
{
   uint x,y;
   for(x=z;x>0;x--)
       for(y=110;y>0;y--);
}
void secont_display()//秒显示
{
   int sec_shi,sec_ge;
   sec_shi=sec/10;
   sec_ge=sec%10;
   
   P0=table[sec_ge];    
   
  sg=0;
   
   delay(1);
  sg=1;
   
   P0=table[sec_shi];    
    ss=0;
   
   delay(1);
  ss=1;

}




void minute_display()//分显示
{
   int min_shi,min_ge;
   min_shi=min/10;
   min_ge=min%10;
   if(i<=10)
   {P0=table1[min_ge];}    
   else
  P0=table[min_ge];
  if(i<=10&&flag==1)
   mg=1;
   else
  mg=0;
   delay(1);
  mg=1;
   
   P0=table[min_shi];    
   
   ms=0;
   
   delay(1);
  ms=1;
}
void hour_display()//时显示
{
   int h_shi,h_ge;
   h_shi=h/10;
   h_ge=h%10;
   if(i<=10)
   {P0=table1[h_ge];}
   else
   P0=table[h_ge];    
    if(i<=10&&flag==2)    
   hg=1;
   else
  hg=0;
   delay(1);
  hg=1;
   
   P0=table[h_shi];    
   if(h_shi==0)
   {hs=1;}
   else
   hs=0;
   
   delay(1);
   hs=1;
}
void control()
{
   if(!key_ch)
   {
       delay(5);
       if(!key_ch)
       {
             flag++;
             if(flag==3)
               flag=0;
       }
   }
   while(!key_ch);
   if(flag==1 && key_add==0)
   { delay(5);}
  if(flag==1 && key_add==0)
   {    while(!key_add);
       min++;
       if(min==60)
           min=0;
   }
   if(flag==1 && key_minus==0)
   { delay(5);}
  if(flag==1 && key_minus==0)
   {    while(!key_minus);
       min--;
       if(min==-1)
           min=59;
   }
   if(flag==2 && key_add==0)
   {delay(5);}
  if(flag==2 && key_add==0)
   {    while(!key_add);
         h++;
         if(h==13)
           h=1;
   }
   if(flag==2 && key_minus==0)
   {delay(5);}
  if(flag==2 && key_minus==0)
   {    while(!key_minus);
         h--;
         if(h==-1)
           h=12;
   }


}
void T0_rpt() interrupt 1
{
   TH0=(65536-49972)/256;//加減49972值可精确调整时间
   TL0=(65536-49972)%256;
   i++;
   time();
}
void time()
  {    
   if(i==20)
   {i=0;
  sec++;
 
   }
         if(sec==60)
         {
             sec=0;
             min++;
          }
       if(min==60)
           {
               min=0;
               h++;
            }
               if(h==13)
           {
                   h=1;
                   min=0;
                   sec=0;
           }
           
}