51单片机的一个试验现象,程序是自己写的,现象分析不通了,请高手帮我分析一下

/* LED 显示两位数0-59,按K1数值加1,按K2数值减1,按K3数值清0,
按K4一次数值自动每秒加1,按K4第二次停止自动加1并保持数值 */
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit k1=P2^7;
sbit k2=P2^6;
sbit k3=P2^5;
sbit k4=P2^4;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段选
uchar num=0,i;
void display(uchar);
void delayms(unsigned xms);
void init() //中断初始化
{
TMOD=0X11;
EA=1;
ET0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
void keyscan() //按键扫描
{
if(k1==0)
delayms(20);
if(k1==0)
{
num++;
if(num==60)
num=0;
while(!k1);
}

if(k2==0)
{
delayms(20);
if(k2==0)
{
if(num==0)
num=60;
num--;
while(!k2);
}
}
if(k3==0)
{
delayms(20);
if(k3==0)
{
num=0;
while(!k3);
}
}
if(k4==0)
{
delayms(20);
if(k4==0)
{
while(!k4);
TR0=~TR0;
}
}
}
void main()
{
init();
while(1)
{
keyscan();
display(num);
}
}

void display(uchar num) //显示
{
uchar shi,ge;
shi=table[num/10];
ge=table[num%10];

P0=0xfd;
P1=ge;
delayms(5);
P0=0xfe;
P1=shi;
delayms(5);

}

void delayms(unsigned xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=123;j>0;j--);
}

void T0_INT() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==20)
{
num++;
i=0;
}
if(num==60)
num=0;
}
按键是独立按键,当按键按下时,数码管的个位数就不显示了,按键松开又正常显示

当你按下按键的时候,程序处于无限死循环,只有松开的时候才会继续进行。
你可以把你的显示程序放到定时器中断里面进行刷新显示。
前提:显示程序里不要调用main函数调用的函数,这样避免冲突。追问

将显示程序放到中断里,什么都不显示了。1120968909这是我的qq,可以详聊吗?

追答

显示放到定时器中断里,你不可以调用delayms函数,你把定时器中断不要太快,刷新率只要人眼分辨不出来即可,如果过快,当然什么都不显示了。

追问

定时器50ms进入一次不算太快吧,中断中不用delayms数码管也不显示数。如果原程序是陷入死循环,为什么十位可以显示,各位却不显示?这个问题困扰我好几天了,你加我qq,在你有时间的时候我们详细聊,谢谢!!

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答