利用動態數碼管實現電子鐘 天-時-分-秒。
按下獨立按鍵可以加快電子鐘的進程
下面是源代碼
#include "reg52.h"
#include"intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^0;
sbit LSB=P2^1;
sbit LSC=P2^2;//A is low,C is high
sbit k1=P3^2;
u8 code smg1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9
u8 code smg2[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//0.~9.
u8 i=0,sec,min,hour,day;
unsigned long int s=0;
static u8 t=0;
void time0(){
ET0=1;
EA=1;
TMOD=0x01;
TL0=0x00;
TH0=0xDC;//delay 10ms;
TR0=1;
}
void et0(){
EA=1;
EX0=1;
IT0=1;
}
void shu(){
sec=s%60;
min=s%3600/60;
hour=s%86400/3600;
day=s/86400;
for(i=0;i<8;i++)
{
switch(i)
{
case(0):
LSA=1;LSB=1;LSC=1;P0=smg1[sec%10];while(!t%3);break;//0
case(1):
LSA=0;LSB=1;LSC=1;P0=smg1[sec/10];while(!t%3); break;//1
case(2):
LSA=1;LSB=0;LSC=1;P0=smg2[min%10];while(!t%3); break;//2
case(3):
LSA=0;LSB=0;LSC=1;P0=smg1[min/10]; while(!t%3);break;//3
case(4):
LSA=1;LSB=1;LSC=0;P0=smg2[hour%10];while(!t%3); break;//4
case(5):
LSA=0;LSB=1;LSC=0;P0=smg1[hour/10]; while(!t%3);break;//5
case(6):
LSA=1;LSB=0;LSC=0;P0=smg2[day%10];while(!t%3); break;//6
case(7):
LSA=0;LSB=0;LSC=0;P0=smg1[day/10]; while(!t%3);break;//7
}
P0=0x00;
}
}
main()
{
time0();
et0();
PX0=1;
while(1)
{
if(t==100)
{
s++;
t=0;
}
shu();
}
}
void time0int() interrupt 1
{
t++;
TL0=0x00;
TH0=0xDC;
}
void ex0() interrupt 0
{
if(k1==0)
{
do
{
s++;
shu();
}
while(k1==0);
}
}
|