2017-10-29 回答
你的这两个函数void delayms(uint)和void display(uchar,uchar,uchar,uchar)我可以肯定的告诉你,没有问题。你的这个程序其实就是想显示0000~5959之间的数,而且这个数是每20秒+1顺序递增的。之所以没有任何反应,那是你的主程序没有挂起,也就是在while(1)里没有没有大括号,程序执行一次就结束了,所以你什么都看不到。应该这样
while(1)
{//加入的成对大括号
for(thou=0;thou<=5;thou++) //千位
for(hun=0;hun<=9;hun++) //百位
for(ten=0;ten<=5;ten++) //十位
for(one=0;one<=9;one++) //个位
{
while(num!=20) //循环一秒
{
display(thou,hun,ten,one);//数码管显示四个数字
}
num=0;
}
}
这样你就可以看到程序运行的结果了,但结果是这样的:四个led显示管闪得很严重,计划是一亮一灭的,而且0000~5959这个数字几乎显示得不成样子。主要是delayms(5),这个延迟程序你应该尽量控制在20ms之内(主要是人眼残辉的时间极限),短了感觉就全亮,长了就一闪一灭。
不过我很看不惯你的这个程序,我给你一个cpu负担更小,而显示又非常好的程序供你参考:
#include<at89x52.h>
#define uint unsigned int
#define uchar unsigned char
sbit led4=p2^0; //数码管千分位
sbit led3=p2^1; //数码管百分位
sbit led2=p2^2; //数码管十分位
sbit led1=p2^3; //数码管个分位
uchar ms20,s1;//20毫秒和1s变量定义(声明)
//定时器t0初始化,10ms秒初值
void inittimer0(void)
{
tmod=0x01;
th0=0x0d8;
tl0=0x0f0;
ea=1;
et0=1;
tr0=1;
}
void display(uchar dat4,uchar dat3,uchar dat2,uchar dat1)
{
static uchar k;
p2=p2|0xf0;
switch(k++)
{
case 0:
p0=dat4;
led4=1;
break;
case 1:
p0=dat3;
led3=1;
break;
case 2:
p0=dat2;
led2=1;
break;
case 3:
p0=dat1;
led1=1;
break;
default:k=0;return;
}
}
void timer0(void) interrupt 1//1ms中断
{
th0=0x0d8;
tl0=0x0f0;
ms20++;
s1++;
}
void main(void)
{
uchar thou,hun,ten,one;
inittimer0();
while(1)
{
if(s1>=100)//每1秒钟one+1
{
s1=0;
if(one++>=9)
{
one=0;
if(ten++>=5)
{
ten=0;
if(hun++>=9)
{
hun=0;
if(thou++>=5) thou=0
}
}
}
}
if(ms20==2)//每20毫秒调用一次显示函数
{
display(thou,hun,ten,one);
ms20=0;
}
}
}