轻量级按键动作识别模块(C语言)
1、前言
继嵌入式(单片机)裸机 C 语言开发 + 按键扫描(模块分层/非阻塞式)文章后,原来的按键识别基本能满足大部分需求,但是对于双击和多击等多样化的功能需求并不能满足,因此对整个按键动作识别模块进行了架构调整,此次调整后接口使用更加便捷。
2、介绍
重构后的按键动作识别模块特点:
- 移植方便,只需要实现硬件 IO 初始化和 IO 状态读取即可
- 支持多种按键(有些按键不一定是一个 IO 对应按键, 如矩形按键、红外远程遥控按键等)的输入
- 丰富的接口实现,通过这些接口能及时处理按键操作,同时可以实现单击、双击、多击、短按和长按等多种要求的功能
- 代码量少,且代码注释丰富,风格统一,便于阅读和使用
相对于之前的实现方式有以下变化:
- 移除每个按键的配置信息设置,简化代码
- 移除按键异步读取(读取之前保存起来各个状态,读取时依次i返回)的功能
- 移除多个按键状态的变化,只留下三种状态:无按下、按下和松开
- 增加获取按键按下和松开的时间获取、按键一定时间内的触发次数,根据上述三种状态可实现单击、双击、多击、短按和长按等多种要求的功能
整体来说,使得按键动作识别的各种要求更快速的实现。
3、示例代码
源文件部分代码:
/**
* @brief 获取按键单击次数
*
* @note 调用该函数时不能有关于按键动作的限制条件
* @param[in] eKey 指定按键, 取值为 @reg IoKeyType_e
* @param[in] time 每次单击的间隔时间
* @retval 单击次数.
*/
uint8_t KEY_GetClickCnt(IoKeyType_e eKey, uint16_t time)
{
if (eKey >= IO_KEY_MAX_NUM)
{
return 0;
}
/* 连续单击后等间隔时间再进行回调通知, 目的在松开按键后再次触发得到单击次数 */
if (sg_tKeyManage[eKey].eKeyAction == KEY_ACTION_LOSSEN)
{
sg_tKeyManage[eKey].refreshNotifyTic = time;
}
if (sg_tKeyManage[eKey].eKeyActionBak != KEY_ACTION_PRESS && sg_tKeyManage[eKey].eKeyAction == KEY_ACTION_PRESS)
{
sg_tKeyManage[eKey].refreshNotifyTic = 0;
if (sg_tKeyManage[eKey].clickCnt < 0xFF)
{
sg_tKeyManage[eKey].clickCnt++;
}
}
if (sg_tKeyManage[eKey].eKeyAction == KEY_ACTION_NO_PRESS && sg_tKeyManage[eKey].uiLossenTic >= time)
{
uint8_t cnt = sg_tKeyManage[eKey].clickCnt;
sg_tKeyManage[eKey].clickCnt = 0;
return cnt;
}
return 0;
}
头文件部分代码:
/* Exported types ----------------------------------------------------------------------------------------------------*/
typedef enum
{
KEY_ACTION_NO_PRESS = 0, /*!< 没有按下 */
KEY_ACTION_PRESS, /*!< 持续按下 */
KEY_ACTION_LOSSEN /*!< 按下松开 */
} KeyAction_e;
typedef void (*KeyFunCB)(IoKeyType_e, KeyAction_e);
/* Exported constants ------------------------------------------------------------------------------------------------*/
/* Exported macro ----------------------------------------------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------------------------------------------------*/
extern void KEY_Init(void);
extern void KEY_Register(IoKeyType_e eKey, KeyFunCB pfnKeyFun);
extern void KEY_UnRegister(IoKeyType_e eKey);
extern void KEY_SetNotifyTime(IoKeyType_e eKey, uint16_t time);
extern uint8_t KEY_GetClickCnt(IoKeyType_e eKey, uint16_t time);
extern uint16_t KEY_GetPressTime(IoKeyType_e eKey);
extern uint16_t KEY_GetLossenTime(IoKeyType_e eKey);
extern void KEY_Scan(uint16_t cycleTime);
4、代码获取
下载链接点击:MCU 按键动作识别模块
轻量级按键动作识别模块(C语言)的更多相关文章
- 基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)
本文转载,其来源在参考中:1,稍加修改,因为近期使用到这个模块,故而加以整理! 1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 基于STM32单片机光学指纹识别模块(FPM10A)全教 ...
- AVR单片机教程——按键动作
上一篇教程中我们学习了如何读取按键状态.而按键的动作,比如单击,至少需要两个状态才能判定,长按.双击的判定更加复杂.今天我们来学习如何使用库函数判断按键单击,以及其实现原理. 我们要实现的是:当一个按 ...
- RGBD动作识别的多视图层融合模型
摘要 基于视觉的动作识别在实践中遇到了不同的挑战,包括从任何角度识别主题,实时处理数据以及在现实环境中提供隐私.甚至识别基于配置文件的人类动作(基于视觉的动作识别的一个子集),在计算机视觉中也是一个巨 ...
- 微软手写识别模块sdk及delphi接口例子
http://download.csdn.net/download/coolstar1204/2008061 微软手写识别模块sdk及delphi接口例子
- Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读
Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读 Action4D: Online Action Recognition in the Crowd and Clutter 论文链接 ...
- opencv实现人脸识别(五) 运用tkinter进行GUI绘制 整合人脸识别模块
因为之前学习过tkinter库,所以在学习了人脸识别模块的编写后, 打算绘制一个简单的GUI来应用人脸识别功能. 主界面如下所示: 签到打开在点开后直接进行人脸识别,如果成功则自动关闭视频窗口. 录入 ...
- Quirc二维码识别模块
背景 师兄要用这个参加集赛,但是说自己C语言不太行,花了一个多小时帮他分析了一下(虽然自己也不太行). 对应模块的GitHub地址:https://github.com/dlbeer/quirc. 记 ...
- python中的future,你见过可以使用未来版本模块的语言吗?
import xxx from yy.xxx import xx from yy.xxx import xx as x python最常见的导包导模块语句 yy为包名,包就是文件夹,模块就是xxx.p ...
- pycharm导入自己写的包的时候,不能识别模块的解决办法
今天用写selenium脚本的时候导入自己统计目录下的模块时,出错,明明存在但是报错说模块不存在,找了半天终于找到解决方案,顺便记录一下吧 pycharm不会将当前文件目录自动加入自己的sourse_ ...
- opencv实现人脸识别(四) 人脸识别模块
到这一步就是进行人脸识别了. 流程图: 代码: import cv2 def recognize(cam): recognizer = cv2.face.LBPHFaceRecognizer_crea ...
随机推荐
- 如何使用chatgpt编写代码
功能列举 回答编程问题 我想让你充当 Stackoverflow 的帖子.我将提出与编程有关的问题,你将回答答案是什么.我希望你只回答给定的答案,在没有足够的细节时写出解释.当我需要用英语告诉你一些事 ...
- zznu 1632
表达式求值 递归求解~~ #include<cstdio> #include<cstring> #include<cstdlib> #include<cmat ...
- 解决pyintstaller 打包后程序报错 api-ms-win-core-path-l1-1-0.dll文件
一.错误现象 1.api-ms-win-core-path-l1-1-0.dll错误日志如下: 2.重新打包查看有如下的警告信息: 二.解决方案: 1.网上下载:api-ms-win-core-pat ...
- GoLang 指针初探
1. 内置类型和引用类型 Go 中内置类型包括数值类型,字符串类型和布尔类型.引用类型包括切片,映射,通道,接口和函数类型.其中,引用类型表示创建的变量包含一个指向底层数据结构的指针和一组管理底层数据 ...
- springboot启动流程 (1) 流程概览
本文将通过阅读源码方式分析SpringBoot应用的启动流程,不涉及Spring启动部分(有相应的文章介绍). 本文不会对各个流程做展开分析,后续会有文章介绍详细流程. SpringApplicati ...
- Nginx IP地址较少时如何合理分配后端服务资源
Nginx IP地址较少时如何合理分配后端服务资源 背景 客户系统很多时候会通过网闸或者是VPN登录到产品内 此时的IP地址一般是相同的. 这种情况下较难实现根据ip地址使用ip_hash的方式将压力 ...
- [转帖]VMWare ESXi中,不同的虚拟网卡性能竟然能相差三倍!
https://zhuanlan.zhihu.com/p/525656364 正文共:1024 字 11 图,预估阅读时间:1 分钟 在上个实验中(VPP使用DPDK纳管主机网卡),我们已经初步实现了 ...
- [转帖]python库Paramiko
https://zhuanlan.zhihu.com/p/456447145 测试过程中经常会遇到需要将本地的文件上传到远程服务器上,或者需要将服务器上的文件拉到本地进行操作,以前安静经常会用到xft ...
- [转帖]linux 调优各项监控指标小记
https://z.itpub.net/article/detail/8A4E4E96522BD59D45AB5A4CA442EDB3 自开始负责生产环境部署,中间遇到了若干线上环境内存以及CPU的问 ...
- [转帖] Linux命令拾遗-文本处理篇
https://www.cnblogs.com/codelogs/p/16060413.html 简介# 这是Linux命令拾遗系列的第二篇,本篇主要介绍Linux中与文本处理相关的命令,如xargs ...