/* 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;
}
按键是独立按键,当按键按下时,数码管的个位数就不显示了,按键松开又正常显示
将显示程序放到中断里,什么都不显示了。1120968909这是我的qq,可以详聊吗?
追答显示放到定时器中断里,你不可以调用delayms函数,你把定时器中断不要太快,刷新率只要人眼分辨不出来即可,如果过快,当然什么都不显示了。
追问定时器50ms进入一次不算太快吧,中断中不用delayms数码管也不显示数。如果原程序是陷入死循环,为什么十位可以显示,各位却不显示?这个问题困扰我好几天了,你加我qq,在你有时间的时候我们详细聊,谢谢!!