目录
颤抖原因
按键是一种电子开关,使用时按下开关按钮就可以接通,同样的松开就是断开连接。
独立开关样例
由于机械点的弹性作用,这种开关按下或松开不会马上的接通与断开,而是会在一瞬间发生一连串的颤抖。颤抖时间如下图:
由图可见按键颤抖时间一般在5ms~10ms之间。
进行消抖
针对按键消抖这一操作,我们可以从两个方面入手-------软件消抖和硬件消抖。
软件消抖
软件消抖就有很多办法了,最为直接的就是 按键延时,状态机转换 等待了,操作如下:
按键延时
//这里的按键是依据自己板子定义的,所以大家注意修改
sbit Key1=P3^1;
sbit Key2=P3^0;
sbit Key3=P3^2;
sbit Key4=P3^3;
unsigned char KeyNum;
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
unsigned char Key()
{
//如果按键1按下,那么等待20ms,直到按键松开才进行下一个延迟20ms,KeyNum就赋值为1;
if(Key1==0) {Delay(20);while(Key1==0);Delay(20);KeyNum=1;}
//否则 如果 按键2按下,那么等待20ms,直到按键松开才进行下一个延迟20ms,KeyNum就赋值为2;
else if(Key2==0) {Delay(20);while(Key2==0);Delay(20);KeyNum=2;}
//同上
else if(Key3==0) {Delay(20);while(Key3==0);Delay(20);KeyNum=3;}
//同上
else if(Key4==0) {Delay(20);while(Key4==0);Delay(20);KeyNum=4;}
//最后没有上述匹配的话,那就给KenNum赋值为0,
else KeyNum=0;
return KeyNum;
}
这里Delay(20)是为了不受按键颤抖的影响,想像一下,按键在这5~10ms时间内一下高电平一下低电平,那么信号就会受到干扰,从而使得机器工作不稳定。为了消除这一干扰,我们就在这时候进行延时操作,让芯片在这5~10ms内啥都不干,在那等着,这就就最为简单的按键延时消抖。
状态机转换
#define KEY P3
#define key_state_0 0 //判断按键是否按下
#define key_state_1 1 //判断按键是否抖动
#define key_state_2 2 //判断按键是否释放
状态机消抖
unsigned char scan_key()
{
static char key_state=0;//状态值
unsigned char key_return=0;//返回值
unsigned char key_press;//键值
key_press=KEY&0x0f;//屏蔽高四位
switch (key_state)
{
case key_state_0:
if (key_press!=0x0f)
key_state=key_state_1;
break;
case key_state_1:
if (key_press!=0x0f)
{
switch (key_press)
{
case 0x07:
key_return=4;break;//S4
case 0x0b:
key_return=5;break;//S5
case 0x0d:
key_return=6;break;//S6
case 0x0e:
key_return=7;break;//S7
}
key_state=key_state_2;
}
else
key_state=key_state_0;
break;
case key_state_2:
if (key_press==0x0f)
key_state=key_state_0;
break;
}
return key_return;
}
原文链接:https://blog.csdn.net/weixin_46043648/article/details/107441395
这种状态机的操作原理就是满足某种状态而实行某种操作,举个例子来说就是当按键的状态处于按下的状态,那么进入第二重检测,判断是否继续按下,满足条件则返回按键按下状态,这就就状态机。原理很是和它名字一样,依旧状态来判断。
硬件消抖
按键的硬件消抖可以是这样的,硬件消抖的原理是在信号输入系统之前消除抖动干扰,在按键较少的情况下比较适宜。 如果按键较多,则使用软件消抖。 软件消抖的实质在于降低键盘输入端口的采样频率,将高频抖动略去。