我正在构建一个键盘,一些固件在用 C 语言编程的无线模块上运行。我正在尝试推出我自己的去抖动算法,并且可以使用一些帮助。本质上,这是代码的布局方式:
#define DEBOUNCE 5
- 这个值可以是从 1(不建议,不是真正的去抖动)到无穷大(出于显而易见的原因也不建议)的任何值。我用这个去抖动 32 个按钮,所以接下来我使用以下方法创建一个 32 位整数数组:
static uint32_t key_integration[DEBOUNCE];
在每次扫描输入(1KHz 轮询率)时,我将数组的倒数第二个项目移动到最后一个,将倒数第三个移动到倒数第二个,等等,直到我最终输入键的原始扫描到第 0 个数组项。(附带的问题:比仅仅从 0 迭代循环到 DEBOUNCE-2 更简单的方法?如果我有一个 (32*DEBOUNCE) 位整数,我会使用按位移位,但是......无论如何。)
现在我遇到困难的棘手部分:将数组结果与当前(去抖动)键状态进行比较。本质上,如果 key_integration int 的位 X 是 1 是所有数组,我想将它与当前(去抖动)键状态进行异或,以查看它是否已更改。如果 key_integration int 的每个位 X 在所有数组中都是 0,我也想做同样的事情。如果位 X 在数组中分散为 1 和 0,则它仍在去抖动并且不需要进行比较。
我目前对如何将 key_integration 数组与去抖键状态 int 进行比较感到困惑。我非常感谢有关如何 A)比较它们或 B)重构代码以更简单的方式完成相同结果的建议。我绝对不能相信我所想的就是最好的方法。