找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 962|回复: 3
打印 上一主题 下一主题
收起左侧

关于单片机数码管动态显示程序上的疑问

[复制链接]
跳转到指定楼层
楼主
ID:384762 发表于 2018-11-9 09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面面这个是我在51hei论坛上看到的程序,我看了一下我有个疑问(1)当stopwatch=1的时候, LedNumbe[]这个数组是否除了LedNumbe[0]=1以外,其他LedNumbe[]是否都为0  ,假如是的话,请看问题2。(2)当stopwatch=1的时候,进入动态刷新,除了第一个数码管能显示1外 其他数码管都会有显示0,到最后的数码管的效果就会变成这样000001 000002 000003,而这个程序的效果应该是 1    2     3    4    5    6,就是多余位是不会显示的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 LedNumber[6] = {0}; //定义全局变量
unsigned char j = 0;
unsigned int counter = 0;
void main()
{
    unsigned long stopwatch =0;
    ENLED = 0; ADDR3 = 1; P0 = 0XFF;   //74HC138P0初始化部分
    TMOD = 0x01;  //设置定时器0为模式1
    TH0  = 0xFC;
    TL0  = 0x67;  //定时值初值,定时1ms
    TR0  = 1;     //打开定时器0
    EA = 1;       //打开中中断
    ET0 = 1;      //打开定时器0中断
    while(1)
    {
        if(1000 == counter)     //判断定时器0溢出是否达到1000
        {
            counter = 0;
            stopwatch++;
            LedNumber[0] = stopwatch%10;
            LedNumber[1] = stopwatch/10%10;
            LedNumber[2] = stopwatch/100%10;
            LedNumber[3] = stopwatch/1000%10;
            LedNumber[4] = stopwatch/10000%10;
            LedNumber[5] = stopwatch/100000%10;
        }
    }
}
void InterruptTimer0() interrupt 1               //中断函数的特殊写法,数字’1’为中断入口号
{
    TH0 = 0xFC;   //溢出后进入中断重新赋值
    TL0 = 0x67;
    counter++;   //计数值counter1
    P0 = 0xFF;   //消隐
    switch(j)
    {
        case 0: ADDR0=0; ADDR1=0; ADDR2=0; j++; P0=LedChar[LedNumber[0]]; break;
        case 1: ADDR0=1; ADDR1=0; ADDR2=0; j++; P0=LedChar[LedNumber[1]]; break;
        case 2: ADDR0=0; ADDR1=1; ADDR2=0; j++; P0=LedChar[LedNumber[2]]; break;
        case 3: ADDR0=1; ADDR1=1; ADDR2=0; j++; P0=LedChar[LedNumber[3]]; break;
        case 4: ADDR0=0; ADDR1=0; ADDR2=1; j++; P0=LedChar[LedNumber[4]]; break;
        case 5: ADDR0=1; ADDR1=0; ADDR2=1; j=0; P0=LedChar[LedNumber[5]]; break;
        default: break;
    }    //动态刷新
}   


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:384762 发表于 2018-11-12 19:50 | 只看该作者
有没有人
回复

使用道具 举报

板凳
ID:111339 发表于 2018-11-13 11:34 | 只看该作者
(1)当stopwatch=1的时候, LedNumbe[]这个数组是否除了LedNumbe[0]=1以外,其他LedNumbe[]是否都为0  :
答:没错 当 stopwatch=1 时stopwatch/10 = 0,0%10 = 0,所以 LedNumber[1] = stopwatch/10%10 = 0 ;  
        
(2)当stopwatch=1的时候,进入动态刷新,除了第一个数码管能显示1外 其他数码管都会有显示0,到最后的数码管的效果就会变成这样000001 000002 000003,而这个程序的效果应该是 1    2     3    4    5    6,就是多余位是不会显示的0的。
答:你的想法是对的
回复

使用道具 举报

地板
ID:111634 发表于 2018-11-14 08:27 | 只看该作者
4.2  LED数码管动态显示    实例56  PNP晶体管选通3位共阳LED数码管动态显示; 实例57  74LS139选通4位LED数码管动态显示 实例58  74LS138选通8位LED数码管动态显示 实例59  74LS595串行选通8位LED数码管动态显示 实例60  8255A扩展8位LED数码管动态显示 实例63  8155扩展8位LED数码管动态显示 实例64  MAX7221控制8位LED数码管动态显示    以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表