我需要根据按下按钮的持续时间执行某些操作。这是我想要达到的目标:100毫秒:改变brigtness 50%。(那些我已经想出的亮度变化功能)200毫秒:改变brigtness 100%。我想知道实现这一点的最聪明的方法是什么,以便在整个程序中一致的用户体验是好的,并且在主循环中尽可能快地响应以执行该功能。将按钮连接到IO的电路使用10kΩ上拉电阻,这也意味着我还需要一些去抖动。MCU是STM32L4,固件将使用C语言编写,因此不涉及RTOS。注意我将尝试不在主循环中使用任何类型的延迟,以便尽可能保持响应
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
因此,对于初学者,需要跟踪按钮打开或关闭的时间长度,通常只需按某个时间间隔轮询按钮输入即可。这可以在低优先级定时器中断中完成,也可以在主循环中使用简单的秒表任务调度程序完成。但是,不要直接在主循环中进行轮询,因为这将导致不稳定的时序,因为主循环的重复率将取决于系统中发生的其他情况。为每个按钮保留一个计数器,并且在每次轮询时,如果按下按钮,则递增该计数器,否则将其设置为零。
您需要建立合适的阈值,以确定按钮在按下之前必须关闭多长时间(用于去抖动),以及必须按下多长时间才能注册长按。
除了计数器,还需要跟踪按钮的逻辑状态。例如,需要短按和长按操作,可以定义以下状态:
- // state //on the current polling cycle...
- BTN_UP, //...the button was physically in the up position
- BTN_DOWN, //...the button was physically in the down position
- BTN_PRESS, //...the button went from the up position to the down position
- BTN_RELEASE, //...the button went from the down position to the up position
- BTN_LONGRELEASE, //...the button was released after being down for a long time
- BTN_LONGPRESS, //...the button counter exceeded our long press threshold
- BTN_LONGDOWN, //...the button was physically in the down position and had been so for a long time
复制代码如果需要,你可以轻松地将其扩展为短期,中期,长期或超长期事件。
下一步是检查每个按钮的计数器值并更新按钮的逻辑状态,并对每个状态更改调用相应的操作。这部分相当简单,有几种方法可以解决这个问题。如果按钮在不同的上下文中执行不同的操作,则可以为每个按钮存储回调函数, 每个按钮的每个按钮事件的不同回调,或者将事件作为参数的单个回调。
一周热门 更多>