• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

[51单片机] 数码管数字加减

七月在野 2017-03-21 浏览量:1108
就是个位的变化总是跳跃的,比如按一次键,个位就从1跳到6,没有规律;其他三位正常;
请问应该怎么调呢?
/* 实验程序三
功能介绍:
数码管初始显示1234,并可由键盘对数字进行加减
*/
#include<reg52.h>
#define uint unsigned int 
#define uchar unsigned char
sbit key1=P2^0;
sbit key2=P2^1;
sbit wela1=P3^4;
sbit wela2=P3^5;
sbit wela3=P3^6;
sbit wela4=P3^7;
uint aa=1234;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar ge,shi,bai,qian;
void delay(uint num)
{
uint i,j;
for(i=num;i>0;i--)
for(j=110;j>0;j--); 
}

void display( ) //按键显示函数
{ 		
		wela1=0;            //打开位选
		P0=table[qian];
		delay(5);				 //延时
		wela1=1;					//关闭位选
		P0=0x00;
		wela2=0;
		P0=table[bai];
		delay(5); 
		wela2=1;
		P0=0x00;
		wela3=0;
		P0=table[shi];
		delay(5);
		wela3=1;
		P0=0x00; 			 //消影
		wela4=0;
		P0=table[ge];
		delay(5);
		wela4=1;
		P0=0x00;

}


void key_scanf()
{
if(key1==0)
{
delay(10);
if(key1==0)
{ 
	if(aa==0)
		aa=9999;			 //四位数,如果到了0,到最大
	 else aa--; 				//否则,减一
}

}
if(key2==0)
{
delay(10);
if(key2==0)
{
	if(aa==9999)
	aa=0;				 //四位数,如果到了最大,归零
	 else aa++;			 //否则,加一	
}
}
}
void main()
{
	while(1)
	{ 
	qian=aa/1000;
	bai=aa%1000/100;
	shi=aa%1000%100/10;
	ge=aa%1000%100%10;	 	
	key_scanf();		//调用按键函数
	display();				//显示	
}

}
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 个人认为问题出在你的延时上,delay(10)最多按1200个指令周期计算,即使你是51的单片机12T的,用12mhz的晶振的话,delay(10)才1.2ms,这个时间过于短,起不到消抖的作用,因为你按一下按键怎么也得300ms左右吧,你的key_scanf就工作了不知道多少次,也就造成了每次不一定蹦几个数的现象,有一个办法,

    int key_scanf(uint s)
    {

    if(s==1)

    {

        if(key1==1&&key==1)

            {

                delay(1000);

                if(key1==1&&key2==1)s=0;

            }

    }
    if(s==0&&key1==0)
    {
    delay(10);
    if(key1==0)
    {

    s=1;
     if(aa==0)
    aa=9999; //四位数,如果到了0,到最大
    else aa--; //否则,减一
    }

    }
    if(s==0&&key2==0)
    {
    delay(10);
    if(key2==0)
    {

    s=1;
     if(aa==9999)
    aa=0; //四位数,如果到了最大,归零
    else aa++; //否则,加一
    }
    }
    }if(key1==0)
    {
    delay(10);
    if(key1==0)
    {
    if(aa==0)
    aa=9999; //四位数,如果到了0,到最大
    else aa--; //否则,减一
    }
    return s;

    void main()
    {

    uint s=0;
     while(1)
    {
    qian=aa/1000;
    bai=aa%1000/100;
    shi=aa%1000%100/10;
    ge=aa%1000%100%10;
    s=key_scanf(s); //调用按键函数
    display(); //显示
    }

    }

    • 发布于 2017-03-21
    • 举报
    • 评论 0
    • 2
    • 0

其他答案 数量:5
  • 這問題出在您是想要按一次,加減一次,但因為只有判斷按下而沒有之後判斷鬆開,所以邏輯上會一直判斷為按下就一直加到6了

    因此更改如下


    void key_scanf()
    {
       if(key1==0)
       {
         delay(10);
         if(key1==0)
         { 
    	 if(aa==0)
    		 aa=9999;			 //四位数,如果到了0,到最大
    	 else aa--; 				//否则,减一
             while(key1==0); //判斷手鬆開,完成一次按下
         }
    
       }
       if(key2==0)
       {
         delay(10);
         if(key2==0)
         {
           if(aa==9999)
             aa=0;				 //四位数,如果到了最大,归零
           else aa++;			 //否则,加一	
           while(key2==0); //判斷手鬆開,完成一次按下
         }
       }
    }
    以上供參考
    • 发布于2017-03-22
    • 举报
    • 评论 0
    • 2
    • 0

  • 你的按键检测处理问题 会导致你按下后 计数一直在++ 然后 就会有数据乱跳了
    • 发布于2017-03-21
    • 举报
    • 评论 0
    • 1
    • 0

  • 你没有按键松开的检测,这样数值是一直在变化的,只不过是你不松开的话数值不显示,加上一个按键 松开检测,还有,如果死循环做按键松开检测,那么你的显示就用定时器,不然你不松开按键数码管是不会显示的!
    • 发布于2017-03-21
    • 举报
    • 评论 0
    • 1
    • 0

  • 按键未消抖或者是消抖的事件不够长,导致多次触发了中断
    • 发布于2017-03-21
    • 举报
    • 评论 0
    • 1
    • 0

  • 按键设置有问题,没有检测松手
    • 发布于2017-03-21
    • 举报
    • 评论 0
    • 1
    • 0

相关问题

问题达人换一批

[51单片机] 数码管数字加减