VtorKey-轻量级短长按单多击组合动作按键模块

 

 

VtorKey

VtorKey-轻量级短长按单多击组合动作按键模块

作者邮箱:vtor3478@qq.com

开发时间:20230703日(周一)

相关网址:

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大于《长按值》认定为《长按》并记录

lastStatecurState将要不同时,使用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函数

用户只需要提供读取keyio电平(vtor_key_user_project.c文件)

本设计使用了HAL_GPIO_ReadPin直接读取io

 

 

 

0704-KEY_Init函数

初始化好vtorKeyHeader即可

 

0705-KEY_Scan函数

定时循环调用即可

 

 

0706-KEY_PeekCombine函数

根据返回值进行判断即可

 

 

 

 

 

 

 

 

Posted on 2023-07-06 21:29  污钞vtor  阅读(17)  评论(0编辑  收藏  举报