微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机显示问题,求帮忙看下哪里有问题。

51单片机显示问题,求帮忙看下哪里有问题。

时间:10-02 整理:3721RD 点击:
题目:数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)。在以上基础上,用另外三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始。
问题:我按下启动或者暂停的时候一直按着,只有个位显示,松开正常,怎么按着让他显示暂停的个十百都显示?
#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函数放在新的定时器中断里面。

除了引脚控制不一样外,其它的都差不多

改成下面的就可以了,但是这样肯定会占用单片机很多资源的。

  1. display();
  2.     if(key1==0)
  3.     {
  4.      delay(50);
  5.      if(key1==0)
  6.      {
  7.       TR0=0;
  8.       while(!key1)
  9.       {
  10.            display();
  11.       }
  12.      }

  13.     }

复制代码

是的,上面我说的两个方法,你可以尝试下,用标志位也可以。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top