VtorKey-轻量级短长按单多击组合动作按键模块
本帖最后由 vtor 于 2023-7-6 21:16 编辑VtorKey-轻量级短长按单多击组合动作按键模块
VtorKey-轻量级短长按单多击组合动作按键模块
开发时间:2023年07月03日(周一)
相关网址:https://www.bilibili.com/video/BV1sm4y1Y78Q
https://gitee.com/vtor3478/ElecModule
https://gitee.com/vtor3478/ElecModule/tree/main/VtorKey
00-前言
https://img2023.cnblogs.com/blog/2472635/202307/2472635-20230706210635156-1603941225.png
本设计(包括但不限于图片,文字,视频,代码风格,以下省去括号)
将发布于博客园,b站,吾爱论坛,开源中国,伪钞杂货铺微信公众号,影子论坛等
本设计为 伪钞 本人创作,转载请注明出处
本设计能提供单击,长按,以及长短按组合的按键反馈
本设计适用于gpio资源少,且需要较多用户操作的情况
本设计截止至目前(20230703)仅支持轮询,
以后有机会再开发中断模式
理解(并使用)本设计,需要你有一点数据结构基础,
有一定的c语言与单片机基础
有较为扎实的状态机基础,
本设计是我基于原有的基础工程《diaan》进行设计,
其中包含许多其他知识,如果我没有提及,那说明与VtorKey无关
软件环境:stm32cubeide 1.12.0
硬件环境:stm32f103rct6
https://img2023.cnblogs.com/blog/2472635/202307/2472635-20230706210644889-1435067057.png
名词解释:curState:当前状态,记录长按,短按,弹起,消抖等状态
lastState:用于弹起时,区分刚刚是长按还是短按
holdTime:持续时间,用于区分短按还是长按,区分短弹起还是长弹起
01-分析按键状态
https://img2023.cnblogs.com/blog/2472635/202307/2472635-20230706210649746-681265513.png
一个按键,从按下到弹起,会经历哪些情况
电平情况: 弹起时的电平 按下后的电平
状态可分: 弹起 按消 按下 弹消
按下时长: 短按 长按 短弹 长弹
02-单击长短按
如果curState为《按下》,如果holdTime小于《长按值》认定为《短按》并记录
如果holdTime大于《长按值》认定为《长按》并记录
当lastState与curState将要不同时,使用lastState记录curState,然后更curState
https://www.kdocs.cn/api/v3/office/copy/Y01hd1NjSG9MSnBRb0VqUW9teEFWZXIvNitPbUZkNkhkR2RQWjdKNUo4LzM0MkpUdXZNOXAranR0VER6Uk94NkJLY0RhbitMS1FBU09YMnFiUHhPek91Y0dyRVNXeG1NdEVwTUJYOTRjSFNMWHc4ZXpXK0Q0c05YUnZiZng1azl3YXRTZzFkL0RCNFUvd3NGM2dvcTl0N3dCQ0RQWTNQdkl3cyt5aTZ3d0lZTU1LYzlXcDAxMmc5WXRocDRwM1BHR2E0YVNJYnVBbkd5MzJKTlNYeEdJU3pNcUJvMzdxaWtrTlpRNVR4c01qZTEwOEZFVFdSejltaHBEN0NtZEtNU2h3Y1Vsa1NBeCtrPQ==/attach/object/b82311943dc0cf3f52d448423b948d4309ad846d?
03-消抖环节
消抖的判断代码在长短按判断之前,只是文章介绍访问长短按之后。
为了防止在触发长按的过程中触发短按,所以需要用用弹起状态作为一个单击动作的结束。
当curState为《弹起》,由于,根据lastState是短按,还是长按,就可以使用对应的返回值
https://www.kdocs.cn/api/v3/office/copy/Y01hd1NjSG9MSnBRb0VqUW9teEFWZXIvNitPbUZkNkhkR2RQWjdKNUo4LzM0MkpUdXZNOXAranR0VER6Uk94NkJLY0RhbitMS1FBU09YMnFiUHhPek91Y0dyRVNXeG1NdEVwTUJYOTRjSFNMWHc4ZXpXK0Q0c05YUnZiZng1azl3YXRTZzFkL0RCNFUvd3NGM2dvcTl0N3dCQ0RQWTNQdkl3cyt5aTZ3d0lZTU1LYzlXcDAxMmc5WXRocDRwM1BHR2E0YVNJYnVBbkd5MzJKTlNYeEdJU3pNcUJvMzdxaWtrTlpRNVR4c01qZTEwOEZFVFdSejltaHBEN0NtZEtNU2h3Y1Vsa1NBeCtrPQ==/attach/object/428dbbfbe48e1979508d5582822122179a2eb29b?
04-组合动作
上一次弹起与下一次按下的时间足够小,认为是组合动作
如果要记录组合动作,需要一个组合内 动作与动作之间《分隔符》
按习惯来说,用《短弹》作为《分隔符》比较合适
如果要记录组合动作,需要一个结束组合动作结束的《结束符》
按习惯来说,用《长弹》作为《结束符》比较合适
因为要等待《结束符》所以响应速度比较慢
当用户快速短按2下,并等待一段时间其中两次短击之间间隔一般小于500ms,
所以我使用500作为《长弹》的比较值
~~~~~无限长时间~~~~~~~按下~500ms~弹起~~~200ms~~~按下~~50ms~~弹起~~~~~~无限长时间~~~~~
此动作可认为《短短按》,值为《11》
https://img2023.cnblogs.com/blog/2472635/202307/2472635-20230706210712315-93551227.png
05-PeekCombine
为防止重复操作,为防止用户直接修改,为防止其他意外情况
所以使用KEY_PeekCombine获取组合动作,只有在组合动作结束后才会返回有效值,且函数内会清空组合动作,防止反复获取
https://img2023.cnblogs.com/blog/2472635/202307/2472635-20230706210718841-338159362.png
06-PeekAction
只提供按下动作 和 弹起动作为简单环境提供按操作不是重点,略过,
有兴趣请自行学习
07-移植与使用流程0701-反绑定
因为本设计反绑定了project.h所以用户需要先创建project.h文件,以确保成功编译
0702-时间设置
搜索VTOR_KEY_TIME_CONFIG_BY_USERSELF在project.h中定义,
并定义好时间和电平宏
https://img2023.cnblogs.com/blog/2472635/202307/2472635-20230706210728753-616134816.png
0703-KEY_GetLevel函数
用户只需要提供读取key的io电平(vtor_key_user_project.c文件)
本设计使用了HAL_GPIO_ReadPin直接读取io
https://img2023.cnblogs.com/blog/2472635/202307/2472635-20230706210732904-319583552.png
0704-KEY_Init函数
初始化好vtorKeyHeader即可
0705-KEY_Scan函数
定时循环调用即可
0706-KEY_PeekCombine函数
根据返回值进行判断即可 https://img2023.cnblogs.com/blog/2472635/202307/2472635-20230706210737360-594436616.png 我直接从word复制粘贴
但是格式乱了,请问有没有大佬能教教我怎么调整格式啊 难道这个是传说中物理外挂? 没看明白,谢谢! 论坛支持MarkDown格式写作,MD好排版一点 wzs0539 发表于 2023-7-7 07:10
难道这个是传说中物理外挂?
物理外挂在另一篇文章 《stm32usb键盘鼠标》的文章
这篇文章只是针对嵌入式情况下,少量按键能实现多个功能 twj007 发表于 2023-7-7 08:09
没看明白,谢谢!
这个是嵌入式方面的知识,
非这行的人不理解此文章是很正常的现象 vethenc 发表于 2023-7-7 08:47
论坛支持MarkDown格式写作,MD好排版一点
我还是打算试着word复制过来,因为我不打算只在一个平台上发文章
不过还是多谢你的好意~
页:
[1]