基于HAL库的按键(KEY)库函数

key.c

/**
  ********************************************************************************
  * @file      key.c
  * @brief     按键操作源文件
  * @author    Jia Yasen
  * @date      2022-6-20
  * @version   V0.0.1
  * @copyright @Etherealize
  ********************************************************************************
  */
/*-----------------------------Includes---------------------------------------*/
#include "key.h"
/*-----------------------------Function---------------------------------------*/

/**
  * @brief      按键扫描(持续触发)
  * @param[in]  None
  * @return     uint8_t 对应按键值
  * @retval     0       默认值,无操作
  *             1       KEY0对应值,表示KEY0按下,可在循环中查询是否为1来进行对应操作
  *             2       KEY1对应值
  * @details    持续触发,则确认按下后的那部分会在按下的时间里执行很多次,因为按下
  *             的时间有零点几秒,但是程序每几毫秒循环一次。所以在按下的时间里会执行多次
  */
uint8_t KEY_Scan1(void)
{
  if(KEY0 == KEY_ON || KEY1 == KEY_ON)
  {
    HAL_Delay(10);//延时10-20ms,软件消抖
    if(KEY0 == KEY_ON) 
    {
      return KEY0_PRES;//此处的操作会多次执行
    }
    else if(KEY1 == KEY_ON) 
    {
      return KEY1_PRES;//此处的操作会多次执行
    }
    //一般是按下触发事件,松开返回正常状态,不触发
    else 
      return 0;
  }
  return 0;//没有按下默认返回0
}

/**
  * @brief      按键扫描(单次触发)
  * @param[in]  None
  * @return     uint8_t 对应按键值
  * @retval     0       默认值,无操作
  *             1       KEY0对应值,表示KEY0按下,可在循环中查询是否为1来进行对应操作
  *             2       KEY1对应值
  * @details    单次触发:用key_up作为制约,按下后只会触发一次操作,直到松开才会使下一次按下发挥作用
  */
uint8_t KEY_Scan2(void)
{
  //静态变量存储在静态存储区,只会在程序一开始的时候初始化一次,将局部变量静态化可以使变量独立于函数,而不是每次调用函数时重新初始化一次
  static uint8_t key_up = 1; //按键松开标志
  //用key_up作为约束,在第一次检测到按键按下并执行操作之后key_up变为0,在持续按住按键的之后几次扫描中都不会触发
  if(key_up && (KEY0 == KEY_ON || KEY1 == KEY_ON))
  {
    HAL_Delay(10);
    key_up = 0;
    if(KEY0 == KEY_ON)
    {
      return KEY0_PRES;//
    }
    else if(KEY1 == KEY_ON)
    {
      return KEY1_PRES;//操作只会触发一次
    }
    else
      return 0;
  }
  else if(KEY0 == KEY_OFF && KEY1 == KEY_OFF) key_up = 1;//按键松开时key_up重置,下次再按下才会触发
  return 0;
}

/**
  * @brief      按键扫描
  * @param[in]  mode 模式转换. 0:单次触发 1:持续触发
  * @return     uint8_t 对应按键值
  * @retval     0       默认值,无操作
  *             1       KEY0对应值,表示KEY0按下,可在循环中查询是否为1来进行对应操作
  *             2       KEY1对应值
  * @details    若持续触发,则确认按下后的那部分会在按下的时间里执行很多次,因为按下
  *             的时间有零点几秒,但是程序每几毫秒循环一次,所以在按下的时间里会执行多次.
  *             若单次触发:用key_up作为制约,按下后只会触发一次操作,直到松开才会
  *             使下一次按下发挥作用.
  */
uint8_t KEY_Scan(uint8_t mode)
{
  static uint8_t key_up = 1; //按键松开标志
  if(mode) key_up = 1; //mode为1时,每次扫描都会重置key_up,操作就可以不断触发,持续触发
  if(key_up == 1 && (KEY0 == KEY_ON || KEY1 == KEY_ON))
  {
    HAL_Delay(10); // 软件消抖
    key_up = 0;
    if(KEY0 == KEY_ON)
    {
      return KEY0_PRES;
    }
    else if(KEY1 == KEY_ON)
    {
      return KEY1_PRES;
    }
    else
      return 0;
  }
  else if(KEY0 == KEY_OFF && KEY1 == KEY_OFF) key_up = 1;//松开则刷新key_up
  return 0;
}
 
/************************ (C) COPYRIGHT Etherealize*****END OF FILE***********/

key.h

/**
  ********************************************************************************
  * @file      key.h
  * @brief     按键操作头文件
  * @author    Jia Yasen
  * @date      2022-6-20
  * @version   V0.0.1
  * @copyright @Etherealize
  ********************************************************************************
  * @attention 1.本文件的函数均基于HAL库,按键KEY的初始化基于GPIO的初始化,GPIO对应引脚
  *            初始化为输入模式即可
  *            2.由于不同板子的对应引脚不同,使用前需先对照原理图修改KEY对应的引脚
  ********************************************************************************
  */
#ifndef __KEY_H__
#define __KEY_H__
/*-----------------------------Includes---------------------------------------*/
//根据使用的芯片型号进行修改
#include "stm32f1xx_hal.h" 
/*-----------------------------Define-----------------------------------------*/
//将KEYx定义为对应引脚的读取值
#define KEY0 HAL_GPIO_ReadPin(GPIOx,GPIO_PIN_x)
#define KEY1 HAL_GPIO_ReadPin(GPIOx,GPIO_PIN_x)
//给不同的KEY设定不同的对应数字,表示对应KEY按下;也表示不同的优先级,数字越小优先级越高;不用0,因为0是函数的默认返回值
#define KEY0_PRES 1
#define KEY1_PRES 2
//KEY_ON表示按键按下,KEY_OFF表示按键松开;使用前先根据原理图修改对应关系
#define KEY_ON GPIO_PIN_RESET
#define KEY_OFF GPIO_PIN_SET
/*-----------------------------Function---------------------------------------*/
uint8_t KEY_Scan1(void);
uint8_t KEY_Scan2(void);
uint8_t KEY_Scan(uint8_t mode);

#endif
/************************ (C) COPYRIGHT Etherealize*****END OF FILE***********/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lupinjia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值