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

本文介绍了一种使用软件定时器在DA14585 BLE芯片上实现按键短按、长按及按住状态检测的方法。通过定时器计数,区分按键的不同状态,包括短按、长按、按住和抬起,适用于所有带定时器中断的单片机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本人刚接触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);
}

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jim天河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值