按键消抖

1.按键抖动

通常的按键所用开关为机械弹性开关,当机械触点断开  、闭合时,电压信号小型如下图。由于机械触点的弹性作用,  一个按键开关在闭合时不会马上稳定地接通,在断开时也不 会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的  抖动,如下图。抖动时间的长短由按键的机械特性决定,一般  为5ms~10ms。这是一个很重要的时间参数,在很多场合都要  用到。 

2.软件消抖

如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后  再一次检测键的状态,如果仍保持闭合状态电平,则确认为真  正有键按下。当检测到按键释放后,也要给5ms~10ms的延时  ,待后沿抖动消失后才能转入该键的处理程序

3.硬件消抖

 在键数较少时可用硬件方法消除键抖动。下图所示的RS触发器为常用的硬件去抖。

也可以加入RC滤波电路,进行消抖    

利用电容的放电延时,采用并联电容法,也可以实现硬件消抖:消抖电路如下:


 

 

 

### 按键原理 按键在机械结构中通常采用弹性触点设计,当按键被按下或释放时,由于触点的弹跳效应,会导致短时间内电压信号的不稳定。这种时间通常在5ms到10ms之间[^2]。如果不进行处理,单片机可能会误判多次按键动作,从而影响系统的正常运行。 为了除这种动,需要采取一定的措施来稳定信号,这便是按键的原理。的核心目标是在按键闭合或断开时确保读取到稳定的信号状态,以避免误触发[^3]。 ### 硬件实现方法 硬件是通过外部电路按键动的一种方式,适用于按键数量较少的情况。常见的硬件方法包括使用RC(电阻-电容)滤波电路和施密特触发器: - **RC滤波电路**:通过在按键两端并联一个电容,并串联一个电阻,可以利用电容的充放电特性来平滑电压波动,从而抑制动。这种方法简单有效,但会增加电路复杂度。 - **施密特触发器**:施密特触发器具有滞回特性,能够将不规则的输入信号转换为清晰的高低电平输出,非常适合用于按键信号的整形[^2]。 ### 软件实现方法 软件是目前应用最广泛的方法,尤其是在按键较多的情况下。其基本思想是通过延时检测来避开动期,从而获取稳定的按键状态。具体实现如下: - **延时检测法**:当检测到按键状态发生变化时,先等待一段时间(通常为5~10ms),待动结束后再次检测按键状态。如果两次检测结果一致,则认为按键状态已稳定。这种方法虽然实现简单,但在高实时性要求的场合可能不够理想[^1]。 - **连续采样法**:在一定时间内对按键状态进行多次采样,若连续多次采样结果相同,则确认按键状态。例如,在20ms内每隔2ms采样一次,若其中有至少10次检测到按键按下,则认为按键确实被按下。这种方法提高了检测的可靠性[^3]。 ### 示例代码 以下是一个简单的软件实现示例,使用延时检测法: ```c #include "stm32f10x.h" // Device header #define KEY_PORT GPIOA #define KEY_PIN GPIO_PIN_0 void Delay_ms(uint32_t ms) { // 延时函数实现 } uint8_t Read_Key(void) { static uint8_t key_state = 0; if (GPIO_ReadInputDataBit(KEY_PORT, KEY_PIN) == 0) { // 检测按键是否按下 Delay_ms(10); // 延时10ms if (GPIO_ReadInputDataBit(KEY_PORT, KEY_PIN) == 0) { while (GPIO_ReadInputDataBit(KEY_PORT, KEY_PIN) == 0); // 等待按键释放 return 1; // 返回按键按下标志 } } return 0; // 未检测到按键按下 } int main(void) { // 初始化GPIO和其他外设 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = KEY_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(KEY_PORT, &GPIO_InitStructure); while (1) { if (Read_Key() == 1) { // 执行按键处理逻辑 } } } ``` ### 总结 无论是硬件还是软件,目的都是为了确保按键信号的稳定性。硬件适合按键数量少且对响应速度要求较高的场合,而软件则更适合按键数量多、系统资源相对充裕的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值