1 Preface/Foreword
中科蓝讯BT8918D模块支持:IO按键 、AD按键
2 数据结构
2.1 按键事件映射表
typedef struct {
u8 adc_val;
u8 usage_id;
} adkey_tbl_t;
按键功能配置表 :adkey_table
constadkey_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_ADKEY
return 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 ;
}