标题: 求解 为什么要加这两行代码才能消除数码管鬼影? [打印本页]

作者: Luckyhorse009    时间: 2025-7-27 20:53
标题: 求解 为什么要加这两行代码才能消除数码管鬼影?



作者: cyi8    时间: 2025-7-28 08:05
消隐啊,不然人眼还停留在上一个代码点亮的图像上
作者: joyb    时间: 2025-7-28 08:33
看看教程的解释
作者: GlenXu    时间: 2025-7-28 09:13
前一个是打开,为了显示,
后一个是“全关”避免鬼影残留
作者: 谭1234    时间: 2025-7-28 10:14
关  开
作者: 谭1234    时间: 2025-7-28 10:16
其实在加一个1ms更加好
作者: 谭1234    时间: 2025-7-28 10:19
但是一般都不这样写,你写的太麻烦了

作者: cy009    时间: 2025-7-28 10:52
数码管动态扫描的消隐可以采用:1.关闭位选,2.关闭段选,3.同时关闭位选和段选。
楼主的案例是通过两片锁存器驱动,位码和段码都是由P0输出,程序是先输送位码,后输送段码,从形参上看只显示1位,所以本案例中无需消隐。
作者: xiaobendan001    时间: 2025-7-28 12:59
一般是先关位,然后更新段,然后开位
作者: Luckyhorse009    时间: 2025-7-28 13:45
cy009 发表于 2025-7-28 10:52
数码管动态扫描的消隐可以采用:1.关闭位选,2.关闭段选,3.同时关闭位选和段选。
楼主的案例是通过两片锁 ...

不消隐的话看上去重影挺厉害的 我是想问 这个已经通过锁存器锁住了 为什么还会产生鬼影的
作者: Luckyhorse009    时间: 2025-7-28 13:46
GlenXu 发表于 2025-7-28 09:13
前一个是打开,为了显示,
后一个是“全关”避免鬼影残留

锁存器已经锁住数据了 为做么加这个还有用呢
作者: Luckyhorse009    时间: 2025-7-28 13:50
cyi8 发表于 2025-7-28 08:05
消隐啊,不然人眼还停留在上一个代码点亮的图像上

数据不是已经被锁存器锁住了吗
作者: Y_G_G    时间: 2025-7-28 14:18
鬼影是因为数码管中的LED有结电容,如果只是单纯的断电,它就没那么快暗下去,这就是你看到鬼影
这就要有一个给LED快速把电放掉的操作,至于是给高电平还是低电平,那就要看你的硬件电路了,你知道原理就行了
作者: Luckyhorse009    时间: 2025-7-28 15:16
Y_G_G 发表于 2025-7-28 14:18
鬼影是因为数码管中的LED有结电容,如果只是单纯的断电,它就没那么快暗下去,这就是你看到鬼影
这就要有一个 ...

这样说还能理解一下
作者: WL0123    时间: 2025-7-28 16:45
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);//保持显示若干时间
作者: xiaobendan001    时间: 2025-7-28 17:28
Y_G_G 发表于 2025-7-28 14:18
鬼影是因为数码管中的LED有结电容,如果只是单纯的断电,它就没那么快暗下去,这就是你看到鬼影
这就要有一个 ...

真的假的啊
作者: cy009    时间: 2025-7-28 18:21
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;
作者: cy009    时间: 2025-7-28 22:13
发表于 2025-7-28 15:16
这样说还能理解一下

不要相信那些搜索引擎答案AI答案,要相信自己对锁存器的理解,相信静态显示不需要消隐这一真理,事实胜于雄辩。
作者: Luckyhorse009    时间: 2025-7-29 08:14
cy009 发表于 2025-7-28 22:13
不要相信那些搜索引擎答案AI答案,要相信自己对锁存器的理解,相信静态显示不需要消隐这一真理,事实胜于 ...

这个本来是静态显示  但是是放到了大循环里面 所以就变成了不断循环扫描了  这个鬼影问题也就产生了
作者: Y_G_G    时间: 2025-7-29 10:36
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的数据之前,要有一个把所有数码管的电放掉的操作,哪怕只是放电一个时钟的时间,那也要好很多
作者: 人中狼    时间: 2025-7-29 20:13
Luckyhorse009 发表于 2025-7-29 08:14
这个本来是静态显示  但是是放到了大循环里面 所以就变成了不断循环扫描了  这个鬼影问题也就产生了

这个是动态扫描的电路,并不是静态驱动的电路,先搞清楚动态和静态的区别,搞清楚电路原理
作者: 18680365301    时间: 2025-7-30 02:01
如果能仿真,一步一步调试就能知道所谓消影是什么了,真正做项目中,从来没有消影这个说法,如果别的不应该亮的灯亮了,就只有两个原因,一是硬件问题,二是软件问题,点亮一个灯->关闭所有灯->点亮一个灯->关闭所有灯,,,,,,,,,,,,,,,软件上就这样了
作者: vscos    时间: 2025-7-30 06:31
Luckyhorse009 发表于 2025-7-28 13:46
锁存器已经锁住数据了 为做么加这个还有用呢

视觉暂鏮作用,跟锁存器没什么关系,打个比方,数码管上本来现示8的,当你想显示9时,8刚关闭,亮度在人的眼睛里一下没完全消失,这回你又显示个9出来,两个数字刚好叠加在了一起,就变得怪怪的了,这时要么用延时的方法解决,要么用一个全不显示数字的代码隔离一下,也是相当如延时了一下
作者: zhangdong533    时间: 2025-7-30 07:15
人中狼 发表于 2025-7-29 20:13
这个是动态扫描的电路,并不是静态驱动的电路,先搞清楚动态和静态的区别,搞清楚电路原理

是,实际上看输出波形就知道
作者: lkc8210    时间: 2025-7-30 14:18
代码要配合硬件来分析
以下是HC573的引脚功能表


可以看到,
当LE脚是高时,输出等于输入

当LE脚是低时,输出等于锁存

再看代码
WLE输出时,P0是0xFE/0xFD/0xFB...,从而推断出数码管是共阴管

根据以上两点得出消除鬼影的条件:
LE脚拉高前,P0输出要避免点亮数码管(位输出要高,段输出要低)

所以
29行(P0=0x00)在DLE=1;前是必须的

33行(P0=0xFF)在WLE=1;前是必须的
但你这代码还是有点臃肿
可以改为:
  1. void SmgDisply(usigned char location, usigned char num)
  2. {
  3.         P0=0x00;
  4.         DLE=1;
  5.         DLE=0;       
  6.         switch(location)
  7.         {
  8.                 case 1: P0=0xFE;break;
  9.                 case 2: P0=0xFD;break;
  10.                 case 3: P0=0xFB;break;
  11.                 case 4: P0=0xF7;break;
  12.                 case 5: P0=0xEF;break;
  13.                 case 6: P0=0xDF;break;       
  14.         }
  15.         WLE=1;
  16.         WLE=0;
  17.         P0=Smgtable[num];
  18.         DLE=1;
  19.         DLE=0;
  20. }
复制代码




作者: rundstedt    时间: 2025-7-31 15:55
xiaobendan001 发表于 2025-7-28 17:28
真的假的啊

你用示波器抓一下波形,在不该亮的时候LED有没有电就可以知道他说的对不对了。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1