为什么动态数码管不用消隐

#include<reg52.h>#define WXUAN P2 //位选#define DXUAN P0 //段选unsigned char code we[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code figure[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f};unsigned int i,j,fre;unsigned char num;void main(){ TMOD=0x01; fre=50; TH0=(65535-fre)/256; TL0=(65535-fre)%256; EA=1; ET0=1; TR0=1; while(1)}void interrupt0() interrupt 1{ TH0=(65535-fre)/256; TL0=(65535-fre)%256; num++; if(num==1) { num=0; WXUAN=we[i]; DXUAN=figure[i]; i++; if(i==8) i=0; }}我想问的是:为什么这个程序不用消隐?如,第一次进入中断,位选WXUAN=we[0],段选DXUAN=figure[0];当第二次进入中断时,首先,位选WXUAN=we[1],此时段选DXUAN仍为figure[0],此时应该会出现1的影子才对。然后才段选DXUAN=figure[1];通过调试,发现确实是如此。但是运行此程序后显示没有问题,根本不用不用消隐。。。实在理不清头脑了。于是写了另外一个数码管动态显示。如下:#include<reg52.h>#define WXUAN P2#define DXUAN P0unsigned char code we[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code figure[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f};unsigned int i,j;void main(){while(1)for(i=0;i<8;i++){WXUAN=we[i];DXUAN=figure[i];j=10; while(j--); DXUAN=0x00;//消隐 }}同样:第一次进入中断,位选WXUAN=we[0],段选DXUAN=figure[0];当第二次进入中断时,首先,位选WXUAN=we[1],此时段选DXUAN仍为figure[0],此时应该会出现1的影子才对。然后才段选DXUAN=figure[1];但运行这程序时,如果不加消隐,显示却会出现问题。加了消隐后才正常。很是纠结,寻求解答,谢谢!(财富值仅19。。。。尽力了)
2026年09月27日 07:53
有2个网友回答
网友(1):

交换显示位的时间,一般都很短。
如果是使用硬件工作,基本上是看不见的,也就用不着消隐。

如果是用 PROTEUS 软件仿真,它的反应太慢,远远比不上硬件。
所以,就有些拖泥带水的。

有些应该一带而过,不应该看见的,反而显示出来了,时间长了一些。
原本应该显示的,时间就被侵占了。

但是,偶然,也有时,它突出了该显示的,不该显示的,反而真就不显示了。

软件,它只是仿真而已,不必太当真。

网友(2):

  1. 交换显示位的时间,一般都很短。如果是使用硬件工作,基本上是看不见的,也就用不着消隐。

  2. 如果是用 PROTEUS 软件仿真,它的反应太慢,远远比不上硬件。所以,就有些拖泥带水的。

  3. 有些应该一带而过,不应该看见的,反而显示出来了,时间长了一些。原本应该显示的,时间就被侵占了。

  4. 但是偶然,突出了该显示的,不该显示的,反而真就不显示了。