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.c
的void 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 two_io_key
-
union key_type
-
struct iokey_port
-
struct iokey_platform_data
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