关于按键抖动现象

关于按键抖动现象

背景,在学习 51 单片机的时候,用按键控制 LED 灯的亮灭,按一次后亮灭会进行替换,当我写好程序以后,没有想到有时候按下去按键能够灵敏,有时候却不灵敏。所以为什么???

在电子设备中,按键是一种常见的输入设备,用于用户与设备之间的交互。然而,按键在被按下或释放时可能会出现"按键抖动"的现象,导致多次触发输入信号。
在这里插入图片描述

原理

按键抖动是什么?

  • 按键抖动:指的是在按下或释放按钮时,由于机械元件的特性,导致开关频繁打开和关闭,产生短暂的波动信号,这是按键抖动现象。

为什么会发生按键抖动?

  • 机械结构:按键通常由弹簧、金属片等物理部件组成,在按下和释放过程中,这些部件可能会受到机械振动或弹性反弹的影响,导致接触不稳定,从而产生抖动。

抖动信号对系统的影响

  • 误操作:按键抖动可能导致系统误认为出现多次按键操作,进而触发不必要的功能或指令。
  • 用户体验下降:频繁的按键抖动会影响用户体验,使得用户感到不便和困扰。

解决方法

硬件解决方案

  1. 消抖电路:添加消抖电路可以通过延迟、滤波等技术来消除按键抖动信号,确保只有有效的按键操作被识别。
  2. 优化按键结构:设计更稳定的按键结构,如增加减震垫、改进接触点设计等,减少机械振动对按键的影响。

软件解决方案

  1. 软件延时处理:在软件层面引入延时处理机制,通过设置合适的时间阈值来判断是否是有效的按键操作。
  2. 状态机设计:使用状态机设计模式,根据按键状态的变化进行状态转移,避免误认为抖动信号是有效操作。

综合方法

  1. 硬件与软件结合:结合硬件消抖电路和软件延时处理,可以更好地应对复杂的按键抖动情况,提高按键的稳定性和可靠性。
  2. 多重校验:对按键信号进行多重校验,例如检测连续触发次数、持续时间等,来确保准确识别有效按键操作。

初始代码:

#include <REGX52.H>
void main()
{
	int my_switch = 0;
	while(1)
	{
		if(P3_1 == 0){
			if(my_switch == 1)
				my_switch = 0;
			else my_switch = 1;
			if(my_switch == 1){
				P2_0 = 0;
			}else P2_0 = 1;
		}
	}
}

用软件消除按键抖动代码:

#include <REGX52.H>
#include <INTRINS.H>
void Delayxms(unsigned int x)		//@12.000MHz
{
	while(x)
	{
		unsigned char i, j;
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
		x--;
	}
}

void main()
{
	while(1){
		if(P3_1 == 0)
		{
			Delayxms(20); // 一般前 20ms 是抖动,消除按下按键的抖动,所以当检测到了按下,先延迟20ms
			while(P3_1 == 0); // 如果检测到一直是在按下,那么就停留在这里。
			Delayxms(20);// 消除松开按键的抖动
			P2_0 = ~P2_0; // 控制 LED 亮灭 
		}
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xwhking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值