如何在C语言中区分短按键和长按键?
我编写了一个代码,用于确定按钮长按与否的状态。顺便说一下,定时器中断程序每1ms调用一次此函数 如果按下时间超过1秒,则长按为主动。短按为被动。反之亦然 1-但它看起来真的很愚蠢,根据易读性和专业规则,我该如何使它更短、更高效 顺便说一句,我更新了如下代码如何在C语言中区分短按键和长按键?,c,algorithm,stm32,C,Algorithm,Stm32,我编写了一个代码,用于确定按钮长按与否的状态。顺便说一下,定时器中断程序每1ms调用一次此函数 如果按下时间超过1秒,则长按为主动。短按为被动。反之亦然 1-但它看起来真的很愚蠢,根据易读性和专业规则,我该如何使它更短、更高效 顺便说一句,我更新了如下代码 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { /*button pressed and count*/ if(!HAL_GPIO_ReadPi
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/*button pressed and count*/
if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))
{
usTick++;
}
/*not pressed*/
else
{
if( usTick > 1000){
ButtonState.PressedState = LongPressed;
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
usTick = 0;
}
else if( usTick >350){
ButtonState.PressedState = ShortPressed;
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
usTick = 0;
}
usTick = 0;
}
}
2-在更新后的代码中,我应该添加或更改什么以获得双击按压信息?几乎每个STM32定时器都有“外部触发同步”功能。您可以在参考手册中的定时器功能说明中阅读。您可以使用“从属模式:触发模式”开始计数“按钮按下”事件。在“按钮启动事件”的EXTI中断中,您可以读取计时器计数器并处理您的事务 我不知道如何通过HAL实现这一点,但标准外设库应该有这个例子 1)您的代码只能处理1个按钮。使其面向对象以读取n按钮 1毫秒太快了。20毫秒就可以了。记住:人类是慢的 2)我曾经花了一些时间创建了一个带有两个按钮旋转编码器的LED控制器。通过长时间或多次推送它们,它们将具有高级编程方法的特点。你可以用我的拳击结果(它从未完成)作为灵感。按钮代码相当复杂,应该可以满足您的需要。我记得它是功能性的
请原谅我没有正确计算缩进。可能希望将此移到。可能更好地依靠
GPIO\u PIN\u 13
中断而不是计时器中断。好的,我不知道。我将移动它顺便说一句,同时保持短按
和短按
有什么意义?只需维护一个指示3种状态(关闭、短和长)的枚举数。我可能读取的代码不正确,但您的第一个if
是否确定按钮是否仍被按下?如果是这样,为什么还要在else
中执行另一个If(ButtonState.Released==FALSE)
?在其他情况下,你不能假设按钮被释放,然后检查按下的时间吗?STM32定时器也有PWM输入模式,可用于测量单个信号的持续时间。这种方式在编码上更加困难,但也更加美观。也许还有其他方法,因为STM32定时器非常聪明,要找到它们,至少可以阅读参考手册目录:)