#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 置 1asserted &= (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