蓝牙BLE---DA14585的按键单击、长按、按住、抬起检测

版权声明:转载请注明出处。技术交流加微信:life5270 https://blog.csdn.net/JaLLs/article/details/82696948

本人刚接触Dialog的BLE芯片不久,写得不好请见谅,谢谢!

按键处理在单片机里面算是比较基础的东西,但是有时候处理不好也容易出问题。

关于按键短按长按的处理一般也都是用外部中断+定时器的方法实现的。

下面我们来看看DA14585用纯定软件定时器的短按长按按住和抬起按键的一种实现方法

定时器可以是软件定时器,也可以是硬件。下面代码使用的是软件定时器。

#define NO_KEY          0xff
#define KEY_BASE_CNT  4
#define KEY_LONG_CNT  100
#define KEY_HOLD_CNT  50
#define KEY_SHORT_CNT 7

uint8_t get_key_value()
{
    if(is_key0_press)
        return 0;
    if(is_key1_press)
        return 1;
    if(is_key2_press)
        return 2;
    return NO_KEY;
}

static void key_scan()
{
    static uint8_t last_key = NO_KEY;
    static uint8_t key_press_counter;
    uint8_t cur_key;

    cur_key = NO_KEY;
    cur_key = get_key_value();

    if (cur_key == last_key)                            
    {
        if (cur_key == NO_KEY)
        {
            key_scan_status=app_easy_timer(2,key_scan);
            return;
        }

        key_press_counter++;

        if (key_press_counter == KEY_LONG_CNT)        
        {
            arch_printf("cur_key:%d\r\n",cur_key);
            arch_printf("key0_long_press\r\n");
        }
        else if (key_press_counter == (KEY_LONG_CNT + KEY_HOLD_CNT)) 
        {
            arch_printf("cur_key:%d\r\n",cur_key);
            arch_printf("key0_hold_press\r\n");
            key_press_counter = KEY_LONG_CNT;
        }
        else
        {
            //arch_printf("ELSE_RETURN\r\n");
            key_scan_status=app_easy_timer(2,key_scan);
            return;
        }
    }
    else  
    {
        last_key = cur_key;
        if ((key_press_counter < KEY_LONG_CNT) && (cur_key != NO_KEY))
        {
            //arch_printf("1111111\r\n");
            arch_printf("key0_short_press\r\n");
            arch_printf("cur_key:%d\r\n",cur_key);
        }
        if ((key_press_counter < KEY_LONG_CNT) && (cur_key == NO_KEY))  
        {
            //arch_printf("key0_short_press_up\r\n");
            //arch_printf("cur_key:%d\r\n",cur_key);
            key_press_counter = 0;
        }
        else if((cur_key == NO_KEY) && (key_press_counter >= KEY_LONG_CNT))
        {
            key_press_counter = 0;
            arch_printf("long_and_hold_up\r\n");
        }
        else
        {
        	//arch_printf("444444444\r\n");
            key_press_counter = 0;
            key_scan_status=app_easy_timer(2,key_scan);
            return;
        }
    }
        //arch_printf("end\r\n");
        key_scan_status=app_easy_timer(2,key_scan);
}

研究代码可以看出,当按住按键时,并不会执行短按的消息,而是计数到长按的阈值后,直接执行长按消息。

执行完长按消息后如果不抬起按键的话,将继续计数到按住按键的阈值,然后执行按住按键的消息。

当按键抬起时,会执行抬起的代码,短按抬起,长按抬起都有。

另外,以上代码本人测试没问题,按键检测和消抖都做的很好,但是还没用到实际项目中。

这个代码适用于所有带定时器中断的单片机。

猜你喜欢

转载自blog.csdn.net/JaLLs/article/details/82696948