# CommonKey
基础按键处理库,实现了一般按键的单点、连点、长按检测。可进行多按键的封装,采用回调的方式与主程序通讯。
## 使用说明
要使用[CommonKey][2]按键检测封装,你需要在你的工程中做出如下处理:
* 将文件加入你的工程路径中,按需修改时间阈值宏:
> `COMKEY_ClickThreshold`:单击时间阈值,短于此时间视为抖动
>
> `COMKEY_HoldThreshold`:长按时间阈值,长于此时间视为长按
>
> `COMKEY_HoldTriggerThreshold`:长按触发阈值,长按时每隔该事件触发一次按键
>
> `COMKEY_IntervalVal`:间隔时间阈值,短于此时间视为连按
* 为您的每个按键定义一个`comkey_t`句柄
* 为**每个按键**调用`ComKey_Init`初始化函数,参数为**按键句柄**和**检测时间**
* 改写`ComKey_SyncValue`函数
* 根据需要重写回调函数:
> `ComKey_FirstLongTriggerCallback`:**首次长按触发回调函数**,参数为**按键句柄**
>
> `ComKey_LongHoldCallback`:**长按回调函数**,参数为**按键句柄**
>
> `ComKey_HoldTriggerCallback`:**长按触发回调函数**,参数为**按键句柄**
>
> `ComKey_MultipleClickCallback`:**连点回调函数**,参数为**按键句柄**
>
> `ComKey_KeyReleaseCallback`:**按键松开回调函数**,参数为**按键句柄**
>
> `ComKey_KeyPressCallback`:**按键按下回调函数**,参数为**按键句柄**
* 以一个固定的间隔调用`ComKey_Handler`函数
* 测试实际效果
***
## 一些说明与示例
此部分提供了一些对于接口函数、回调函数等的说明,以及简单的使用示例。
### 接口函数的移植
库内部不提供对按键触发电平的检测,移植时**请务必**保证按键触发时传递到`key->val`的值为1;
如果您有多个按键,请通过**您自己定义的按键句柄**来区分您的触发按键;
此外**请不要删除**最后一句代码,这将影响程序的正常运行。
```C
void ComKey_SyncValue(comkey_t *key) {
//if your key was pressed,"key->val" should be 1.
if (key == &key0) {
key->val = !HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
}
if (key == &key1) {
key->val = !HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
}
//IMPORTANT!!!DO NOT MODIFIED!!!
key->preVal = key->val;
}
```
### 首次长按触发回调函数
如果您有多个按键,请通过**您自己定义的按键句柄**来区分您的触发按键;
该回调函数为进入长按状态的信号,此函数被调用意味着您的按键**进入长按状态**。
```C
__attribute__((weak)) void ComKey_FirstLongTriggerCallback(comkey_t* key)
{
if (key == &key0)
printf("key0: ");
if (key == &key1) {
printf("key1: ");
}
printf("was triggerred!\n", key->holdTime);
}
```
### 长按回调函数
如果您有多个按键,请通过**您自己定义的按键句柄**来区分您的触发按键;
此外,您可以通过按键句柄的`holdTime`成员来获取**当次长按的持续时间**(ms)供您使用.
```C
void ComKey_LongHoldCallback(comkey_t *key) {
if (key == &key0)
printf("key0: ");
if (key == &key1) {
printf("key1: ");
}
printf("hold %ldms\n", key->holdTime);
}
```
### 长按触发回调函数
如果您有多个按键,请通过**您自己定义的按键句柄**来区分您的触发按键;
当您采用按键单击进行类似数据加减的任务时,若想**通过长按来实现多次单击的效果**,请使用此回调函数;
该函数将会以`COMKEY_HoldTriggerThreshold`的间隔被调用。
```C
void ComKey_HoldTriggerCallback(comkey_t *key) {
if (key == &key0)
printf("key0: HoldTrigger\n");
if (key == &key1) {
printf("key1: HoldTrigger\n");
}
}
```
### 连续点击回调函数
如果您有多个按键,请通过**您自己定义的按键句柄**来区分您的触发按键;
当您多次连续进行点击**后**,会触发该回调函数,连续点击间隔时间阈值可通过`COMKEY_IntervalVal`宏来进行修改;
此外,您可以通过按键句柄的`clickCnt`成员来获得当次**连按的次数**以供您使用。
```C
void ComKey_MultipleClickCallback(comkey_t *key) {
if (key == &key0)
printf("key0: ");
if (key == &key1) {
printf("key1: ");
}
printf("click: %d\n", key->clickCnt);
}
```
### 按键按下回调函数
如果您有多个按键,请通过**您自己定义的按键句柄**来区分您的触发按键;
任何按键按下的事件都会触发该回调函数。
```C
void ComKey_KeyPressCallback(comkey_t *key) {
if (key == &key0) {
printf("key0: ");
}
if (key == &key1) {
printf("key1: ");
}
printf("keyPress!\n");
}
```
### 按键释放回调函数
如果您有多个按键,请通过**您自己定义的按键句柄**来区分您的触发按键;
此外,您可以通过按键句柄的`state`成员的两个枚举值:
`LongHold`和`MultiClick`
来区分当次释放按键的事件是**长按**还是**连击**(单击)。
```C
void ComKey_KeyReleaseCallback(comkey_t *key) {
if (key == &key0) {
printf("key0: ");
}
if (key == &key1) {
printf("key1: ");
}
if (key->state == LongHold) {
printf("LongHold");
} else if (key->state == MultiClick) {
printf("Click");
}
printf(" Release!\n");
}
```
***
## 实现思路
思路其实很简单,核心部分是两个计时器:**按下计时器**和**间隔计时器**。通过有限状态机的方式来实现对各个功能的检测,状态转移图大概如下:
![按键状态转移][3]
仅作分享,欢迎提出优化意见以及建议🥰
[1]: https://zhewana.cn/usr/uploads/2022/03/2707392082.png
[2]: https://github.com/Zhewana/CommonKey
[3]: https://zhewana.cn/usr/uploads/2022/03/3781171879.png
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的竞赛项目学习资料,作为参考学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 2023光电赛小车题树莓派+无畸变摄像头(备用小畸变摄像头)视觉方案源码+学习说明.zip
资源推荐
资源详情
资源评论
收起资源包目录
2023工训赛控制器源码+学习说明(含有STM32H750作为整车控制器的控制代码).zip (272个子文件)
Controler.BAT 7KB
stm32h7xx_hal_tim.c 247KB
stm32h7xx_hal_i2c.c 220KB
tasks.c 169KB
stm32h7xx_hal_uart.c 153KB
stm32h7xx_hal_rcc_ex.c 121KB
stm32h7xx_hal_spi.c 118KB
stm32h7xx_hal_tim_ex.c 101KB
queue.c 91KB
stm32h7xx_hal_pwr_ex.c 75KB
stm32h7xx_hal_dma.c 66KB
stm32h7xx_hal_rcc.c 63KB
stm32h7xx_hal_flash_ex.c 62KB
stm32h7xx_hal_mdma.c 61KB
cmsis_os2.c 57KB
shell.c 50KB
stm32h7xx_hal.c 42KB
stream_buffer.c 41KB
fonts.c 41KB
timers.c 39KB
stm32h7xx_hal_flash.c 36KB
stm32h7xx_hal_uart_ex.c 34KB
stm32h7xx_hal_pwr.c 32KB
port.c 29KB
st7735.c 27KB
printf.c 26KB
event_groups.c 25KB
stm32h7xx_hal_exti.c 25KB
stm32h7xx_hal_dma_ex.c 24KB
tim.c 24KB
stm32h7xx_hal_gpio.c 19KB
stm32h7xx_hal_cortex.c 18KB
main.c 18KB
system_stm32h7xx.c 16KB
heap_4.c 15KB
stm32h7xx_hal_hsem.c 14KB
freertos.c 14KB
system_stm32h7xx.c 14KB
utils.c 13KB
croutine.c 13KB
imuFusion.c 12KB
shell_ext.c 12KB
stm32h7xx_hal_i2c_ex.c 11KB
spi.c 11KB
RTX_Conf_CM.c 10KB
usart.c 10KB
stepHelper.c 9KB
list.c 8KB
shell_port.c 7KB
stm32h7xx_hal_spi_ex.c 6KB
stm32h7xx_it.c 6KB
wiringSerial.c 6KB
move.c 5KB
gpio.c 5KB
ICM42605.c 5KB
shell_cmd_list.c 4KB
stm32h7xx_hal_timebase_tim.c 4KB
comKey.c 4KB
PMW3901.c 4KB
SPChanger.c 4KB
i2c.c 3KB
LobotSerialServo.c 3KB
sysmem.c 3KB
syscalls.c 2KB
stm32h7xx_hal_msp.c 2KB
key.c 2KB
shell_companion.c 2KB
dma.c 2KB
pid.c 2KB
SPI_Port.c 1KB
QMC5883L.c 1KB
motor.c 1014B
filter.c 936B
.clang-format 734B
MDK-ARM.code-workspace 1KB
main.cpp 33KB
.cproject 26KB
structure.drawio 11KB
frameWork.drawio 9KB
state.drawio 5KB
.gitignore 767B
.gitignore 182B
.gitignore 182B
.gitignore 151B
stm32h750xx.h 2.02MB
stm32h7xx_hal_rcc.h 493KB
core_cm55.h 310KB
core_cm85.h 301KB
core_armv81mml.h 270KB
stm32_hal_legacy.h 219KB
stm32h7xx_hal_rcc_ex.h 205KB
core_starmc1.h 189KB
core_cm35p.h 185KB
core_cm33.h 185KB
core_armv8mml.h 179KB
core_armv81mml.h 165KB
core_cm35p.h 161KB
core_cm33.h 161KB
core_armv8mml.h 155KB
core_cm7.h 146KB
共 272 条
- 1
- 2
- 3
资源评论
- xh9962024-07-29发现一个宝藏资源,资源有很高的参考价值,赶紧学起来~
土豆片片
- 粉丝: 1839
- 资源: 5657
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 软考冲刺的基本内容和操作
- Centos8.x通过RPM包升级OpenSSH9.8(openssl-3.0) 升级有风险,前务必做好快照,以免升级后出现异常影响业务
- Centos8.x通过RPM包升级OpenSSH9.7(openssl-3.0) 升级有风险,前务必做好快照,以免升级后出现异常影响业务
- 数据库基本内容讲解和操作
- Centos8.x通过RPM包升级OpenSSH9.9.(openssl-3.4.0) 升级有风险,前务必做好快照,以免升级后出现异常影响业务
- FortFirewall-3.14.7-windows10-x86-64 防火墙
- javaweb基本操作
- Centos7.x升级openssl-1.1.1w rpm安装包 升级有风险,前务必做好快照,以免升级后出现异常影响业务
- yolo的基本操作用法
- Ubuntu20/22/24通过deb包升级OpenSSH9.9方法 不支持16、18版本,升级有风险,前务必做好快照,以免升级后出现异常影响业务
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功