51--独立按键

目录

颤抖原因

进行消抖

软件消抖

按键延时

状态机转换

硬件消抖


颤抖原因

        按键是一种电子开关,使用时按下开关按钮就可以接通,同样的松开就是断开连接。

 独立开关样例

        由于机械点的弹性作用,这种开关按下或松开不会马上的接通与断开,而是会在一瞬间发生一连串的颤抖。颤抖时间如下图:

        由图可见按键颤抖时间一般在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

        这种状态机的操作原理就是满足某种状态而实行某种操作,举个例子来说就是当按键的状态处于按下的状态,那么进入第二重检测,判断是否继续按下,满足条件则返回按键按下状态,这就就状态机。原理很是和它名字一样,依旧状态来判断。

硬件消抖

        按键的硬件消抖可以是这样的,硬件消抖的原理是在信号输入系统之前消除抖动干扰,在按键较少的情况下比较适宜。 如果按键较多,则使用软件消抖。 软件消抖的实质在于降低键盘输入端口的采样频率,将高频抖动略去。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值