数码管数字加减
请问应该怎么调呢?
- /* 实验程序三
- 功能介绍:
- 数码管初始显示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(); //显示
- }
-
- }
把这段程序替换效果更好,利用主循环计数消抖,不必延时等待。
void key_scanf()
{
static bit key1_sign=0,key2_sign=0; //静态-变量按键自锁标志
static uchar count1=0,count2=0; //静态-计数变量
if(key1==1) //检测按键1没有按下
{
key1_sign=0; //按键1自锁标志清0
count1=0; //消抖计数1清0
}
else //按键1按下
{
count1++; //消抖计数1自+1
if(count1>=100) //100次检测按键如果为0
{
if(key1_sign==0) //按键1自锁标志为0
{
count1=0; //消抖计数1清0
key1_sign=1; //按键1自锁标志置1
if(aa==0)
aa=9999; //四位数,如果到了0,到最大
else aa--; //否则,减一
}
}
}
if(key2==1) //检测按键2没有按下
{
key2_sign=0; //按键2自锁标志清0
count2=0; //消抖计数2清0
}
else //按键2按下
{
count2++; //消抖计数2自+1
if(count2>=100) //100次检测按键如果为0
{
if(key2_sign==0) //按键2自锁标志为0
{
count2=0; //消抖计数2清0
key2_sign=1; //按键2自锁标志置1
if(aa==9999)
aa=0; //四位数,如果到了最大,归零
else aa++; //否则,加一
}
}
}
}
按键电路有没有防抖动,你可以加一段小程序,这段程序模拟有按键,固定一个延时进行加减显示,先确定加减和显示部分有没有问题,如果没问题,那可能是按键没有防抖动了。
需要在按键扫描程序里加一个标志,否则按一次键被多次响应。并要增加按键抬起识别。
void key_scanf()
{
static bit key_sign=0; //静态位变量,按键标志
if(key1==0)
{
delay(10);
if(key1==0)
{
if(key_sign==0) //按键有效标志为0
{
key_sign=1; //按键有效标志置1
if(aa==0)
aa=9999; //四位数,如果到了0,到最大
else aa--; //否则,减一
}
}
}
else
{
key_sign=0; //按键有效标志清0
}
}
按键应该做个防抖 或者说叫按键时间判断 一定时间内的按键有效 短了 不要 长了 不要 这样才不会乱跳
谢谢大家的指导!
