您的位置 首页 动态

怎么消除单片机数码管的鬼影现象

如何消除单片机数码管的鬼影现象-“鬼影”的出现,主要是在数码管位选和段选产生的瞬态造成的。举个简单例子,我们在数码管动态显示的那部分程序中,实际上每一个数码管点亮的持续时间是 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。

不知道同学们是否发现了,咱们的这两个数码管动态显现程序的运转作用好像并不是那么完美,第一个小问题,咱们仔细看,数码管的不应该亮的段,好像有微微的发亮,这种现象叫做“鬼影”,这个“鬼影”严峻影响了咱们的视觉作用,咱们该怎么处理呢?

同学们在往后或许会遇到各式各样的实际问题,或许许多都是咱们没有讲过的,遇到问题怎么办呢?咱们要信任,你作为初学者,遇到的问题必定不是第一个遇到的,必定有长辈现已遇到过相同的或相似的问题,他们一般都会在网上宣布各种帖子,各种评论,所以咱们遇到问题,首要就应该构成一个到网上查找的条件反射,这个问题咱们能够到网上搜:“数码管消隐”或许“数码管鬼影处理”,多找相关关键词查找试试,会查找也是一种才能。

咱们在网上搜了一下会发现,处理这类问题的办法有两个,其中之一是延时,延时之后咱们肉眼就或许看不到这个“鬼影”了。可是延时是一个十分低劣的手法,且不说延时多久能让咱们看不到“鬼影”,延时后,咱们的数码管亮度会遍及下降。咱们处理问题呢,不能只知其然,还要知其所以然,那么咱们首要就来弄了解为什么会呈现“鬼影”。

“鬼影”的呈现,主要是在数码管位选和段选发生的瞬态形成的。举个简略比方,咱们在数码管动态显现的那部分程序中,实际上每一个数码管点亮的持续时刻是 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 个瞬间咱们给过错的数码管赋了值,尽管很弱(因为亮的时刻很短),可是咱们仍是能够发现。

那么搞了解了原理后,处理起来就不是困难的工作了,咱们只需避开这个瞬间过错就能够了。不发生瞬间过错的办法是,在进行位选切换期间,防止悉数数码管的赋值即可。办法有两个,一个办法是改写之前封闭一切的段,改动好了位选后,再翻开段即可;第二个办法是封闭数码管的位,赋值进程都做好后,再从头翻开即可。这个不是很难,答案我都发布一下。

封闭段

在 switch(i)这句程序之前,加一句 P0=0xFF;这样就把数码管一切的段都封闭了,当把“ADDR”的值悉数搞定后,再给 P0 赋对应的值即可。

封闭位

在 switch(i)这句程序之前,加上一句 ENLED=1;比及把 ADDR2=0; ADDR1=0;ADDR0=0; i++; P0=LedBuff[0];这几条改写程序悉数写完后,再加上一句 ENLED=0;然后再进行 break 操作即可。

这个当地逻辑思路上略微有点杂乱,咱们必定要了解深入,深入了解,完全弄了解,把这个瞬间的问题弄了解了,后边许多牵扯到此类情况的问题,咱们都能够一起搞定。

上边的数码管程序还有第二个问题,咱们仔细看,咱们的数码管上的数字每一秒改动一次,改动的时分,不参与改动的数码管或许呈现一次颤动,这个颤动没有什么专业的姓名,咱们就称之为数码管颤动吧。这种数码管颤动是什么原因形成的呢?为何在数据改动的时分才颤动呢?

来剖析一下咱们的程序,程序在守时到 1 秒的时分,履行了“秒数+1 并转换为数码管显现字符”这个操作,一个 32 位整型数的除法运算,实际上是比较消耗时刻的,至于这一段程序终究消耗了多少时刻,能够先来看看这段程序运转用了多少时刻。因为每次守时到 1 秒的时分,程序都多运转了这么一段,导致了某个数码管的点亮时刻比其他情况下要长一些,总时刻就变成了 1ms+本段程序运转时刻,于此一起,其它的数码管就平息了 5ms+本段程序运转时刻,假如这段程序运转时刻十分短,那么能够忽略不计,但很明显,现在这段程序运转时刻现已比较长了,以致于严峻影响到视觉作用了,所以咱们要采纳别的一种思路去处理这个问题。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/345762.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部