• 数码管倒计时


    //全部数码管计时

     #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;         

             }

    }

  • 相关阅读:
    linux源码解读(十八):红黑树在内核的应用——timer定时器
    linux源码解读(二十九):android线程通信机制handler&java对象实例布局
    linux源码解读(十九):网络通信简介——sk_buff结构体介绍
    linux源码解读(三十二):dpdk核心源码解析(二)
    linux源码解读(三十二):dpdk原理概述(一)
    linux源码解读(十六):红黑树在内核的应用——虚拟内存管理
    linux源码解读(二十七):协程原理和背景(一)
    linux源码解读(二十一):网络通信简介——tcp三次握手
    linux源码解读(三十):quic协议分析(一)
    linux源码解读(二十三):网络通信简介——网络拥塞控制之BBR算法
  • 原文地址:https://www.cnblogs.com/robotes/p/7532888.html
Copyright © 2020-2023  润新知