Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C语言中区分短按键和长按键?_C_Algorithm_Stm32 - Fatal编程技术网

如何在C语言中区分短按键和长按键?

如何在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

我编写了一个代码,用于确定按钮长按与否的状态。顺便说一下,定时器中断程序每1ms调用一次此函数

如果按下时间超过1秒,则长按为主动。短按为被动。反之亦然

1-但它看起来真的很愚蠢,根据易读性和专业规则,我该如何使它更短、更高效

顺便说一句,我更新了如下代码

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定时器非常聪明,要找到它们,至少可以阅读参考手册目录:)