使用STM32L4 MCU检测按钮按下和切换操作的最佳方式

2019-07-14 17:42发布

我需要根据按下按钮的持续时间执行某些操作。这是我想要达到的目标:100毫秒:改变brigtness 50%。(那些我已经想出的亮度变化功能)200毫秒:改变brigtness 100%。我想知道实现这一点的最聪明的方法是什么,以便在整个程序中一致的用户体验是好的,并且在主循环中尽可能快地响应以执行该功能。将按钮连接到IO的电路使用10kΩ上拉电阻,这也意味着我还需要一些去抖动。MCU是STM32L4,固件将使用C语言编写,因此不涉及RTOS。注意我将尝试不在主循环中使用任何类型的延迟,以便尽可能保持响应
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
tinlyxian
1楼-- · 2019-07-14 20:28
我的意思是这里最好的方法,或者这种类型的MCU意味着非常有效的代码。3.我的意思是这里的用户必须感觉是一致的,因此代码必须具有低延迟的观点,以便快速检查用户已经有一段时间并且必须进行相应的操作。
皮皮鲁鲁鲁皮
2楼-- · 2019-07-15 02:09
“非常有效的代码/低延迟”。鉴于大多数执行时间可能会花在等待用户输入上,因此从用户的角度来看,你必须编写非常糟糕的代码才能使这么简单的任务响应不够。无论如何,你需要在后台执行其他任务(检查其他键,更新一些显示,传输一些数据,......)
Green_LJ
3楼-- · 2019-07-15 04:25
如果你希望得到最好的帮助,特别是在使用户界面感觉更好的技巧方面,列出开关总数及其用途以及完整的预期命令结构将无济于事。你按什么回来一首歌或开启随机播放,打开或关闭设备电源,暂停或启动自毁?
werywer
4楼-- · 2019-07-15 05:19
首先,你需要定义软件实际响应的事件。使用按下按钮100秒执行操作A的按钮示例,按下200ms时按动作B,你可能不想在按钮保持100ms时触发动作A,因为那时用户想要动作B你在动作B之前总是会触发动作A.所以相反,你想要在保持按钮100ms后释放按钮时触发动作A. 其他时候,可能希望立即采取行动,并尽可能减少延迟(当然,在考虑去抖后!)。由此我们可以推断,您不仅需要跟踪按钮被按下的时间长度,还要跟踪逻辑状态转换。
因此,对于初学者,需要跟踪按钮打开或关闭的时间长度,通常只需按某个时间间隔轮询按钮输入即可。这可以在低优先级定时器中断中完成,也可以在主循环中使用简单的秒表任务调度程序完成。但是,不要直接在主循环中进行轮询,因为这将导致不稳定的时序,因为主循环的重复率将取决于系统中发生的其他情况。为每个按钮保留一个计数器,并且在每次轮询时,如果按下按钮,则递增该计数器,否则将其设置为零。
您需要建立合适的阈值,以确定按钮在按下之前必须关闭多长时间(用于去抖动),以及必须按下多长时间才能注册长按。
除了计数器,还需要跟踪按钮的逻辑状态。例如,需要短按和长按操作,可以定义以下状态:
  1. // state         //on the current polling cycle...
  2. BTN_UP,          //...the button was physically in the up position
  3. BTN_DOWN,        //...the button was physically in the down position
  4. BTN_PRESS,       //...the button went from the up position to the down position
  5. BTN_RELEASE,     //...the button went from the down position to the up position
  6. BTN_LONGRELEASE, //...the button was released after being down for a long time
  7. BTN_LONGPRESS,   //...the button counter exceeded our long press threshold
  8. BTN_LONGDOWN,    //...the button was physically in the down position and had been so for a long time
复制代码
如果需要,你可以轻松地将其扩展为短期,中期,长期或超长期事件。
下一步是检查每个按钮的计数器值并更新按钮的逻辑状态,并对每个状态更改调用相应的操作。这部分相当简单,有几种方法可以解决这个问题。如果按钮在不同的上下文中执行不同的操作,则可以为每个按钮存储回调函数, 每个按钮的每个按钮事件的不同回调,或者将事件作为参数的单个回调。

一周热门 更多>