BT8918D---按键模块

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_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;
}
 

 

你可能感兴趣的:(Bluetrum(蓝讯),Bluetrum)