数码管残影
数码管为什么会出现影子?消影的原理是什么?
1 残影现象:数码管的不应该亮的段,似乎有微微的发亮,这种现象叫做残影,这种现象严重影响了我们的视觉效果。
2 残影出现的原因:残影的出现,只发生在动态扫描的设计电路中,主要问题是软件设计者考虑不足引起的。
(1)状态跳转出现的中间状态:举个简单例子,我们在数码管动态显示的那部分程序中,实际上每一个数码管点亮的持续时间是 1ms 的时间,1ms后进行下个数码管的切换。在进行数码管切换的时候,比如从 case 5 要切换到 case 0 的时候,case 5 的位选用的是 ADDR0=1; ADDR1=0; ADDR2=1;假如此刻 case 5 也就是最高位数码管对应的值是 0,我们要切换成的 case 0 的数码管位选是 ADDR0=0; ADDR1=0; ADDR2=0;而对应的数码管的值假如是 1。又因为 C 语言程序是一句一句顺序往下执行的,每一条语句的执行都会占用一定的时间,即使这个时间非常非常短暂。但是当把“ADDR0=1”改变成“ADDR0=0”的时候,这个瞬间存在了一个中间状态 ADDR0=0; ADDR1=0; ADDR2=1;在这个瞬间上,我们就给 case 4 对应的数码管 DS5 瞬间赋值了 0。当我们全部写完了 ADDR0=0; ADDR1=0; ADDR2=0后,这个时候,我们的 P0 还没有正式赋值,而 P0 此刻却保持了前一次的值,也就是在这个瞬间,我们又给 case 0 对应的数码管 DS1 赋值了一个 0。直到我们把case 0 后边的语句全部完成后,我们的刷新才正式完成。而在这个刷新过程中,有 2 个瞬间我们给的数码管赋了值,虽然很弱(因为亮的时间很短),但是我们还是能够发现。
(2)人眼的视觉暂留效应和LED的余晖效应:在程序进行切换数码管显示时,旧数据(上一位数码管的段选数据)依然存在,就开启了新数码管的位选,导致旧数据 在 新数码管 短暂出现,然后程序更换新数据,替换了 旧数据。反复快速的进行此类操作,导致短时间内,旧数据 在 新数码管 上的显示次数剧增,使光亮度达到人眼可以轻微辨别的程度,于是出现所谓 残影。
3. 解决方案:
(1)关闭段
在 switch(i)这句程序之前,加一句 P0=0xFF;这样就把数码管所有的段都关闭了,当把“ADDR”的值全部搞定后,再给 P0 赋对应的值即可。
(2)关闭位
在 switch(i)这句程序之前,加上一句 EN=1;等到把 ADDR2=0; ADDR1=0;ADDR0=0; i++; P0=LedBuff[0];这几条刷新程序全部写完后,再加上一句 ENLED=0;然后再进行 break 操作即可。
参考资料: