按键(KEY)库函数"/>
基于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;//操作只会触发一次}elsereturn 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;}elsereturn 0;}else if(KEY0 == KEY_OFF && KEY1 == KEY_OFF) key_up = 1;//松开则刷新key_upreturn 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***********/
更多推荐
基于HAL库的按键(KEY)库函数
发布评论