如何区分C中的短按和长按?

时间:2017-01-11 16:44:47

标签: c algorithm stm32

我写了一个代码,用于确定长按或不按下的按钮状态。顺便说一下,这个函数每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 - 我应该添加或更改什么才能获得双击按此更新代码中的信息?

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

原谅我没有正确处理缩进。