关于51单片机软件延时并用数码管显示的问题,请各位高手指教!

编写了如下一段软件延时并用数码管显示的程序,显示范围是0--60,在板子上显示时只显示了十位(其实个位也有显示的只是一闪而过,就像没显示一样),请问这是什么问题???(这里给的是main部分,其他的可以不管,ADDR0,ADDR1,ADDR2是通过控制译码器的输入来控制数码管的位选,也可以不管)
void main()
{
ENLED=0;ADDR3=1; /*38译码器使能*/
while(1)
{
static uchar num=0;
delay(10000); /*调用前面的一个软件延时子函数*/
num++;
if(num<60)
{
ge=num%10;
shi=num/10%10;
ADDR0=0;ADDR1=0;ADDR2=0;P0=table1[ge];/*使用动态显示在P0口显示个位*/
ADDR0=1;ADDR1=0;ADDR2=0;P0=table1[shi]; /*使用动态显示在P0口显示十位*/
}
else num=0;

}
}

显示一位后,要有一个延时,之后再显示下一位。

必要时,还要加上消隐,之后再显示下一位。

否则,显示必然混乱,总是在交换显示内容,看不清楚。

void main()
{
ENLED = 0; ADDR3 = 1; /*38译码器使能*/
uchar num = 0, i;

while(1) {
num++;
if(num > 60) num = 0;

ge = num% 10;
shi = num / 10 % 10;

ADDR1 = 0; ADDR2 = 0;

for (i = 0; i < 200; i++) {
ADDR0 = 0; P0 = table1[ge]; delay(10); /*调用前面的一个软件延时子函数*/
ADDR0 = 1; P0 = table1[shi]; delay(10); /*调用前面的一个软件延时子函数*/
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-13
原因在此:
ADDR0=1;ADDR1=0;ADDR2=0;P0=table1[shi]; /*使用动态显示在P0口显示十位*/
上一语句是:ADDR0=0;ADDR1=0;ADDR2=0;P0=table1[ge];/*使用动态显示在P0口显示个位*/
就相当于你刚把个位送去显示,接着就把十位送显示,是不是后面送去的十位显示就把前面的内容覆盖了,而且单片机的这个执行是很快的,所以,人眼看的话就像你说的出现一闪而过了,是显示了,只是速度太快,看不清楚,几乎看不到。

解决的办法:
1、如果IO口够用的话,可以把两次送显分开,P0口控制显示个位,P1口控制显示十位,这样就不会出现覆盖。
2、你用38译码器的话,一个IO口也够了,比如你的P0口,低四位控制显示个位,高四位控制显示十位。table做一个就可以(从0-60),对照38译码器真值表,还有你的数码管是共阳还是共阴,就可以编写程序了。

具体的还得看你的硬件电路,因为没有原理图,上述所讲,难免有不当之处,不当之处请见谅,大家共同学习,共同交流,共同进步。本回答被提问者采纳
第2个回答  2013-08-12
数码管显示个位时电平保持时间太短,显示个位后加一个小延时。
unsinged char i;

for(i=0;i<50;i++)
{
ADDR0=0;ADDR1=0;ADDR2=0;P0=table1[ge];/*使用动态显示在P0口显示个位*/
delay(50);
ADDR0=1;ADDR1=0;ADDR2=0;P0=table1[shi]; /*使用动态显示在P0口显示十位*/
delay(50);
}
第3个回答  2013-08-13
这两位回答挺好的,数码管显示主要是需要延时和消影
相似回答