数码管倒计时

//全部数码管计时

 #include<reg52.h>

/**声明使能IO口

*/

sbit ADDR0=P1^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ENLED=P1^4;

 

/*声明数组存放数码管真值表

*/

unsigned char code LedChar[]={

         0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

         0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e

};

/**数码管缓冲区

*/

unsigned char LedBuff[6]={

         0xff,0xff,0xff,0xff,0xff,0xff

};

 

unsigned char i=0; //动态扫描的索引

unsigned int  cnt=0;

 

void main(){

         unsigned long sec=0;  //记录经过秒书

         EA=1;                   //使能总开关

         ENLED=0;               //使能U3,选择数码管

         ADDR3=1;                  //使能38译码器的真值表

 

         TMOD=0x01;            //设置T0为模式1

         TH0=0xfc;            //味T0赋初值0xfc67,定时1ms

         TL0=0x67;

 

         ET0=1;                  // 使能T0中断

         TR0=1;                  // 启动T0

 

         while(1){

                   if(cnt >= 1000){ //判断T0是否溢出1000次(1000ms=1s)

                            cnt=0;

                            sec++;

                             //以下代码将sec按十进制从低到高一次提取并转换为数码管显示的字符

                            LedBuff[0]=LedChar[sec%10];

                            LedBuff[1]=LedChar[sec/10%10];

                            LedBuff[2]=LedChar[sec/100%10];

                            LedBuff[3]=LedChar[sec/1000%10];

                            LedBuff[4]=LedChar[sec/10000%10];

                            LedBuff[5]=LedChar[sec/100000%10];

                   }

         }

}

/**定时器中断服务函数

*/

void interRuptTimer0()interrupt 1 {

         //重新加载赋值

         TH0= 0xfc;

         TL0= 0x67;

 

         cnt++;          //中断次数加1

         P0=0xFF;  //显示消隐

 

         switch(i){//调用相应数码管IO口显示

                  case 0: ADDR0=0; ADDR1=0; ADDR2=0; i++; P0=LedBuff[0];break;

                   case 1: ADDR0=1; ADDR1=0; ADDR2=0; i++; P0=LedBuff[1];break;

                   case 2: ADDR0=0; ADDR1=1; ADDR2=0; i++; P0=LedBuff[2];break;

                   case 3: ADDR0=1; ADDR1=1; ADDR2=0; i++; P0=LedBuff[3];break;

                   case 4: ADDR0=0; ADDR1=0; ADDR2=1; i++; P0=LedBuff[4];break;

                   case 5: ADDR0=1; ADDR1=0; ADDR2=1; i=0; P0=LedBuff[5];break;

                   default: break;         

         }

}

转载于:https://www.cnblogs.com/robotes/p/7532888.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值