1. 按键算法简介
这是一种多功能按键的嵌入式程序设计算法,它支持按键检测规则可配、多种按键事件和最大32数量的按键检测,该算法首先是通过读取芯片管脚IO电平的变化,再经过滤波和自定义规则算法输出按键事件,最终达到用户所需要功能的目的。如在单一按键中,可以有单击、双击、三击、短按、长按和超长按等事件,不同的事件可以自定义不同的功能。用户通过简单的初始化GPIO再加上按键检测算法,就容易实现按键多功能。它的应用场合,如TWS耳机、助听器、电子手表、单按键智能插座和智能灯控面板等。
1.1. 按键规则设计按键检测规则如下:
名称 | 英文 | 范围(ms) | 设置值 |
长按 | Long press | 0-12000 | 1500 |
超长按 | Long Long press | 0-12000 | 4000 |
超超长按 | Long Long Long press | 0-12000 | 8000 |
双击 | Double Press | 0-1000 | 600 |
三击 | Triple Press | 0-1000 | 800 |
重复时间间隔 | repeat rate | 0-1000 | 400 |
滤波次数 | Number Of Filter | 0-255 | 2 |
检测周期 | Checks Cycle | 0-255 | 20 |
按键执行 | Key Active | LOW:低电平有效,需要配置成上拉 HIGHT: 高电平有效,需要配置成下拉 | LOW低电平有效 |
1.2. 按键事件类型
按键事件类型如下:
名称 | 英文 | 备注 |
单击 | KEY_TYPE_SINGLE |
|
双击 | KEY_TYPE_DOUBLE |
|
三击 | KEY_TYPE_TRIPLE |
|
短按 | KEY_TYPE_LONG |
|
短按_释放 | KEY_TYPE_LONG |
|
长按 | KEY_TYPE_LONG |
|
长按_释放 | KEY_TYPE_LONG_RELEASE |
|
超长按 | KEY_TYPE_VLONG |
|
超长按_释放 | KEY_TYPE_VLONG_RELEASE |
|
超超长按 | KEY_TYPE_VVLONG |
|
超超长按_释放 | KEY_TYPE_VVLONG_RELEASE |
|
|
|
|
按键检测首先要对按键进行编号,按键序号码:第一个按键为KEY1,第二个按键为KEY2,第三个按键为KEY3,若需要有更多按键可以往上加KEY4、KEY5...KEYn,n<=31。按键序号在按键输入和输出事件启到指定按键。在程序设计中做一个枚举结构如下:
enum
{
KEY1=0,
KEY2,
KEY3
};
2.1. 按键检测初始化
初始化需要预先初始化mark,告诉算法需要检测按键的序号,检测规则需改变,可以使用规则参数配置的结构体赋值,调用void Button_SetKeyConfig(BUT_cfg_t KeyConfig)函数,将参数传递进去。如果按照默认参数,就不需要重新初始化。
2.2. 按键GPIO高低电平采样tKey_code有0-31(bit),其中KEY1为第0bit,它的值是BUTTON1_DIO管脚高低电平的值,0为低电平,1为高电平。所以表达式为tKey |= 管脚电平状态?(1UL<
按键检测处理函数,按照流程:读取按键值----->自定义规则检测---->读取按键事件BUFF---->压入消息队列----->长时间没有操作按键处理。长时间没有操作按键标志位为true,这种可以配合按键外部GPIO电平变化唤醒+按键按键检测启停,减少检测带来的功耗。
2.4. 按键消息typedef struct
{
BUT_TYPE_e but_type;
uint8_t but_code;
}BUT_message_t;
but_type为按键输出类型
but_code为按键序号
算法的运行环境:
8bit和32bit单片机,OS级芯片,算法占用RAM大小为320B,占用程序code大小<800B。亲们若在多功能按键嵌入式设计开发中有遇到问题,欢迎加我微信号18350299276进行探讨。备注信息:多功能按键。
作者: 志与智, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-3905966.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
商业资讯 2021-7-29 15:05
wxd123com_970479604 2020-9-7 11:53
pidaneng 2020-9-3 22:04
T.b.K 2020-9-3 08:45