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 */

  }
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐