【发布时间】:2021-06-23 15:55:33
【问题描述】:
我正在尝试实现单按、双按和长按功能来执行不同的功能。到目前为止,我已经了解了单按和长按的逻辑,但我不知道如何检测双按。至于代码,我已经使用计数器实现了单按和长按,但代码只停留在第一个 if 条件。
bool single_press = false;
bool long_press = false;
if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))
{
HAL_TIM_Base_Start(&htim2);
if ((TIM2->CNT == 20) && (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)))
{
single_press = true;
long_press = false;
}
else if ((TIM2->CNT == 799) && (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)))
{
single_press = true;
long_press = true;
}
HAL_TIM_Base_Stop(&htim2);
}
if (single_press == true && long_press == false)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, 1);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, 0);
}
else if (single_press == true && long_press == true)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, 1);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, 0);
}
}
我正在尝试实现一个情况,如果我按下键 20 毫秒(单次按下)PB0 将变高一秒钟,如果我按下键 800 毫秒 PB7 将变高一秒钟。但是,在运行程序时,当我按下按钮时,无论我按住按钮多长时间,PB0 都会变为高电平,而 PB7 则保持低电平。所以我想我有两个问题:
- 如何编辑我的代码,以便单按 PB0 变为高电平,长按 PB7 变为高电平?
- 如何实现双按功能?
谢谢!
【问题讨论】:
-
if (button_press_edge detected && last press was within delta-time-threshold) do_double_press();使用常量,因为“双击”的时间量会非常直观,并且可能会在您获得用户反馈时进行一些修改。 -
20ms 勉强够开关去抖,在任何情况下你都不可能在那个时间释放按钮。为什么这么短 - 当然它只需要少于“长按”。
标签: c embedded stm32 hal stm32f4