小小的单片机时钟程序

 #include<reg52.h>
 #include<absacc.h>
 #define  PA XBYTE[0XD1FF]
 #define  PB XBYTE[0XD2FF]         
 #define  CON XBYTE[0XD7FF]
 #define  uchar unsigned char
 #define  uint unsigned int
 uchar table[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
 uchar table1[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xb8,0x20,0x28};
 uchar count;    //定义是否计时有20个50ms的即1s的全局变量;
 
 void delay(uint j)
 {
   uint a;
   while(j--)
   for(a=0;a<=1000;a++);
 }

 main()
{
   uchar i,number1=0,number2=0,number3=0,number4=0,number5=0;
   signed char number=0;
   count=0;
   TMOD=0x01;
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   EA=1;
   ET0=1;
   TR0=1;
   CON=0x80;
   while(1)
   {
     for(i=0;i<6;i++)
  {
   if(i==0)
   { 
     PB=0xff;
     PA=table[0];
  if(count==20)             //判断第6个数码管(秒钟的个位),即达到1s后,改变第6个数码管的数值
  {
    if(number==9)       //判断第5个数码管(秒钟的十位),即每当经过10s后,改变第第5个数码管的值
    {
      number=-1;
      ++number1;
   if(number1==6)   //判断第4个数码管(分钟的各位),即当每经过60秒后,改变第4个数码管的值
      {
        number1=0;
     ++number2;
     if(number2==10)     //判断第3个数码管(分钟的十位),即当每经过10分钟后,改变第3个数码管的值
     {
      number2=0;
            ++number3;
      if(number3==6)  //判断第2个数码管(小时的的个位),即当每经过60分钟后,改变第2个数码管的值
      {
        number3=0;
     ++number4;
     if(number4==10)  //判断第1个数码管(小时的十位),即当每经过十个小时,改变第1个数码管的值
     {
       number4=0;
       ++number5;
       if(number5==1&&number4==3)    //经过十二个小时后,重新从0开始计时
       {
      number5=0;
      number4=0;
       }
    
     }
     
      }
    
     }
   
    }
  
    }
    PB=table1[++number];
    count=0;
  
   
  }
     else
  {
    if(number==0)
      PB=table1[number];
    else
      PB=table1[number];
  }
 
   }

   else
   {
     PB=0xff;
    if(i==1)
    {
      PA=table[i];
   PB=table1[number1];
  
    }
    else
    {
      PB=0xff;
   if(i==2)
   {
     PA=table[i];
     PB=table1[number2];
   }
   else
   {
     PB=0XFF;
     if(i==3)
     {
      PA=table[i];
      PB=table1[number3];
     }
     else
     {
       PB=0xff;
    if(i==4)
    {
     PA=table[i];
     PB=table1[number4];
    }
      
    else
    {
          PB=0XFF;
       PA=table[i];
          PB=table1[number5];
       }
     }
   
   }
     }
  
   }
 
 
  }
  
   }

 }

void timer0() interrupt 1
{
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   count++;
}

数码管的显示是通过8255的PA PB口输出来控制的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值