3. 按键系统key

按键系统章节按照下面两个部分进行介绍:

  1. 按键类型介绍

  2. 按键接口介绍:

SDK提供了系统按键key来进行人机交互。
SDK包含的按键类型包括有IO按键、AD按键、IR按键、TOUCH按键和MATRIX按键5类。
用户可以在 key.h 里选择单独开其中1类按键,也可以选择同时开启多类按键。按键可以调按键门阀值。
"按键基本配置“

按键基本配置


3.1. 按键类型介绍

SDK包含的按键类型共有5类,分别为:

  1. IO按键

  2. AD按键

  3. IR按键

  4. touch按键:

  5. MATRIX按键

3.1.1. IO按键

IO按键的基本配置在“key_drv_io.h”文件中。
IO按键需要配置选择的IO口和IO是否需要内部上下拉。

小技巧

SDK中配置了3个IO按键,其配置如下:

"IO按键配置“

IO按键配置

3.1.3. IR按键

IR按键的基本配置在“key_ir.h”中。
IR按键需要配置IR引脚和TIMER源。

小技巧

SDK中配置了1个IR按键,其配置如下:

"IR按键配置“

IR按键配置

3.1.4. MATRIX按键

MATRIX 按键的基本配置在“ke_matrix.h”中。
MATRIX 按键需要配置X轴的ADC 通道和Y轴的IO口,并且需要配置ADC通道检测到有按键的门阀值。
"MATRIX 按键配置“

MATRIX 按键配置

3.1.5. touch按键:

3.1.5.1. 触摸按键识别的原理:

触摸按键引脚,其网络对地存在寄生电容。
当人手接触网络时,寄生电容会变大。
常态下,引脚为输出,并输出高,保证寄生电容满电。
当引脚突然设为输入,关上拉,开下拉,则寄生电容的电会从下拉电阻放电,当程序读引脚电平为0时,则表示放电结束。
寄生电容越大则放电时间就越久(如人手触摸该引脚,相当于寄生电容增大)。
此时我们可以通过一个计数模块,来计算放电时间,通过时间的变化量来判断是否有人手触摸。

3.1.5.2. SDK参数配置:

触摸按键共关心三个参数: 引脚,标定周期,变化阈值。通过key_touch.h修改。

"key_touch.h“

key_touch.h

TOUCH_KEY_SEL //触摸用到的引脚自行定义

"触摸按键IO配置“

触摸按键IO配置

小技巧

TOUCH_VAL_CALIBRATE_CYCLE
//标定常态值的时间,单位为key_scand的时间,默认配置是1s左右。
//这是SDK参考的标定常态值的算法用到,如果用户有自己的一套算法,该参数可以不用理会。
TOUCH_DELDA
//手按下时变化量的阈值,大于阈值说明被按下。
//这个阈值是要调试出来的,先给的很大的值,保证不触发按键。下文会告诉怎么调试这个值。当然,这是SDK参考的处理变化量的的算法用到,如果用户有自己的一套算法,该参数可以不用理会。

触摸按键调试

key.h文件使能触摸按键:

"触摸按键调试1“

key_touch.c文件打开按键扫描的打印:

"触摸按键调试2“

下载程序,可以看到,按键的常态下的计数值,参考如下:

"触摸按键调试3“

当按键被手触摸时,计数值会变大,参考如下:

"触摸按键调试4“

可以看出变化量有到3000左右,那么此时,我们可以将变化量的阈值设为1000左右就行,回到key_touch.h文件修改阈值:

"触摸按键调试5“

3.1.5.3. 触摸按键的数据处理

SDK提供的是参考的示例,其中包括简单的滤波,滤波后的值的处理,常态值的标定,这些用户都可以自己修改,或者完全重写重新自定义。
主要涉及pl_cnt.c 、 pl_cnt.h 、 key_touch.c 、 key_touch.h文件

3.2. 按键接口介绍:

3.2.1. 函数void key_init(void)

此函数根据key的使能类型来初始化不同的key。

3.2.2. 函数void key_table_sel(void *msg_filter)

此函数用来注册一个msg_filter函数,来获取key事件对应的msg。 | 1、msg_filter:key事件转换成消息的函数接口。

3.2.3. 函数void key_scan(void)

此函数在tick_timer中断中调用,用来扫描处理key事件。