第4个程序:用数码管和定时器做的时钟。
#includetypedef 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; }}