这段程序是用于按键扫描的函数,它通过读取 IO 状态来判断按键的状态,并使用状态机模型和延时回调函数机制来实现按键的单击、长按和消抖。

首先,函数 KEY_Scan 通过调用 IoKey_Scan 更新 IO 状态。然后,它遍历所有按键,并根据当前按键状态和时间间隔判断按键的动作。

对于每个按键,函数会判断其当前状态。如果按键处于断开状态 (eKeyState == IO_KEY_OFF),则根据当前按键动作进行处理:

  • 如果按键动作是长按 (eKeyAction == KEY_ACTION_PRESS),则判断 uiLossenTic 是否小于 (0xFFFF - cycleTime),如果是,则 uiLossenTic 增加 cycleTime。然后判断 uiLossenTic 是否大于等于 uiAntiShakeTime,如果是,则将按键动作设置为松开 (KEY_ACTION_LOSSEN)。

  • 如果按键动作是按下松开或未按下,则将按键动作设置为未按下 (KEY_ACTION_NO_PRESS),同时将 uiPressTic 清零,并判断 uiLossenTic 是否小于 (0xFFFF - cycleTime),如果是,则 uiLossenTic 增加 cycleTime。

如果按键处于闭合状态 (eKeyState != IO_KEY_OFF),则根据当前按键动作进行处理:

  • 如果按键动作不是松开 (eKeyAction != KEY_ACTION_LOSSEN),则根据当前按键动作进行处理:

    • 如果按键动作是长按 (eKeyAction == KEY_ACTION_PRESS),则将 uiLossenTic 置零。
    • 判断 uiPressTic 是否小于 (0xFFFF - cycleTime),如果是,则 uiPressTic 增加 cycleTime。然后判断 uiPressTic 是否大于等于 uiAntiShakeTime,如果是,则将按键动作设置为按下 (KEY_ACTION_PRESS)。
  • 如果按键动作是松开,则将按键动作设置为未按下 (KEY_ACTION_NO_PRESS),同时将 uiPressTic 和 uiLossenTic 分别置零和置一。

在判断完按键状态后,函数开始处理回调函数。如果按键的回调函数不为空,则进行处理:

  • 如果 refreshNotifyTic 大于 0,说明需要进行延迟回调处理。如果 refreshNotifyTic 大于等于 cycleTime,则将 refreshNotifyTic 减去 cycleTime。如果 refreshNotifyTic 等于 0,则调用回调函数。

  • 如果按键状态发生改变,或者按键状态为长按,立即调用回调函数。

最后,函数将当前按键动作保存到 eKeyActionBak 中,以便下一次比较使用。

消抖原理:

代码中使用 uiAntiShakeTime 来实现按键消抖。当按键按下时,程序会记录按下时间,并比较按下时间是否大于 uiAntiShakeTime。如果大于,则认为按键是真正的按下,而不是抖动。

长按处理:

代码中使用 refreshNotifyTic 来实现长按处理。当按键按下时,程序会记录按下时间,并判断按下时间是否大于 uiAntiShakeTime。如果大于,则认为按键是长按,并启动延迟回调函数,以便在长按时间结束后执行相应的操作。

总结:

这段程序通过判断按键状态和时间间隔,并利用状态机模型和延时回调函数机制,实现了按键的单击、长按和消抖功能。代码逻辑清晰,易于理解和移植,适合应用于各种嵌入式系统中。

C 语言按键扫描程序分析 - 如何判断单击、长按和消抖

原文地址: http://www.cveoy.top/t/topic/bGnh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录