我写了一个代码,用于确定长按或不按下的按钮状态。顺便说一下,这个函数每1 ms由一个定时器中断程序调用。
如果按下的时间超过1秒,则LongPressed处于活动状态ShortPressed是被动的。反之亦然。
1 - 但是根据可读性和专业规则,我怎么能让它更短更有效?
BTW我更新了如下代码。
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 - 我应该添加或更改什么才能获得双击按此更新代码中的信息?
答案 0 :(得分:0)
几乎每个STM32定时器都有"外部触发同步"功能。您可以在参考手册中的定时器功能描述中阅读它。您可以使用"从属模式:触发模式"开始依靠"按钮"事件。并且在EXTI中断"按钮事件"你可以阅读计时器计数器并开展业务。
我不知道如何通过HAL实现这一点,但标准外设库应该有这个例子。
答案 1 :(得分:0)
1)您的代码只能处理1个按钮。使其面向对象以阅读 n 按钮。
1 ms太快了。 20毫秒应该工作正常。记住:人类很慢。
2)我曾经花了一些时间创建一个带两个按钮旋转编码器的LED控制器。这些将通过长时间或多次推送它们来实现高级编程方法。你可以使用我的陪练结果(它从未完成)作为灵感。按钮代码相当复杂,它应该满足您的需求。而且我记得它有用。
https://github.com/Jeroen6/LED-Rotary-Dimmer-SW/blob/master/user/button.c https://github.com/Jeroen6/LED-Rotary-Dimmer-SW/blob/master/user/button.h
原谅我没有正确处理缩进。