找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求解 为什么要加这两行代码才能消除数码管鬼影?

  [复制链接]
跳转到指定楼层
楼主


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

使用道具 举报

沙发
ID:1121801 发表于 2025-7-28 08:05 | 只看该作者
消隐啊,不然人眼还停留在上一个代码点亮的图像上
回复

使用道具 举报

板凳
ID:1064915 发表于 2025-7-28 08:33 | 只看该作者
看看教程的解释
回复

使用道具 举报

地板
ID:469589 发表于 2025-7-28 09:13 | 只看该作者
前一个是打开,为了显示,
后一个是“全关”避免鬼影残留
回复

使用道具 举报

5#
ID:1132182 发表于 2025-7-28 10:14 | 只看该作者
关  开
回复

使用道具 举报

6#
ID:1132182 发表于 2025-7-28 10:16 | 只看该作者
其实在加一个1ms更加好
回复

使用道具 举报

7#
ID:1132182 发表于 2025-7-28 10:19 | 只看该作者
但是一般都不这样写,你写的太麻烦了
回复

使用道具 举报

8#
ID:619259 发表于 2025-7-28 10:52 | 只看该作者
数码管动态扫描的消隐可以采用:1.关闭位选,2.关闭段选,3.同时关闭位选和段选。
楼主的案例是通过两片锁存器驱动,位码和段码都是由P0输出,程序是先输送位码,后输送段码,从形参上看只显示1位,所以本案例中无需消隐。
回复

使用道具 举报

9#
ID:1109793 发表于 2025-7-28 12:59 | 只看该作者
一般是先关位,然后更新段,然后开位
回复

使用道具 举报

10#
ID:904095 发表于 2025-7-28 13:45 | 只看该作者
cy009 发表于 2025-7-28 10:52
数码管动态扫描的消隐可以采用:1.关闭位选,2.关闭段选,3.同时关闭位选和段选。
楼主的案例是通过两片锁 ...

不消隐的话看上去重影挺厉害的 我是想问 这个已经通过锁存器锁住了 为什么还会产生鬼影的
回复

使用道具 举报

11#
ID:904095 发表于 2025-7-28 13:46 | 只看该作者
GlenXu 发表于 2025-7-28 09:13
前一个是打开,为了显示,
后一个是“全关”避免鬼影残留

锁存器已经锁住数据了 为做么加这个还有用呢
回复

使用道具 举报

12#
ID:904095 发表于 2025-7-28 13:50 | 只看该作者
cyi8 发表于 2025-7-28 08:05
消隐啊,不然人眼还停留在上一个代码点亮的图像上

数据不是已经被锁存器锁住了吗
回复

使用道具 举报

13#
ID:401564 发表于 2025-7-28 14:18 | 只看该作者
鬼影是因为数码管中的LED有结电容,如果只是单纯的断电,它就没那么快暗下去,这就是你看到鬼影
这就要有一个给LED快速把电放掉的操作,至于是给高电平还是低电平,那就要看你的硬件电路了,你知道原理就行了
回复

使用道具 举报

14#
ID:904095 发表于 2025-7-28 15:16 | 只看该作者
Y_G_G 发表于 2025-7-28 14:18
鬼影是因为数码管中的LED有结电容,如果只是单纯的断电,它就没那么快暗下去,这就是你看到鬼影
这就要有一个 ...

这样说还能理解一下
回复

使用道具 举报

15#
ID:1133081 发表于 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);//保持显示若干时间
回复

使用道具 举报

16#
ID:1109793 发表于 2025-7-28 17:28 | 只看该作者
Y_G_G 发表于 2025-7-28 14:18
鬼影是因为数码管中的LED有结电容,如果只是单纯的断电,它就没那么快暗下去,这就是你看到鬼影
这就要有一个 ...

真的假的啊
回复

使用道具 举报

17#
ID:619259 发表于 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;
回复

使用道具 举报

18#
ID:619259 发表于 2025-7-28 22:13 | 只看该作者
发表于 2025-7-28 15:16
这样说还能理解一下

不要相信那些搜索引擎答案AI答案,要相信自己对锁存器的理解,相信静态显示不需要消隐这一真理,事实胜于雄辩。
回复

使用道具 举报

19#
ID:904095 发表于 2025-7-29 08:14 | 只看该作者
cy009 发表于 2025-7-28 22:13
不要相信那些搜索引擎答案AI答案,要相信自己对锁存器的理解,相信静态显示不需要消隐这一真理,事实胜于 ...

这个本来是静态显示  但是是放到了大循环里面 所以就变成了不断循环扫描了  这个鬼影问题也就产生了
回复

使用道具 举报

20#
ID:401564 发表于 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的数据之前,要有一个把所有数码管的电放掉的操作,哪怕只是放电一个时钟的时间,那也要好很多
回复

使用道具 举报

21#
ID:384109 发表于 2025-7-29 20:13 | 只看该作者
Luckyhorse009 发表于 2025-7-29 08:14
这个本来是静态显示  但是是放到了大循环里面 所以就变成了不断循环扫描了  这个鬼影问题也就产生了

这个是动态扫描的电路,并不是静态驱动的电路,先搞清楚动态和静态的区别,搞清楚电路原理
回复

使用道具 举报

22#
ID:485350 发表于 2025-7-30 02:01 | 只看该作者
如果能仿真,一步一步调试就能知道所谓消影是什么了,真正做项目中,从来没有消影这个说法,如果别的不应该亮的灯亮了,就只有两个原因,一是硬件问题,二是软件问题,点亮一个灯->关闭所有灯->点亮一个灯->关闭所有灯,,,,,,,,,,,,,,,软件上就这样了
回复

使用道具 举报

23#
ID:654797 发表于 2025-7-30 06:31 | 只看该作者
Luckyhorse009 发表于 2025-7-28 13:46
锁存器已经锁住数据了 为做么加这个还有用呢

视觉暂鏮作用,跟锁存器没什么关系,打个比方,数码管上本来现示8的,当你想显示9时,8刚关闭,亮度在人的眼睛里一下没完全消失,这回你又显示个9出来,两个数字刚好叠加在了一起,就变得怪怪的了,这时要么用延时的方法解决,要么用一个全不显示数字的代码隔离一下,也是相当如延时了一下
回复

使用道具 举报

24#
ID:1110944 发表于 2025-7-30 07:15 来自触屏版 | 只看该作者
人中狼 发表于 2025-7-29 20:13
这个是动态扫描的电路,并不是静态驱动的电路,先搞清楚动态和静态的区别,搞清楚电路原理

是,实际上看输出波形就知道
回复

使用道具 举报

25#
ID:161164 发表于 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. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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