2.7. KEY

Overview

提供 iokey 、 adkey 和 uart_key 应用示例、配置介绍和常见问题。

2.7.1. 应用实例

示例演示:

  • 演示读取按键方法。

example: 具体示例代码详见 apps/common/example/peripheral/key/main.c ,示例工程实现需在 apps/demo/demo_DevKitBoard/include/demo_config.h 中开启宏 USE_KEY_TEST_DEMO

2.7.2. 常见问题

  • AD 值的硬件计算原理?

    答:AD 值的硬件计算原理(board.c):

    /*-------ADKEY GROUP 1------*/
    #define ADKEY_UPLOAD_R  22
    #define ADC_VDDIO (0x3FF)
    

    Note

    ADKEY_UPLOAD_R 为 22K 上拉电阻,ADC_VDDIO 为上拉时即电源电压 3.3v 所采集到的 ADC 的值,因为是 10bitADC,所以是 0x3ff(1023)

    #define ADC_09   (0x3FF * 220 / (220 + ADKEY_UPLOAD_R))
    #define ADC_08   (0x3FF * 120 / (120 + ADKEY_UPLOAD_R))
    #define ADC_07   (0x3FF * 51  / (51  + ADKEY_UPLOAD_R))
    #define ADC_06   (0x3FF * 33  / (33  + ADKEY_UPLOAD_R))
    #define ADC_05   (0x3FF * 22  / (22  + ADKEY_UPLOAD_R))
    #define ADC_04   (0x3FF * 15  / (15  + ADKEY_UPLOAD_R))
    #define ADC_03   (0x3FF * 10  / (10  + ADKEY_UPLOAD_R))
    #define ADC_02   (0x3FF * 62  / (62  + ADKEY_UPLOAD_R * 10))
    #define ADC_01   (0x3FF *  3  / ( 3  + ADKEY_UPLOAD_R))
    #define ADC_00   (0)
    

    Note

    上面的宏定义是 AD 按键不同电阻根据电阻分压原理计算出来的电压值转换后的 ADC 值

    #define ADKEY_V_9       ((ADC_09 + ADC_VDDIO)/2)
    #define ADKEY_V_8                 ((ADC_08 + ADC_09)/2)
    #define ADKEY_V_7                 ((ADC_07 + ADC_08)/2)
    #define ADKEY_V_6                 ((ADC_06 + ADC_07)/2)
    #define ADKEY_V_5                 ((ADC_05 + ADC_06)/2)
    #define ADKEY_V_4                 ((ADC_04 + ADC_05)/2)
    #define ADKEY_V_3                 ((ADC_03 + ADC_04)/2)
    #define ADKEY_V_2                 ((ADC_02 + ADC_03)/2)
    #define ADKEY_V_1                 ((ADC_01 + ADC_02)/2)
    #define ADKEY_V_0                 ((ADC_00 + ADC_01)/2)
    

    Note

    上面为 ADC 取中间值的宏定义,这个也好理解,假如 KEY0 的键值 ADC 对应的是 920,KEY1 的是 846,那么就取两个的中间值,当大于这个中间值我们就可以认为是 KEY0,小于这个就认为是 KEY1

  • 若用户不需要使用所有的按键,其他按键应该如何设置?

    答:当用户不需要使用所有按键时,可以将不使用的按键 ADC 值均置为 0x3FF,例如下述代码中的 ADC05~ADC09:

    #define ADC_09   (0x3FF)
    #define ADC_08   (0x3FF)
    #define ADC_07   (0x3FF)
    #define ADC_06   (0x3FF)
    #define ADC_05   (0x3FF)
    #define ADC_04   (0x3FF * 15  / (15  + ADKEY_UPLOAD_R))
    #define ADC_03   (0x3FF * 10  / (10  + ADKEY_UPLOAD_R))
    #define ADC_02   (0x3FF * 62  / (62  + ADKEY_UPLOAD_R * 10))
    #define ADC_01   (0x3FF *  3  / ( 3  + ADKEY_UPLOAD_R))
    #define ADC_00   (0)
    
  • 如何修改 ad_key 连接的引脚?

    答:参考一下配置,ad_channel 和 adkey_pin 是一一对应的。PB01 脚对应的是通道3。

    #define AD_CH_PA07    (0x0)
    #define AD_CH_PA08    (0x1)
    #define AD_CH_PA10    (0x2)
    #define AD_CH_PB01    (0x3)
    #define AD_CH_PB06    (0x4)
    #define AD_CH_PB07    (0x5)
    #define AD_CH_PC00    (0x6)
    #define AD_CH_PC01    (0x7)
    #define AD_CH_PC09    (0x8)
    #define AD_CH_PC10    (0x9)
    #define AD_CH_PH00    (0xa)
    #define AD_CH_PH03    (0xb)
    #define AD_CH_DM      (0xc)
    #define AD_CH_DP      (0xd)
    #define AD_CH_RTC     (0xe)
    #define AD_CH_PMU     (0xf)
    #define AD_CH_SYSPLL  (0xf)
    #define AD_CH_AUDIO   (0xf)
    #define AD_CH_WIFI    (0xf)
    #define AD_CH_CTMU    (0xf)
    
  • io_key 双按键如何使用?

    答:当我们配置的 key_type.two_io.in_port 的引脚接触到 GND 即触发,key_type.two_io.out_port 配置的引脚输出低电平。

  • io_key 双按键如何使用?

    答:当我们配置的 key_type.two_io.in_port 的引脚接触到GND即触发,key_type.two_io.out_port 配置的引脚输出低电平。

  • io_key的key_value值与ad_key的值是否一样?

    答:io_key 的 key_value 值与 ad_key 的值表是不一样的,io_key 的 key_value 值可以查看定义:

    #define     KEY_POWER           0
    #define     KEY_PREV            1
    #define     KEY_NEXT            2
    #define     KEY_PLAY            3
    #define     KEY_VOLUME_DEC      4
    #define     KEY_VOLUME_INC      5
    #define     KEY_MODE            6
    #define     KEY_MENU            7
    #define     KEY_ENC             8
    #define     KEY_PHONE           9
    #define     KEY_PHOTO           10
    
    #define     KEY_F1              11
    #define     KEY_OK              12
    #define     KEY_CANCLE          13
    #define     KEY_LEFT            14
    #define     KEY_UP              15
    #define     KEY_RIGHT           16
    #define     KEY_DOWN            17
    #define     KEY_MUTE            18
    #define     KEY_COLLECT         19
    #define     KEY_LOCAL           20
    
    #define      KEY_0               30
    #define      KEY_1               31
    #define      KEY_2               32
    #define      KEY_3               33
    #define      KEY_4               34
    #define      KEY_5               35
    #define      KEY_6               36
    #define      KEY_7               37
    #define      KEY_8               38
    #define      KEY_9               39
    
    #define     NO_KEY              255
    

  • uart_key 如何使用?

    答:
    • 1.在 apps/demo/demo_DevKitBoard/include/app_config.h 中开启宏 ``#define TCFG_UART_KEY_ENABLE 1 ``

    • 2.在 board.cvoid board_init() 函数中调用 key_driver_init()

    • 3.同时在 board.c 配置打印串口脚时,把rx脚也配置好。

    • 3.具体想修改对应的命令进入 apps/common/key/uart_key.c 中自己定义便可。

2.7.3. API参考

  • iokey 的 API 接口说明如下:

Functions

int iokey_init(const struct iokey_platform_data *iokey_data)

iokey_init:io按键初始化

Parameters

iokey_data – io按键句柄

u8 io_get_key_value(void)

io_get_key_value:获取io按键值

struct one_io_key

Public Members

u8 port

io按键引脚

struct two_io_key

Public Members

u8 in_port

io按键输入引脚

u8 out_port

io按键输出引脚

union key_type

Public Members

struct one_io_key one_io

单io按键

struct two_io_key two_io

双io按键

struct iokey_port

Public Members

union key_type key_type

io按键类型

u8 connect_way

io按键连接方式

u8 key_value

io按键值

struct iokey_platform_data

Public Members

u8 enable

io按键使能,使能为1,不使能为0

u8 num

io按键数量

const struct iokey_port *port

io按键参数

  • adkey 的 API 接口说明如下:

Functions

int adkey_init(const struct adkey_platform_data *adkey_data)

adkey_init:ad按键初始化

Parameters

adkey_data – ad按键句柄

u8 ad_get_key_value(void)

ad_get_key_value:获取ad按键值

struct adkey_platform_data

Public Members

u8 enable

ad按键使能,使能为1,不使能为0

u8 adkey_pin

ad按键引脚

u8 extern_up_en

是否用外部上拉,1:用外部上拉, 0:用内部上拉10K

u32 ad_channel

ad通道

u16 ad_value[ADKEY_MAX_NUM]

ad值

u8 key_value[ADKEY_MAX_NUM]

key值