当前位置: 代码迷 >> 单片机 >> 单片机 之基于间断带消隐的数码管动态显示示例
  详细解决方案

单片机 之基于间断带消隐的数码管动态显示示例

热度:411   发布时间:2016-04-28 14:59:18.0
单片机 之基于中断带消隐的数码管动态显示示例


#include <reg52.h>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, 0xFF};unsigned char i = 0;   //动态扫描的索引unsigned int cnt = 0;  //记录T0中断次数void main(){    unsigned long sec = 0;  //记录经过的秒数    EA = 1;       //使能总中断    ENLED = 0;    //使能U3,选择控制数码管    ADDR3 = 1;    //因为需要动态改变ADDR0-2的值,所以不需要再初始化了    TMOD = 0x01;  //设置T0为模式1    TH0  = 0xFC;  //为T0赋初值0xFC67,定时1ms    TL0  = 0x67;    ET0  = 1;     //使能T0中断    TR0  = 1;     //启动T0        while (1)    {        if (cnt >= 1000)  //判断T0溢出是否达到1000次        {            cnt = 0;      //达到1000次后计数值清零            sec++;        //秒计数自加1            //以下代码将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];        }    }}/* 定时器0中断服务函数 */void InterruptTimer0() interrupt 1    //1-计算公式 x*8+3=中断向量 转10进制值 0x000B =11   x=1 即 TO中断号 1#{    TH0 = 0xFC;  //重新加载初值    TL0 = 0x67;    cnt++;       //中断次数计数值加1    //以下代码完成数码管动态扫描刷新    P0 = 0xFF;   //显示消隐    switch (i)    {        case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;        case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;        case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;        case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break;        case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break;        case 5: ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5]; break;        default: break;    }}

  相关解决方案