一次按键,触发二次OnKeyPress事件!

探讨 OnKeyPress 事件中出现的偶发性 AV 错误问题,并提出将事件更改为 onKeyDown 的解决方案。
OnKeyPress事件中有释放动作,二次触发,使得产生AV错误!!这是个偶发性的BUG,改为onKeyDown事件!
按键回调功能在嵌入式系统中是非常重要的机制,它使得按键按下后可以立即执行特定的功能逻辑,而无需在整个主循环中不断轮询按键状态。这种设计不仅提高了代码的可维护性,也增强了系统的响应性和模块化程度。 --- ## 按键回调功能的作用(以你提供的代码为例) 在你的 `main.c` 文件中,有如下代码: ```c // 按键处理(带回调函数) Key_Process(OnKeyPress, NULL); ``` 以及定义好的回调函数: ```c static void OnKeyPress(void) { sys.motor_state = !sys.motor_state; if (sys.motor_state) { Motor_DriveForward(sys.duty_cycle, sys.duty_cycle); } else { Motor_StopAll(); } } ``` ### ✅ 功能解析 - `Key_Process()` 是一个封装好的按键处理函数,接受两个参数: - 第一个参数是**按键按下时要调用的回调函数**。 - 第二个参数是**长按事件的回调函数**(这里设为 `NULL` 表示不处理长按)。 - 当检测到按键被按下时,就会触发 `OnKeyPress()` 函数。 - 在 `OnKeyPress()` 中,实现了以下功能: - 切换电机状态(开/关)。 - 如果开启,则让电机以固定占空比前进;如果关闭,则停止所有电机。 --- ### 🧠 回调机制的好处 1. **解耦逻辑与硬件操作** - 主循环不需要关心按键具体是怎么检测的,只需要调用 `Key_Process()`。 - 按键的底层检测和触发逻辑由驱动或库实现。 2. **提高可扩展性** - 如果以后需要添加多个按键,每个按键绑定不同的回调函数即可。 - 不需要修改主循环结构。 3. **增强响应性** - 使用回调可以在按键触发的第一时间执行对应动作,而不是等到下一次主循环轮询。 4. **易于调试和维护** - 每个按键动作都有独立的函数处理,逻辑清晰,便于排查问题。 --- ### 📌 示例:更通用的按键回调接口 你可以将按键回调设计得更灵活一些,例如支持多个按键和不同类型的事件(短按、长按等): ```c typedef void (*KeyCallback)(void); void Key_Process(KeyCallback shortPress, KeyCallback longPress) { // 实现按键检测逻辑 if (key_short_pressed()) { if (shortPress != NULL) { shortPress(); // 执行短按回调 } } if (key_long_pressed()) { if (longPress != NULL) { longPress(); // 执行长按回调 } } } ``` 然后你可以定义多个回调函数: ```c void OnKeyShortPress(void) { sys.motor_state = !sys.motor_state; if (sys.motor_state) { Motor_DriveForward(sys.duty_cycle, sys.duty_cycle); } else { Motor_StopAll(); } } void OnKeyLongPress(void) { sys.duty_cycle += 0.1f; // 增加占空比 if (sys.duty_cycle > 1.0f) sys.duty_cycle = 0.4f; if (sys.motor_state) { Motor_DriveForward(sys.duty_cycle, sys.duty_cycle); } } ``` 并在主循环中使用: ```c Key_Process(OnKeyShortPress, OnKeyLongPress); ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值