1 Preface/Foreword
中科蓝讯BT8918D模块支持:IO按键、AD按键
2 数据结构
2.1 按键事件映射表
typedef struct {
u8 adc_val;
u8 usage_id;
} adkey_tbl_t;
按键功能配置表:adkey_table
const adkey_tbl_t adkey_table[] = {
{0x0A, KEY_PREV_VOL_UP}, //PLAY 0R
{0x3F, KEY_PLAY}, //PREV/VOL- 2K
{0x6C, KEY_MODE}, //NEXT/VOL+ 5.1K,
{0x97, KEY_PAIR}, //MODE 10K,
{0xC1, KEY_VOL_DOWN_PREV}, //HSF 22K,
{0xE7, KEY_VOL_UP_NEXT}, //REPEAT 56K,
{0xF7, KEY_REC}, //REC 150K
{0xFF, NO_KEY}, // END
};
3 代码
3.1 获取按键对应的功能ID (get_adkey)
#if (USER_ADKEY || USER_ADKEY_MUX_SDCLK)
AT(.com_text.port.key)
static u8 get_adkey(u8 key_val, u8 key_config_en)
{
u8 num = 0;
u8 *ptr;//配置工具是否使能
if (!key_config_en) {
return NO_KEY;
}while (key_val > adkey_table[num].adc_val) {
num++;
}//工具配置了第一组ADKEY的按键定义?
ptr = get_adkey_configure(num);
if (ptr != NULL) {
if ((num > 11) || (adkey_table[num].adc_val == 0xff)) {
return NO_KEY;
}
return key_config_table[*(ptr+num)];
}return adkey_table[num].usage_id;
}
#endif // USER_ADKEY
3.2 按键扫描 (bsp_key_scan_do)
AT(.com_text.bsp.key)
u8 bsp_key_scan_do(void)
{
u8 key_val = NO_KEY;if (!get_adc_val()) {
return NO_KEY;
}#if USER_ADKEY
if (key_val == NO_KEY) {
key_val = get_adkey(adc_cb.key_val, xcfg_cb.user_adkey_en);
}
#endif // USER_ADKEYreturn key_val;
}
3.3 启动获取adc值 (get_adc_val)
AT(.com_text.port.key)
bool get_adc_val(void)
{
u16 channel;#if USER_ADKEY
if (xcfg_cb.user_adkey_en) {
adc_cb.key_val = (u8)(adc_cb.sfr[ADKEY_CH] >> 2);
}
#endif // USER_ADKEY
return true;
}