跳转至

按键(KEY)


1. 概述

  • 实现了ADC按键,GPIO按键,触摸(外挂adc接口的touch芯片)按键的三种参考;
  • 统一的按键消息接口,方便应用部分代码和底层具体按键隔离;
  • 参考代码内具体使用的ADC,GPIO资源方便快速修改适应不同板子。

2. 使用说明

函数接口 说明
ci_key_init 初始化按键组件
key_info_show 打印按键的各个消息
ci_key_gpio_init gpio 按键初始化,初始化IO和软件定时器,如需修改使用不同的IO,修改gpio_key_list即可
ci_key_gpio_isr_handle gpio 按键中断处理函数,如果使用GPIO按键功能,需要添加到gpio中断内
ci_key_adc_init ADC按键初始化,初始化ADC硬件,如需修改按键,修改adc_key_info,ADC_KEY_CHANNEL,ADC_KEY_PAD
ci_adc_key_isr_handle ADC 按键中断处理函数,如果使用ADC按键,需要将该函数放到adc中断处理函数里面,处理去抖,按键按下,长按,短按
ci_key_touch_init touch 按键初始化,使用ADC和GPIO中断,修改ADC_KEY_CHANNEL,TOUCH_ISR_PAD相关宏定义即可
ci_key_touch_gpio_isr_handle touch 按键GPIO中断处理函数,需要添加到GPIO中断内
ci_key_touch_adc_isr_handle touch 按键ADC中断处理函数,需要添加到ADC中断内

2.1. 使用示例

sample工程里UserTaskManageProcess任务里面可以接受按键消息,用户只需要在void userapp_deal_key_msg(sys_msg_key_data_t *key_msg)函数里面对按键进行处理。

下面以GPIO按键为例:

void ci_key_init(void)
{
    /*gpio 按键初始化*/
    ci_key_gpio_init();
}

ci_key_init();//初始化按键,只调用一次


//用户处理按键消息的函数
void userapp_deal_key_msg(sys_msg_key_data_t  *key_msg)
{
    if(key_msg->key_index != KEY_NULL)
    {
        ci_loginfo(LOG_USER,"key_value is 0x%x ",key_msg->key_index);

        //按键被按下
        if(MSG_KEY_STATUS_PRESS == key_msg->key_status)
        {
            ci_loginfo(LOG_USER,"status : press down\n");
        }

        //按键处于长按状态
        else if(MSG_KEY_STATUS_PRESS_LONG == key_msg->key_status)
        {
            ci_loginfo(LOG_USER,"status : long press\n");
        }

        //按键被释放
        else if(MSG_KEY_STATUS_RELEASE == key_msg->key_status)
        {
            ci_loginfo(LOG_USER,"status : release\n");
        }

        //按键被按下的时间
        if(key_msg->key_status == MSG_KEY_STATUS_RELEASE)
        {
            ci_loginfo(LOG_USER,"按键时间为:%d ms\n",key_msg->key_time_ms);
        }
        /*user code*/                
    }
}

//GPIO中断处理函数,放到实际的GPIO处理函数

//正确使用
void GPIO3_IRQHandler(void)
{
    ci_key_gpio_isr_handle();//GPIO按键处理函数

    if(gpio_get_irq_mask_status_single(GPIO3,gpio_pin_0))
    {
        gpio_clear_irq_single(GPIO3,gpio_pin_0);
        ci_loginfo(LOG_GPIO_DRIVER,"GPIO%d Pin%d IRQ\n", 3, 0);
    }

}

//错误使用
void GPIO3_IRQHandler(void)
{
    if(gpio_get_irq_mask_status_single(GPIO3,gpio_pin_0))
    {
        gpio_clear_irq_single(GPIO3,gpio_pin_0);
        ci_loginfo(LOG_GPIO_DRIVER,"GPIO%d Pin%d IRQ\n", 3, 0);
        ci_key_gpio_isr_handle();//GPIO按键处理函数
    }


}

提示

按键的定义需要结合板子来定,具体修改点可参考代码内文件开始的宏定义,然后需要将ISR处理函数添加到中断处理内。