!!
如何用最少的 IO 口去扫描更多的按键呢?我来啦
用最少的IO口扫描最多的按键
https://zhuanlan.zhihu.com/p/659714674
# 缘起
最近再做一个按键,后来就打开了新世界的大门。
3 个按键能扫描 9 个按键。5 个按键扫描 25 个。
妥妥的榨干芯片的性能。
# 原理图如下
这里我只画了 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
- 略略略。。。自己体会吧【懒🎃】
那么电路图咋想出来的呢?
只有鬼知道了。。。