51单片机显示问题,求帮忙看下哪里有问题。
问题:我按下启动或者暂停的时候一直按着,只有个位显示,松开正常,怎么按着让他显示暂停的个十百都显示?
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wei1=P2^2;
sbit wei2=P2^3;
sbit wei3=P2^4;
sbit key2=P3^0;
sbit key1=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
uchar code tableduan[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x39,0x5e,0x79,0x71};
uchar num,bai,shi,ge;
uint temp;
void init()
{
temp=0;
P0=0X00;
TMOD=0X01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=0;
}
void time() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
num++;
if(num==100)
{
num=0;
temp++;
if(temp==999)
temp=0;
}
}
void delay(uchar a)
{
uchar x,y;
for(x=a;x>0;x--)
for(y=10;y>0;y--);
}
void display()
{
bai=temp/100;
shi=temp/10%10;
ge=temp%10;
P0=0X00;
wei1=1;
wei2=1;
wei3=1;
P0=tableduan[bai];
// delay(10);
P0=0X00;
wei1=0;
wei2=1;
wei3=1;
P0=tableduan[shi];
// delay(10);
P0=0X00;
wei1=1;
wei2=0;
wei3=1;
P0=tableduan[ge];
// delay(10);
}
void main()
{
init();
while(1)
{
display();
if(key1==0)
{
delay(50);
if(key1==0)
{
TR0=0;
while(!key1);
}
}
if(key2==0)
{
delay(50);
if(key2==0)
{
TR0=1;
while(!key2);
}
}
if(key3==0)
{
delay(50);
if(key3==0)
{
temp=0;
while(!key3);
}
}
if(key4==0)
{
delay(50);
if(key4==0)
{
TR0=~TR0;
while(!key4);
}
}
}
}
参考下论坛大神 吴坚鸿的按键检测代码吧。 郭老师带领了无数人入门啊,我也是看郭天祥教程入门的。有个普遍的现象就是看郭老师的学生最后都会碰到数码管显示,按键不灵敏之类的问题,主要是老师当时没有刻意提醒一下大家程序的执行效率问题。所以,你要留意了。
由于delay造成的
P0=0X00;
wei1=0;
wei2=1;
wei3=1;
P0=tableduan[shi];
// delay(10);
P0=0X00;
wei1=1;
wei2=0;
wei3=1;
P0=tableduan[ge];
我如果把上边的shi和ge换位的话会出现,一直按下十位常亮;delay更改后还是一样?
if(key1==0)
{
delay(50);
if(key1==0)
{
TR0=0;
while(!key1);
}
因为这个松手检测造成的,按下后程序停下来了,显示的是最后送显示的那一位。
display里最后显示的个位,所以就只显示个位了。
改进:改变按键检测方法。
那就不知道你这到底是为什么了
怎么改进,能不能给个例子,我这是按照郭天祥的思路来做的,刚学习!
P0=0X00;//把数码管段关掉
wei1=1;
wei2=0;
wei3=1;//这三个是打开位选
由于不是用的郭天祥的线路板,原理图不一样!
两种方法:
第一种办法。不要用 while(!key1); while(!key2);while(!key3); while(!key4);改成标志位。
第二种办法。 用while(!key1); while(!key2);while(!key3); while(!key4);但是要重新开启一个定时器中断,把display函数放在新的定时器中断里面。
除了引脚控制不一样外,其它的都差不多
改成下面的就可以了,但是这样肯定会占用单片机很多资源的。
- display();
- if(key1==0)
- {
- delay(50);
- if(key1==0)
- {
- TR0=0;
- while(!key1)
- {
- display();
- }
- }
- }
是的,上面我说的两个方法,你可以尝试下,用标志位也可以。