第4个程序:用数码管和定时器做的时钟。
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit duan=P1^7;
sbit wei=P1^6;
uint shuaxin=0;
unsigned long int m=0;
uchar code disap_tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7f,0x67};
uchar code shuaxin_tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void timer0_init(void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x02; //设置定时器模式
TL0 = 0x06; //设置定时初值
TH0 = 0x06; //设置定时重载值
TR0=1; //定时器开始工作
EA=1; //开总中断开关
ET0=1; //允许定时器中断
}
void main(void)
{ uchar shiwan,wan,qian,bai,shi,ge;
timer0_init();
while(1)
{ shiwan=(m/3600)/10;
wan=(m/3600)%10;
qian=((m/60)%60)/10;
bai=((m/60)%60)%10;
shi=(m%60)/10;
ge=(m%60)%10;
switch(shuaxin)
{ case 0: duan=1;P0=0x00;duan=0;
wei=1;P0=shuaxin_tab[0];wei=0;//刷新第一个数码管,刷新时间1ms
P0=0X00;
duan=1;P0=disap_tab[shiwan];duan=0;
break;
case 1: duan=1;P0=0x00;duan=0;
wei=1;P0=shuaxin_tab[1];wei=0;
P0=0X00;
duan=1;P0=disap_tab[wan];duan=0;
break;
case 2: duan=1;P0=0x00;duan=0;
wei=1;P0=shuaxin_tab[2];wei=0;
P0=0X00;
duan=1;P0=0x40;duan=0;
break;
case 3: duan=1;P0=0x00;duan=0;
wei=1;P0=shuaxin_tab[3];wei=0;
P0=0X00;
duan=1;P0=disap_tab[qian];duan=0;
break;
case 4: duan=1;P0=0x00;duan=0;
wei=1;P0=shuaxin_tab[4];wei=0;
P0=0X00;
duan=1;P0=disap_tab[bai];duan=0;
break;
case 5: duan=1;P0=0x00;duan=0;
wei=1;P0=shuaxin_tab[5];wei=0;
P0=0X00;
duan=1;P0=0x40;duan=0;
break;
case 6: duan=1;P0=0x00;duan=0;
wei=1;P0=shuaxin_tab[6];wei=0;
P0=0X00;
duan=1;P0=disap_tab[shi];duan=0;
break;
case 7: duan=1;P0=0x00;duan=0;
wei=1;P0=shuaxin_tab[7];wei=0;
P0=0X00;
duan=1;P0=disap_tab[ge];duan=0;
break;
default: P0=0x00;
break;
}
}
}
void timer0_isr()interrupt 1
{ static uchar i=0;
static uint counter=0;
i++;
counter++;
if(4==i)//说明1ms到了,该下一个数码管刷新了
{ i=0;
shuaxin++;
if(8==shuaxin)
shuaxin=0;
}
if(4000==counter)//1s时间到了,要显示数字了
{ counter=0;
m++;
if(86400==m)
m=0;
}
}