!!

如何用最少的 IO 口去扫描更多的按键呢?我来啦

# 缘起

最近再做一个按键,后来就打开了新世界的大门。

3 个按键能扫描 9 个按键。5 个按键扫描 25 个。

妥妥的榨干芯片的性能。

# 原理图如下

image-20231010214548831

这里我只画了 3 个 IO 口的。

大家也可以看到,它是沿着对角线有一个二极管。那么增加更多的按键,就斜着往上拓展吧。

# 原理

1. 整体规划:按键扫描存在 4 个步骤,每个步骤停留一段时间(20ms)去检索状态。

2. 第一步拉高 P32、P33、P34:

  • 判断 P32,P33,P34 的电平,P32 低则 SW2 按下,P33 低则 SW3 按下,P34 低则 SW4 按下。

3. 第二步拉高 P33、P34,拉低 P32:

  • 判断 P33,P34 的电平,P33 低则 SW5 按下,P34 低则 SW6 按下。

4. 第三步拉高 P32、P34,拉低 P33:

  • 判断 P32,P34 的电平,P32 低则 SW7 按下,P34 低则 SW8 按下。

5. 第四步拉高 P32、P33,拉低 P34:

  • 判断 P32,P33 的电平,P32 低则 SW9 按下,P33 低则 SW10 按下。

6. 循环往复:如此循环往复,便通过 3 个 GPIO 检索了 9 个按键,极大节省了 GPIO 的开销。

也就是说:咱们主动拉低一个引脚,然后去检索另外两个。如果按键按下了,会有一个引脚受影响的。

是不是嘎嘎神奇。

# 思考

这里我们思考一下:3 个 IO->3 位 -> 1 1 1 -> 有几种可能呢?

000 001 010 011 100 101 110 111

再总结一下之前的:假设 000 这三位(按顺序 P32,P33,P34)

那么:

第一步:拉高 P32、P33、P34【初始:111】

  • 检测按键
  • 011 就是 P32 低,则 SW2 按下。
  • 101 就是 P33 低,则 SW3 按下。
  • 110 就是 P34 低,则 SW4 按下。

第二步:拉高 P33、P34,拉低 P32【初始:011】

  • 检测按键
  • 001 就是 P33 低,则 SW5 按下。
  • 010 就是 P34 低,则 SW6 按下。

第三步:拉高 P32、P34,拉低 P33【初始:101】

  • 检测按键
  • 001 就是 P32 低,则 SW7 按下。
  • 100 就是 P34 低,则 SW8 按下。

第四步:拉高 P32、P33,拉低 P34【初始:110】

  • 检测按键
  • 010 就是 P32 低,则 SW9 按下。
  • 100 就是 P33 低,则 SW10 按下。

这样就发现规律了吧。

# 总结

授人以鱼不如授人以渔

我也在思考这件事。所以第一位发明这个的美国大佬是怎么想到的呢?

三个按键:111

  • 首先就有 3 种可能了 011 101 001
  • 如果主动锁定其中 1 个按键,【初始 011】 那么又可以有两种可能 010 001
  • 再锁定 1 个呢?【初始 101】两种可能 001 100
  • 再来【初始 110】两种可能 010 100
  • 再来。。。来个锤子🔨没了

五个按键:11111

  • 首先五种可能 01111 10111 11011 11101 11110
  • 略略略。。。自己体会吧【懒🎃】

那么电路图咋想出来的呢?

只有鬼知道了。。。

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

flechazo 微信支付

微信支付

flechazo 支付宝

支付宝

flechazo 贝宝

贝宝