版权声明:转载请注明出处。技术交流加微信: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);
}
研究代码可以看出,当按住按键时,并不会执行短按的消息,而是计数到长按的阈值后,直接执行长按消息。
执行完长按消息后如果不抬起按键的话,将继续计数到按住按键的阈值,然后执行按住按键的消息。
当按键抬起时,会执行抬起的代码,短按抬起,长按抬起都有。
另外,以上代码本人测试没问题,按键检测和消抖都做的很好,但是还没用到实际项目中。
这个代码适用于所有带定时器中断的单片机。