本程序功能及特点:通过8051芯片及数码管实现数字时钟,并可以通过如下图中的两个按键对时钟进行调节,其中 “PAUSE”按键的作用是暂停/启动时钟并选择要修改的时间参数“时”,“分”,“秒”,被选择参数例如下图中从左到右依次为“时,分,秒”,当小时被选中并被修改时会有最下面两点的点亮以作为提示,“CHANGE”按键用来对被选中的参数进行修改,只能进行加法修改,超过参数的上限会自动归零,
#include
sbit dualock=P2^0;
sbit weilock=P2^1;
unsigned char code duacode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char aa=0,hour=0,mint=0,sec=0,bb=0,*choose;
void display(unsigned char,unsigned char,unsigned char);
void delay();
void init();
void main()
{
init();
while(1)
{
display(hour,mint,sec);
}
}
void init() //初始化
{
EA=1; ET0=1;
EX0=1;IT0=1;
EX1=1;IT1=1;
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TR0=1;
}
void display(unsigned char hour,unsigned char mint,unsigned char sec) //显示函数
{
weilock=1;
P0=~(1<<0);
weilock=0;
dualock=1;
P0=(bb==1)?duacode[sec%10]|0x80:duacode[sec%10];
dualock=0;
delay();
weilock=1;
P0=~(1<<1);
weilock=0;
dualock=1;
P0=(bb==1)?duacode[sec/10]|0x80:duacode[sec/10];
dualock=0;
delay();
weilock=1;
P0=~(1<<2);
weilock=0;
dualock=1;
P0=(bb==2)?duacode[mint%10]|0x80:duacode[mint%10];
dualock=0;
delay();
weilock=1;
P0=~(1<<3);
weilock=0;
dualock=1;
P0=(bb==2)?duacode[mint/10]|0x80:duacode[mint/10];
dualock=0;
delay();
weilock=1;
P0=~(1<<4);
weilock=0;
dualock=1;
P0=(bb==3)?duacode[hour%10]|0x80:duacode[hour%10];
dualock=0;
delay();
weilock=1;
P0=~(1<<5);
weilock=0;
dualock=1;
P0=(bb==3)?duacode[hour/10]|0x80:duacode[hour/10];
dualock=0;
delay();
}
void delay()
{
unsigned char i=30;
while(i--);
}
void ext0() interrupt 0 //外部中断0 选中被修改参数
{
TR0=0; bb++;
switch(bb)
{
case 1: choose=&sec; break;
case 2: choose=&mint;break;
case 3: choose=&hour;break;
case 4: TR0=1;bb=0; break;
}
}
void timer0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
if(++aa==20) {aa=0;sec++;}
if(sec==60) {sec=0;mint++;}
if(mint==60) {mint=0;hour++;}
}
void ext1() interrupt 2 // 外部中断2 对被选中参数进行修改
{
*choose+=1;
if(sec==60) sec=0;
if(mint==60) mint=0;
if(hour==24) hour=0;
}