第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;
     }
}

