标题: 关于单片机数码管动态显示程序上的疑问 [打印本页]
作者: fandongyang 时间: 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; //74HC138和P0初始化部分
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++; //计数值counter加1
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;
} //动态刷新
}
作者: fandongyang 时间: 2018-11-12 19:50
有没有人
作者: zhouwen 时间: 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的。
答:你的想法是对的
作者: zl2168 时间: 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案例,用于仿真实验操作,电路与程序真实可靠可信可行。书中电路和程序设计有详细说明,程序语句条条有注解。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |