完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我需要根据按下按钮的持续时间执行某些操作。 这是我想要达到的目标: 100毫秒:改变brigtness 50%。(那些我已经想出的亮度变化功能) 200毫秒:改变brigtness 100%。 我想知道实现这一点的最聪明的方法是什么,以便在整个程序中一致的用户体验是好的,并且在主循环中尽可能快地响应以执行该功能。 注意我将尝试不在主循环中使用任何类型的延迟,以便尽可能保持响应
|
|
相关推荐
5个回答
|
|
1、你应该指出是使用功能齐全的操作系统(哪一个?),还是一些库(哪些?),或者是否想要使用裸机。2、“因此用户体验良好”也不够具体,“整个程序一致”并不能使其更清晰。3、最后,它看起来像编程问题,所以我不确定它是最好的问题。
|
|
|
|
我的意思是这里最好的方法,或者这种类型的MCU意味着非常有效的代码。3.我的意思是这里的用户必须感觉是一致的,因此代码必须具有低延迟的观点,以便快速检查用户已经有一段时间并且必须进行相应的操作。
|
|
|
|
“非常有效的代码/低延迟”。鉴于大多数执行时间可能会花在等待用户输入上,因此从用户的角度来看,你必须编写非常糟糕的代码才能使这么简单的任务响应不够。无论如何,你需要在后台执行其他任务(检查其他键,更新一些显示,传输一些数据,......)
|
|
|
|
如果你希望得到最好的帮助,特别是在使用户界面感觉更好的技巧方面,列出开关总数及其用途以及完整的预期命令结构将无济于事。你按什么回来一首歌或开启随机播放,打开或关闭设备电源,暂停或启动自毁?
|
|
|
|
首先,你需要定义软件实际响应的事件。使用按下按钮100秒执行操作A的按钮示例,按下200ms时按动作B,你可能不想在按钮保持100ms时触发动作A,因为那时用户想要动作B你在动作B之前总是会触发动作A.所以相反,你想要在保持按钮100ms后释放按钮时触发动作A. 其他时候,可能希望立即采取行动,并尽可能减少延迟(当然,在考虑去抖后!)。由此我们可以推断,您不仅需要跟踪按钮被按下的时间长度,还要跟踪逻辑状态转换。
因此,对于初学者,需要跟踪按钮打开或关闭的时间长度,通常只需按某个时间间隔轮询按钮输入即可。这可以在低优先级定时器中断中完成,也可以在主循环中使用简单的秒表任务调度程序完成。但是,不要直接在主循环中进行轮询,因为这将导致不稳定的时序,因为主循环的重复率将取决于系统中发生的其他情况。为每个按钮保留一个计数器,并且在每次轮询时,如果按下按钮,则递增该计数器,否则将其设置为零。 您需要建立合适的阈值,以确定按钮在按下之前必须关闭多长时间(用于去抖动),以及必须按下多长时间才能注册长按。 除了计数器,还需要跟踪按钮的逻辑状态。例如,需要短按和长按操作,可以定义以下状态:
如果需要,你可以轻松地将其扩展为短期,中期,长期或超长期事件。 下一步是检查每个按钮的计数器值并更新按钮的逻辑状态,并对每个状态更改调用相应的操作。这部分相当简单,有几种方法可以解决这个问题。如果按钮在不同的上下文中执行不同的操作,则可以为每个按钮存储回调函数, 每个按钮的每个按钮事件的不同回调,或者将事件作为参数的单个回调。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2255 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2071 浏览 3 评论
4687 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2215 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2757 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 12:32 , Processed in 0.817061 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号