stm32一个按键消抖的新思路

本文介绍了如何通过声明计数变量cnt和中断标志位flag来检测按键输入,利用中断机制实时检测按键并消除重复触发,避免HAL_delay带来的阻塞,提升程序响应效率,同时可用于时间片轮询等任务设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

申明计数变量 cnt和 计数标志位 flag

按下按键后 触发中断 flag 

注意:在syshandler里面 判断flag是否为高 若为高 说明启动了按键开始计数

cnt 每一毫秒就加1

在循环 或者其他任务循环中可以判断cnt是否为15 15ms之后肯定cnt达到15 这时候再判断 key的值是否还是低 就判断出来了key是否按下了 这样做的消抖 我认为优点是不用等待传统的HAL_delay 带来的阻塞问题 因为syshandler是肯定要执行的 不如利用这个 来进行一些改进 甚至还可以利用这个中断来进行时间片的轮询任务等等都是值得学习的

### STM32 按键实现方法 在STM32单片机中,按键可以通过软件延时或硬件滤波来实现。这里主要介绍基于软件延时的按键方法。 #### 软件延时法 当检测到按键状态变化时,程序会等待一段时间(通常为10ms至50ms),再重新读取按键的状态以确认是否真的发生了按压或释放事件。这种方法简单易行,在大多数情况下可以有效去除动影响[^3]。 下面是一个简单的C语言代码示例用于说明如何通过软件延迟来进行按键: ```c #include "stm32f1xx_hal.h" #define BUTTON_PIN GPIO_PIN_0 #define BUTTON_PORT GPIOA #define LED_PIN GPIO_PIN_5 #define LED_PORT GPIOB void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); uint8_t lastButtonState = RESET; uint8_t currentButtonState; while (1) { // 获取当前按钮状态 currentButtonState = HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN); if ((lastButtonState == RESET && currentButtonState == SET)) { // 如果上一次是未按下而现在变为已按下,则进入此分支 // 延迟一段固定时间让电平稳定下来 HAL_Delay(20); // 再次检查按钮状态 if(HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN)){ // 若此时仍然处于按下状态则视为有效的按键操作 // 切换LED灯亮灭 HAL_GPIO_TogglePin(LED_PORT, LED_PIN); } } // 更新上次记录下来的按钮状态 lastButtonState = currentButtonState; // 添加适当循环间隔防止CPU占用过高 HAL_Delay(10); } } // 初始化GPIO配置部分省略... ``` 上述代码展示了基本思路:先获取并保存前一刻的按键状态;之后不断轮询新的按键状态并与之前存储的结果对比;一旦发现有从无到有的转变就启动短暂休眠以便跳过可能存在的波动期;最后再次验证最终结果确实改变才执行相应指令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值