悲剧的protues仿真

     今天,小组里的一个组员问我一道关于数码管动态显示的问题,是《单片机c语言程序设计实训100例》里的14 K1-K4 控制数码管移位显示(有这本书的可以翻翻),虽说一直没细致的玩过51单片机(或者说是没玩过流水灯、数码管)。一开始以为小菜一碟,百度一下动态显示的运行原理,写程序不是水到渠成的事吗?

 

     因为书上配的有protues仿真,于是就用仿真做了,没动板子,出了一个问题。

 

     简单点说就是8位7SEG-MPX8-CA数码管移位显示函数:

 

void Show_Count_ON_DSY() { uchar i; for(i=0;i<8;i++) { P0 = DSY_CODE[Display_Buffer[i]]; P2 = DSY_Index[i]; DelayMS(2); //P2=0x00; } }

 

     上面函数先给位选信号,再给段选信号,仿真没反应,而先给段选信号,后给位选信号,有反应了,可只有一个数码管亮,后面加上了那句注释掉的语句,就是每次关位选,马上就好了。

 

      无语了,why?

 

      百度一下,基本上把前面十页的帖子全看了,无果……

 

      谷歌,依旧……

 

      先解释一下动态显示吧,很明显,通俗的说,我们把向数码管各位轮流送入字符编码和位选信号,利用人眼的视觉暂留,让人感觉好像几位数码管被同时点亮,这样便可以在不同的数码管上同时显示不同的字符的效果称为动态显示。打个比方,你晚上拿根点着的烟,在空中快速划过,你就会看到一条亮线,但其实它只是一个亮点划过而已。如果你对它还不了解,可以到别的资料上查看一下视觉暂留的相关知识。而静态显示就是真实的同时选中几位。这就是它们的根本区别。

 

       当然到这里有人要说我卖关子了,其实看了标题,也该猜出,是protues仿真的问题,后面想到了上板子,发现结果正好相反,不是没有显示,而是显示的都是8,而这个8是可以给出解释的,是残影问题。

 

      其实在真实的板子上,就算延时很长,也可以看见“拖影”现象。出现这样的现象的原因是CPU的执行速度很快,当送入位选和段选数据后,接着又送入位选数据,但该位的段选数据还没有送入,所以该位还保持着上次的段选数据,接着该位的段选数据送入,由于视觉残留,两个段选数据的显示效果重合,形成了混乱。简单的说,就是一位数码管显示了它前一位要显示的字符和它本身要显示的字符的重叠效果。要想避免“拖影”就必须在每位数码管显示完后将其关闭,我们可以加入“P2 = 0xff;”,这样各位数码管都不会选中,然后下一位再显示时就不会有影响了,这就是所谓的“消影”。

 

     给个大红字,下次遇到protues仿真出问题,可以下到板子真实试试,有时候电路没有问题,程序没有问题,偏偏这个protues自己有问题啊。

    
   

 

你可能感兴趣的:(51单片机)