当前位置:网站首页>基于HAL库的按键(KEY)库函数
基于HAL库的按键(KEY)库函数
2022-06-30 10:20:00 【Coder_Ja】
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***********/
边栏推荐
- Skill sorting [email protected]+adxl345+ Motor vibration + serial port output
- go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
- Pytorch notes: validation, model eval V.S torch. no_ grad
- Collectors.toMap应用
- & and - > priority
- 电化学氧气传感器寿命、工作原理及应用介绍
- June training (day 30) - topology sorting
- 05_ Node JS file management module FS
- 历史上的今天:微软收购 PowerPoint 开发商;SGI 和 MIPS 合并
- [STL source code analysis] iterator
猜你喜欢

Dow Jones Industrial Average

CVPR 2022 | 清华&字节&京东提出BrT:用于视觉和点云3D目标检测的桥接Transformer

GeoffreyHinton:我的五十年深度学习生涯与研究心法

Viewing technological changes through Huawei Corps (V): smart Park

Matplotlib notes: contour & Contour

Mysql database foundation: constraint and identification columns

数学知识复习:第二型曲线积分

Qt之实现动效导航栏

mysql数据库基础:视图、变量

7 大轻量易用的工具,给开发者减压提效,助力企业敏捷上云 | Techo Day 精彩回顾...
随机推荐
Memory escape analysis
苹果高管公然“开怼”:三星抄袭 iPhone,只加了个大屏
The latest SCI impact factor release: the highest score of domestic journals is 46! Netizen: I understand if
Criu enables hot migration
数据库什么时候需要使用索引【杭州多测师】【杭州多测师_王sir】
Gd32 RT thread flash driver function
时间复杂度与空间复杂度
TypeScript–es5中的类,继承,静态方法
【Rust每周一库】num-bigint - 大整数
ArcGIS Pro scripting tool (5) - delete duplicates after sorting
ArrayList与顺序表
断路器HystrixCircuitBreaker
超长干货 | Kubernetes命名空间详解
MySQL导出sql脚本文件
R语言aov函数进行重复测量方差分析(Repeated measures ANOVA、其中一个组内因素和一个组间因素)、分别使用interaction.plot函数和boxplot对交互作用进行可视化
About Library (function library), dynamic library and static library
Viewing technological changes through Huawei Corps (V): smart Park
List介绍
电化学氧气传感器寿命、工作原理及应用介绍
Dow Jones Industrial Average