VtorKey-轻量级短长按单多击组合动作按键模块
VtorKey
VtorKey-轻量级短长按单多击组合动作按键模块
作者邮箱:vtor3478@qq.com
开发时间:2023年07月03日(周一)
相关网址:
https://www.bilibili.com/video/BV1sm4y1Y78Q
https://gitee.com/vtor3478/ElecModule
https://gitee.com/vtor3478/ElecModule/tree/main/VtorKey
00-前言
本设计(包括但不限于图片,文字,视频,代码风格,以下省去括号)
将发布于博客园,b站,吾爱论坛,开源中国,伪钞杂货铺微信公众号,影子论坛等
本设计为 伪钞 本人创作,转载请注明出处
本设计能提供单击,长按,以及长短按组合的按键反馈
本设计适用于gpio资源少,且需要较多用户操作的情况
本设计截止至目前(20230703)仅支持轮询,以后有机会再开发中断模式
理解(并使用)本设计,需要你有一点数据结构基础,
有一定的c语言与单片机基础
有较为扎实的状态机基础,
本设计是我基于原有的基础工程《diaan》进行设计,
其中包含许多其他知识,如果我没有提及,那说明与VtorKey无关
软件环境:stm32cubeide 1.12.0
硬件环境:stm32f103rct6
名词解释:
curState:当前状态,记录长按,短按,弹起,消抖等状态
lastState:用于弹起时,区分刚刚是长按还是短按
holdTime:持续时间,用于区分短按还是长按,区分短弹起还是长弹起
01-分析按键状态
一个按键,从按下到弹起,会经历哪些情况
电平情况: 弹起时的电平 按下后的电平
状态可分: 弹起 按消 按下 弹消
按下时长: 短按 长按 短弹 长弹
02-单击长短按
如果curState为《按下》,如果holdTime小于《长按值》认定为《短按》并记录
如果holdTime大于《长按值》认定为《长按》并记录
当lastState与curState将要不同时,使用lastState记录curState,然后更curState
03-消抖环节
消抖的判断代码在长短按判断之前,只是文章介绍访问长短按之后
为了防止在触发长按的过程中触发短按,所以需要用用弹起状态作为一个单击动作的结束
当curState为《弹起》,由于,根据lastState是短按,还是长按,就可以使用对应的返回值
04-组合动作
上一次弹起与下一次按下的时间足够小,认为是组合动作
如果要记录组合动作,需要一个组合内 动作与动作之间《分隔符》
按习惯来说,用《短弹》作为《分隔符》比较合适
如果要记录组合动作,需要一个结束组合动作结束的《结束符》
按习惯来说,用《长弹》作为《结束符》比较合适
因为要等待《结束符》所以响应速度比较慢
当用户快速短按2下,并等待一段时间
其中两次短击之间间隔一般小于500ms,所以我使用500作为《长弹》的比较值
~~~~~无限长时间~~~~~~~按下~500ms~弹起~~~200ms~~~按下~~50ms~~弹起~~~~~~无限长时间~~~~~
此动作可认为《短短按》,值为《11》
05-PeekCombine
为防止重复操作,为防止用户直接修改,为防止其他意外情况
所以使用KEY_PeekCombine获取组合动作,
只有在组合动作结束后才会返回有效值,
且函数内会清空组合动作,防止反复获取
06-PeekAction
只提供按下动作 和 弹起动作
为简单环境提供按操作
不是重点,略过,有兴趣请自行学习
07-移植与使用流程
0701-反绑定
因为本设计反绑定了project.h
所以用户需要先创建project.h文件,以确保成功编译
0702-时间设置
搜索VTOR_KEY_TIME_CONFIG_BY_USERSELF
在project.h中定义,并定义好时间和电平宏
0703-KEY_GetLevel函数
用户只需要提供读取key的io电平(vtor_key_user_project.c文件)
本设计使用了HAL_GPIO_ReadPin直接读取io
0704-KEY_Init函数
初始化好vtorKeyHeader即可
0705-KEY_Scan函数
定时循环调用即可
0706-KEY_PeekCombine函数
根据返回值进行判断即可