![]() |
你用示波器抓一下波形,在不该亮的时候LED有没有电就可以知道他说的对不对了。 |
代码要配合硬件来分析 以下是HC573的引脚功能表 ![]() 可以看到, 当LE脚是高时,输出等于输入 当LE脚是低时,输出等于锁存 再看代码 WLE输出时,P0是0xFE/0xFD/0xFB...,从而推断出数码管是共阴管 根据以上两点得出消除鬼影的条件: LE脚拉高前,P0输出要避免点亮数码管(位输出要高,段输出要低) 所以 29行(P0=0x00)在DLE=1;前是必须的 33行(P0=0xFF)在WLE=1;前是必须的 但你这代码还是有点臃肿 可以改为:
|
人中狼 发表于 2025-7-29 20:13 是,实际上看输出波形就知道 |
Luckyhorse009 发表于 2025-7-28 13:46 视觉暂鏮作用,跟锁存器没什么关系,打个比方,数码管上本来现示8的,当你想显示9时,8刚关闭,亮度在人的眼睛里一下没完全消失,这回你又显示个9出来,两个数字刚好叠加在了一起,就变得怪怪的了,这时要么用延时的方法解决,要么用一个全不显示数字的代码隔离一下,也是相当如延时了一下 |
如果能仿真,一步一步调试就能知道所谓消影是什么了,真正做项目中,从来没有消影这个说法,如果别的不应该亮的灯亮了,就只有两个原因,一是硬件问题,二是软件问题,点亮一个灯->关闭所有灯->点亮一个灯->关闭所有灯,,,,,,,,,,,,,,,软件上就这样了 |
Luckyhorse009 发表于 2025-7-29 08:14 这个是动态扫描的电路,并不是静态驱动的电路,先搞清楚动态和静态的区别,搞清楚电路原理 |
Luckyhorse009 发表于 2025-7-29 08:14 我不知道静态动态什么意思,但我告诉你原理 你这个电路是U1输出数据,U2位选 假设,你要LED1显示一个"8",那么,这个时候,U1的数据中,SEG_A是有电输出的,那么,在LED1中,这个数码管中的A是有电储存在里面的 到下一次,你位选到LED2的时候,你就要关闭除了SEG_DS2以外的所有位选,假设你LED2中是不需要数码管的A亮的,但是,上次LED1中的A是有电,它就会导致LED2的A有一点点亮度 所以,在显示LED2的数据之前,要有一个把所有数码管的电放掉的操作,哪怕只是放电一个时钟的时间,那也要好很多 |
cy009 发表于 2025-7-28 22:13 这个本来是静态显示 但是是放到了大循环里面 所以就变成了不断循环扫描了 这个鬼影问题也就产生了 |
发表于 2025-7-28 15:16 不要相信那些搜索引擎答案AI答案,要相信自己对锁存器的理解,相信静态显示不需要消隐这一真理,事实胜于雄辩。 |
Luckyhorse009 发表于 2025-7-28 13:45 从理论上分析,本案例实际是程序选择某位数码管显示某个数字,属于静态显示,所以是不需要消隐的。之所以出现鬼影,是程序有问题,如果去掉第29行和33行,程序是这样的:(以loction=1为例) 1. WLE=1; 2. P0=0xfe; 3. WLE=0; 4. DLE=1; 5. P0=Smgtable(num); 6. DLE=0; 问题就出在第4行,程序执行第4行时,位信号会进入数码管段选端,形成数据干扰。 解决办法: 1. P0=0xfe; 2. WLE=1; 3. WLE=0; 4. P0=Smgtable(num); 5. DLE=1; 6. DLE=0; |
Y_G_G 发表于 2025-7-28 14:18 真的假的啊 |
Luckyhorse009 发表于 2025-7-28 13:50 不论编程水平有多高也不可能同时切换数码管的段和位(也是鬼影的根源),所以要在切换数码管的段和位期间先使数码管不亮再切换,完成后再使数码管发亮。其他因素都不重要,肉眼根本观察不到。按楼主的硬件环境可以按如下逻辑编程 P0=0x00;//段消隐 DLE=1;DLE=0;//锁存 P0=0xfe;//送位码 WLE=1;WLE=0;//锁存 P0=smgtable[num];//送段码 DLE=1;DLE=0;//锁存 Delay_ms(1);//保持显示若干时间 |
Y_G_G 发表于 2025-7-28 14:18 这样说还能理解一下 |
鬼影是因为数码管中的LED有结电容,如果只是单纯的断电,它就没那么快暗下去,这就是你看到鬼影 这就要有一个给LED快速把电放掉的操作,至于是给高电平还是低电平,那就要看你的硬件电路了,你知道原理就行了 |
cyi8 发表于 2025-7-28 08:05 数据不是已经被锁存器锁住了吗 |
GlenXu 发表于 2025-7-28 09:13 锁存器已经锁住数据了 为做么加这个还有用呢 |
cy009 发表于 2025-7-28 10:52 不消隐的话看上去重影挺厉害的 我是想问 这个已经通过锁存器锁住了 为什么还会产生鬼影的 |
一般是先关位,然后更新段,然后开位 |
数码管动态扫描的消隐可以采用:1.关闭位选,2.关闭段选,3.同时关闭位选和段选。 楼主的案例是通过两片锁存器驱动,位码和段码都是由P0输出,程序是先输送位码,后输送段码,从形参上看只显示1位,所以本案例中无需消隐。 |
但是一般都不这样写,你写的太麻烦了 |
其实在加一个1ms更加好 |
关 开 |
前一个是打开,为了显示, 后一个是“全关”避免鬼影残留 |
看看教程的解释 |
消隐啊,不然人眼还停留在上一个代码点亮的图像上 |