盛世游戏网

盛世游戏网

按键如何软件消抖

59

按键消抖是嵌入式系统中常见的问题,主要是由于机械开关的弹性作用导致的状态不稳定。消抖的方法可以分为硬件消抖和软件消抖两种。下面将详细介绍软件消抖的原理和实现方法。

软件消抖的原理

软件消抖的基本思想是在检测到按键状态变化后,不立即认定按键被按下或释放,而是延时一段时间(通常是几十毫秒)后再次检测按键状态。如果在这段延时时间内按键状态没有发生变化,那么就认为之前的操作是有效的。这种方法可以有效避免由于按键抖动导致的误操作。

软件消抖的实现方法

1. 延时消抖

最简单的消抖方法是使用延时函数。当检测到按键状态变化后,先等待一个固定的延时时间(如10ms),然后再次检测按键状态。如果按键状态仍然与之前相同,则认为按键已经稳定按下。这种方法实现简单,但可能会增加系统的响应延迟。

```c

include "reg52.h"

typedef unsigned int uint;

typedef unsigned char uchar;

sbit k1 = P3^1; // 定义P31口是k1

sbit led = P2^0; // 定义P20口是led

void delay(uchar i) {

while (i--);

}

void keypros() {

if (k1 == 0) { // 检测按键K1是否按下

delay(1000); // 消除抖动,一般大约10ms

if (k1 == 0) { // 再次判断按键是否按下

led = ~led; // led状态取反

}

while (!k1); // 检测按键是否松开

delay(1000); // 再次消除抖动

while (!k1); // 再次检测按键是否松开

}

}

void main() {

while (1) {

keypros(); // 按键处理函数

}

}

```

2. 状态机消抖

通过状态机的方式实现按键扫描,可以更加优雅地处理按键状态变化。首先在定时器中断中检测按键状态,然后根据状态机的逻辑进行处理。这种方法可以避免轮询带来的系统负荷,提高系统的实时性。

```c

include "stm32cube.h"

TIM_HandleTypeDef htim3;

void TIM3_IRQHandler(void) {

// 按键状态处理代码

}

int main(void) {

// 初始化TIM3

htim3.Instance = TIM3;

htim3.Init.Prescaler = 8333;

htim3.Init.CounterMode = TIM_COUNTERMODE_UP;

htim3.Init.Period = 999;

HAL_TIM_Base_Init(&htim3);

HAL_TIM_Base_Start_IT(&htim3);

// 配置PB15为GPIO输入,上拉模式

__HAL_RCC_GPIOB_CLK_ENABLE();

__HAL_RCC_GPIOB_PIN_RESET(GPIOB_PIN_15);

GPIOB->DIR &= ~GPIO_PIN_15;

GPIOB->ODR |= GPIO_PIN_15;

HAL_GPIO_EXTI_Init(&GPIOB_EXTI_Line15, EXTI_LINE_IT_RISING);

// 开启TIM3全局中断

HAL_NVIC_EnableIRQ(TIM3_IRQn);

while (1) {

// 主循环

}

}

```

3. 中断消抖

通过外部中断的方式检测按键状态变化,然后在主程序中根据中断标志位进行按键处理。这种方法可以实时响应按键事件,但需要合理设置中断优先级和延时时间。