一个按键如果能有好几种功能,那么能大大节约 GPIO 引脚,在FreeRTOS中使用其计时器可以实现按键的长按和短按识别,并非裸机那般还需要加上定时器或在执行按键长按检测的代码时无法进行其他操作(实时性差)。
所以这里列举了按键长按可以实现的两种功能。
长按连续触发
计算长按时间,并根据长按时间做出不同反馈。也许用软件定时器会精简点,先鸽着
void TaskKey1()
{
while(1)
{
vTaskDelay(40);
if(!KEY1)
{
uint32_t t1 = xTaskGetTickCount();
while(1)
{
if(!KEY1)
{
uint32_t t2 = xTaskGetTickCount();
if(t2 - t1 > 2000)
{
printf("长按\n");
while(!KEY1);
vTaskDelay(40);
t2 = xTaskGetTickCount();
printf("本次长按时间:%dms",t2 - t1);
switch((t2 - t1) / 1000)
{
case 0: /* 填你的代码 */;break;
}
break;
}
}
else
{
/* 填你的代码 */
printf("短按\n");
break;
}
}
}
}
}
根据长按时间执行功能
短按单次触发,长按连发。
void TaskKey1()
{
while(1)
{
vTaskDelay(40);
if(!KEY1)
{
uint32_t t1 = xTaskGetTickCount();
while(1)
{
if(!KEY1)
{
uint32_t t2 = xTaskGetTickCount();
if(t2 - t1 > 2000)
{
while(!KEY2)
{
if((xTaskGetTickCount() - t1) % 1000 == 0)
{
/* 填你的代码 */
printf("长按\n");
}
}
}
}
else
{
/* 填你的代码 */
printf("短按\n");
break;
}
}
}
}
}