按键系统key ========================================= 按键系统章节按照下面两个部分进行介绍: 1. :ref:`按键类型介绍` 2. :ref:`按键接口介绍` | SDK提供了系统按键key来进行人机交互。 | SDK包含的按键类型包括有IO按键、AD按键、IR按键、TOUCH按键和MATRIX按键5类。 | 用户可以在 **key.h** 里选择单独开其中1类按键,也可以选择同时开启多类按键。按键可以调按键门阀值。 .. image:: key_config.png :alt: "按键基本配置“ :align: center .. centered:: 按键基本配置 ^^^^^^^^^^^^^^^^^^^^ .. _按键类型介绍: 按键类型介绍 ################################ SDK包含的按键类型共有5类,分别为: 1. :ref:`IO按键` 2. :ref:`AD按键` 3. :ref:`IR按键` 4. :ref:`TOUCH按键` 5. :ref:`MATRIX按键` .. _IO按键: IO按键 ********************************* | IO按键的基本配置在“key_drv_io.h”文件中。 | IO按键需要配置选择的IO口和IO是否需要内部上下拉。 .. tip:: SDK中配置了3个IO按键,其配置如下: .. image:: iokey_config.png :alt: "IO按键配置“ :align: center .. centered:: IO按键配置 .. _AD按键: AD按键 ********************************* | AD按键的基本配置在“key_drv_ad.h”中。 | AD按键需要配置选择的ADC通道和外上拉电阻的阻值,如果外上拉电阻选择阻值为0,即使选择内上拉电阻。 .. tip:: SDK中配置了1个AD按键,其配置如下: .. image:: adkey_config.png :alt: "AD按键配置“ :align: center .. centered:: AD按键配置 AD按键的键值基本配置在“key_drv_ad.c”中。可根据按键连接电阻阻值配置键值。 .. image:: adkey_r_config.png :alt: "AD按键键值配置“ :align: center .. centered:: AD按键键值配置 .. _IR按键: IR按键 ********************************* | IR按键的基本配置在“key_ir.h”中。 | IR按键需要配置IR引脚和TIMER源。 .. tip:: SDK中配置了1个IR按键,其配置如下: .. image:: irkey_config.png :alt: "IR按键配置“ :align: center .. centered:: IR按键配置 .. _MATRIX按键: MATRIX按键 ******************************** | MATRIX 按键的基本配置在“ke_matrix.h”中。 | MATRIX 按键需要配置X轴的ADC 通道和Y轴的IO口,并且需要配置ADC通道检测到有按键的门阀值。 .. image:: matrixkey_config.png :alt: "MATRIX 按键配置“ :align: center .. centered:: MATRIX 按键配置 .. _TOUCH按键: touch按键: ********************************* 触摸按键识别的原理: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 触摸按键引脚,其网络对地存在寄生电容。 | 当人手接触网络时,寄生电容会变大。 | 常态下,引脚为输出,并输出高,保证寄生电容满电。 | 当引脚突然设为输入,关上拉,开下拉,则寄生电容的电会从下拉电阻放电,当程序读引脚电平为0时,则表示放电结束。 | 寄生电容越大则放电时间就越久(如人手触摸该引脚,相当于寄生电容增大)。 | 此时我们可以通过一个计数模块,来计算放电时间,通过时间的变化量来判断是否有人手触摸。 SDK参数配置: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 触摸按键共关心三个参数: 引脚,标定周期,变化阈值。通过key_touch.h修改。 .. image:: key_touch_h.png :alt: "key_touch.h“ :align: center .. centered:: key_touch.h TOUCH_KEY_SEL //触摸用到的引脚自行定义 .. image:: touchkey_config.png :alt: "触摸按键IO配置“ :align: center .. centered:: 触摸按键IO配置 .. tip:: TOUCH_VAL_CALIBRATE_CYCLE | //标定常态值的时间,单位为key_scand的时间,默认配置是1s左右。 | //这是SDK参考的标定常态值的算法用到,如果用户有自己的一套算法,该参数可以不用理会。 TOUCH_DELDA | //手按下时变化量的阈值,大于阈值说明被按下。 | //这个阈值是要调试出来的,先给的很大的值,保证不触发按键。下文会告诉怎么调试这个值。当然,这是SDK参考的处理变化量的的算法用到,如果用户有自己的一套算法,该参数可以不用理会。 **触摸按键调试** key.h文件使能触摸按键: .. image:: tkey_debug1.png :alt: "触摸按键调试1“ :align: center key_touch.c文件打开按键扫描的打印: .. image:: tkey_debug2.png :alt: "触摸按键调试2“ :align: center 下载程序,可以看到,按键的常态下的计数值,参考如下: .. image:: tkey_debug3.png :alt: "触摸按键调试3“ :align: center 当按键被手触摸时,计数值会变大,参考如下: .. image:: tkey_debug4.png :alt: "触摸按键调试4“ :align: center 可以看出变化量有到3000左右,那么此时,我们可以将变化量的阈值设为1000左右就行,回到key_touch.h文件修改阈值: .. image:: tkey_debug5.png :alt: "触摸按键调试5“ :align: center 触摸按键的数据处理 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | SDK提供的是参考的示例,其中包括简单的滤波,滤波后的值的处理,常态值的标定,这些用户都可以自己修改,或者完全重写重新自定义。 | 主要涉及pl_cnt.c 、 pl_cnt.h 、 key_touch.c 、 key_touch.h文件 .. _按键接口介绍: 按键接口介绍: ################# 函数void key_init(void) ******************************* 此函数根据key的使能类型来初始化不同的key。 函数void key_table_sel(void \*msg_filter) **************************************************** 此函数用来注册一个msg_filter函数,来获取key事件对应的msg。 | 1、msg_filter:key事件转换成消息的函数接口。 函数void key_scan(void) ******************************** 此函数在tick_timer中断中调用,用来扫描处理key事件。