按键去抖方法

发布于:2024-12-18 ⋅ 阅读:(164) ⋅ 点赞:(0)
#include <stdint.h>

/*
 * debounce
 * A function like this will debounce up to eight input pins.
 * Simply call it each time the raw state is reread
 * and use the returned value for the debounced signals.
 * To require three or more consecutive readings be the same,
 * simply replace previous with two or more prior states.
 *
 * 消抖
 * 这样的函数最多可对八个输入引脚进行消抖。
 * 只需在每次重新读取原始状态时调用该函数
 * 并将返回值用于去抖信号。
 * 如需三个或更多连续读数相同,
 * 只需将 previous 替换为两个或更多先前状态即可。
 */
uint8_t debounce(uint8_t current)
{
    static uint8_t asserted = 0x00;
    static uint8_t previous = 0x00;
    /* 
     * Compare the current and previous states of each input.
     * 比较每个输入引脚的当前状态和上一次的状态。
     */
    asserted |= (previous & current); // Assert newly "on" inputs. 将稳定输入 "1" 引脚对应 bit 置 1
    asserted &= (previous | current); // Clear newly "off" inputs. 将稳定输入 "0" 引脚对应 bit 清 0
    /*
     * Update the history.
     * 更新历史状态。
     */
    previous = current;
    /*
     * Return the debounced inputs to the caller.
     * 将已经消除抖动过后的输入返回给调用者。
     */
    return (asserted);
} /* debounce() */

这么理解:
asserted  |= 旧&新,是把前后状态都是1的bit更新进asserted,状态是1,就是说稳定的没有按下。
asserted &= 旧| 新,是把前后状态都是0的bit更新进asserted,状态是0,就是说稳定的按下。
凡是,前后状态不一致的,等于废物。

基础知识:
A|B,有1则1,全0才为0,用来筛选全0
A&B,有0则0,全1才能为1,用来筛选1


网站公告

今日签到

点亮在社区的每一天
去签到