LZY825597017 发表于 2023-7-20 16:49:34

多功能按键扩展库

本帖最后由 LZY825597017 于 2023-7-21 16:16 编辑

多功能按键扩展库使用说明:

扩展库内所有函数以事件触发。
扩展库支持:按下、单击、双击、连击、短按、长按、长按保持等多种方式,短按、长按和长按保持又可以划分为开始和结束,即短按开始,短按结束等等。
按键时间长度由用户自定义。


下面讲解图形化块:







1、按键以及IO初始化使用本库前请确定好按键按下时的电平以及IO口的上下拉模式(如按下为低电平,则IO使用上拉模式)

首先,确定按键接到那个IO口(注意:某些IO上电为复用功能,不建议用做普通IO),并将这个按键命名为按键(0~31),并确定好上下拉模式(如果不使用芯片IO的上下拉模式,也可以使用硬件加上/下拉电阻)
确定好按键总数。(按键号不允许大于按键总数-1)
其次,确定好按下时按键的电平状态(根据电路硬件和软件配置决定)
最后,根据需求,用户自定义短按、长按和长按保持的时间

2、按键扫描函数

请将该函数放入20ms定时器中,或者单独创建线程20ms轮询此函数

3、按键事件回调函数注:该函数必须被使用,否则编译会报错(不使用,放置一个在图形即可)

连击间隙为300ms,小于300ms则算连击
使用通用回调函数,可以选择按键x在发生事件y时,调用用户自定义函数或者使用标志位等等。该函数除了能够对单一按键判断外,还可以使用组合按键,使用逻辑与/或不同按键事件即可
注意:回调函数中禁止使用任何阻塞延时,否则会出现不可预料的后果,如有需求建议使用标志位,在主函数中判断标志位


4、获取按键x事件

对外提供获取任意按键当前所处事件的接口,可根据返回值处理。
返回值含义如下:
0--->按下事件   1--->单击事件   2--->双击事件   3--->连击事件   4--->短按开始事件   5--->短按抬起事件   
6--->长按开始事件   7--->长按抬起事件   8--->长按保持事件   9--->长按保持抬起事件   10--->统计值,无意义
11--->没有按下事件
注意:获取事件时不能被阻塞延时,否则得到的返回值不正确
例如:两种方法在某种意义上等价,且都不能被阻塞




案例1:以CH32V003核心板讲解


本案例中,核心板上,将按键0/1接触GND表示按键被按下
使用按键0(PC0)和按键1(PC1),轻轻按下按键0,核心板绿灯灭,轻轻按下按键1,核心板绿灯亮。

案例2:

组合按键
同时按下按键1和按键0三秒,核心板绿灯灭,同时双击按键1和按键0,核心板绿灯亮。

注意事项:
如果按键扩展库不能使用,建议使用串口打印按键的事件,再寻找原因
1、按键的上下拉确定,如果上下拉选择错误,使用串口将一直打印8
2、图形化块的按键x选择不要忘记,默认都为0
3、使用扩展库报错,首先,回调函数一定要放进图形化里,可以不用,但一定要有,因为回调函数是定时器扫描函数需要的函数,状态改变时就会调用一次。
4、短按长按设置的时间与实际相差特别大。(1)定时器周期是否为20ms(2)系统时钟设置是否正确
5、短按事件与单击、双击等事件。短按时间的设置不能太短,否则程序比较时直接跳过单击、双击事件,导致无法判断。
6、按键最小判断时间为20ms,如果有特殊需求,此时需要将扫描函数放入自定义定时器中,修改.h文件的宏定义
FLEX_BTN_SCAN_FREQ_HZ ,大小计算 = 1000/定时器时间。一般不要修改,否则在判断时的计数值误差会更大。
7、连击时间空隙修改。如果觉得双击或者连击时间太短可以修改宏定义 #define MAX_MULTIPLE_CLICKS_INTERVAL (FLEX_MS_TO_SCAN_CNT(300))   默认300ms。例如修改为500,则程序中上一次点击后500ms内再次点击则算连击加1。





mbli1511 发表于 2023-7-21 19:57:38

支持哪些芯片???

hcm0915 发表于 2023-7-24 11:47:30

mbli1511 发表于 2023-7-21 19:57
支持哪些芯片???
STC16、STC32G、TWEN32、CH32V103、CH32V208、CH32V003、TW32F003等
页: [1]
查看完整版本: 多功能按键扩展库