STM32移植三行代码按键消抖
三行代码只会检测边沿跳变,按下稳定后读取值为0。滴答定时器中断用于长按1ms计时。
·
STM32移植三行代码按键消抖
文章目录
一、参考文章
这个博主写的非常好:
https://blog.csdn.net/qq_43935020/article/details/114108489
二、代码
三行代码只会检测边沿跳变,按下稳定后读取值为0。key.c
#include "key.h"
#include "oled.h"
uint32_t key_time = 0;//放在滴答定时器里1ms计时
//按键扫描
uint8_t key_scan(void)
{
uint8_t key_val = 0;
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET)
{
key_val = 1;
}
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET)
{
key_val = 2;
}
if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin) == GPIO_PIN_RESET)
{
key_val = 3;
}
if(HAL_GPIO_ReadPin(KEY4_GPIO_Port,KEY4_Pin) == GPIO_PIN_RESET)
{
key_val = 4;
}
return key_val;
}
//按键处理
void key_proc(void)
{
static uint8_t key_val,key_up,key_down,key_old;
static uint32_t key_tick;
static uint8_t a = 0;
if((uwTick - key_tick) < 10)return;//用滴答定时器延时
key_tick = uwTick;
//三行代码消抖
key_val = key_scan();
key_down = key_val & (key_old ^ key_val); //下降沿检测
key_up = ~key_val & (key_old ^ key_val); //上升沿检测,key_val先取反再与
key_old = key_val; //下次检测
if(key_down == 1) //按键1动作处理,多个按键用switch
{
key_time = 0; //开始计时
}
if(key_up == 1) //松手
{
if(key_time < 1000)//短按,松手键和时间判断可以反过来
{
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
}
else if(key_time >= 1000) //长按
{
OLED_ShowNum(0,0,a++,3,16,1);
OLED_Refresh();
}
}
}
key.h
#ifndef __KEY_H
#define __KEY_H
#include "main.h"
uint8_t key_scan(void);
void key_proc(void);
#endif
SysTick_Handler
滴答定时器中断用于长按1ms计时
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
key_time++;
/* USER CODE END SysTick_IRQn 1 */
}
main.c
10ms扫描一次
while (1)
{
key_proc();
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
更多推荐



所有评论(0)