单片机共阴极数码管显示A12.0时,但当数码管显示A09.2时,第二位数字0怎样消隐。

单片机共阴极数码管显示A12.0时,但当数码管显示A09.2时,第二位数字0怎样消隐。,第1张

单片机驱动数码管显示,高位数0消隐方法,在数码管驱动函数中加一个高位0判断(若是有多位数的高位还可以设置一个高位0标志),若为0则显示消隐码(共阴为00H,共阳为0FFH,)就可以了。

是这样的,P0=0XFF;这个语句是消隐没错,可是语句放的位置不一样,效果也是不一样的,你试试把他放在段选的后面,或者位选的后面,或者用两次消隐,把这个语句放在不同的地方,再结合自己的电路思考是否合理,消隐这个 *** 作很锻炼人的,别看着别人的程序就以为自己消隐了,毕竟电路是不一样的,多思考,多试几次。。。

我没有仔细研究你的电路,但能大致理解你的软件的作用。给你提供几点排查问题的思路。

能否实现8个数码管同时静态地显示数字?例如可以在main()函数里这样写:

void main(void)
{
// MAX7219初始化
InitDisplay();
// 在8个数码管分别静态地显示数字0~7
WriteWord(Digit0, 0);
WriteWord(Digit1, 1);
WriteWord(Digit2, 2);
WriteWord(Digit3, 3);
WriteWord(Digit4, 4);
WriteWord(Digit5, 5);
WriteWord(Digit6, 6);
WriteWord(Digit7, 7);
// 无限循环
while (1) ;
}

如果这一步还做不到,有可能的原因是:

1) 电路有问题;

2) MAX7219初始化函数InitDisplay()有问题;

3) WriteWord()函数有问题。

你需要再去仔细查看芯片的Datasheet。

如果这一步可以做到,那么主要问题就在main()函数里。

按照我的理解,你是想在无限循环体里,依次往Digit0~Digit7写入0~7,期望显示出来的效果是

01234567 --> 12345670 --> 23456701 -->

但你目前的main()函数有几个可能存在问题的地方:

1) 往Digit0写入的是DisBuffer数组的值;而写入Digit1~Digit7的是db数组的值。DisBuffer初始化为全0后就没有修改过,那么写入Digit0的就总是0。

2) 在8位C51单片机上做求余运算是很费CPU资源的。而且db数组的内容在初始化之后就没有变,实际上只是当做常量来使用。优化的写法是:

void main(void)
{
uchar i;
// MAX7219初始化
InitDisplay();
i = 0;
#define WRITE_WORD(n) \
WriteWord(Digit##n, ((i++) & 0x7))
while (1)
{
delay(200);
WRITE_WORD(0);
WRITE_WORD(1);
WRITE_WORD(2);
WRITE_WORD(3);
WRITE_WORD(4);
WRITE_WORD(5);
WRITE_WORD(6);
WRITE_WORD(7);
}
#undef WRITE_WORD
}

++运算和按位与运算都是很快的。

你这是实物,还是仿真?是用两片
74HC573
锁存器
的电路吗?段码和位码是从P2口输出的,那P0=0x00;什么用?
duankong();
//打开段控
weikong();
//打开位控
这两个是控制锁存器的吗?
最好把仿真图或原理图贴上来。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12830838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-28
下一篇 2023-05-28

发表评论

登录后才能评论

评论列表(0条)

保存