仅用8根线如何连接16个按钮?


9

是产品。我理解这个想法:这16个按钮使用4x4矩阵。行4线,列4线,我们有8根电缆。

在此处输入图片说明

但:

  1. 没有任何多路复用器怎么办?

  2. 这样可以准确检测多个按钮的按下情况吗?即使按钮使用同一行或同一列?示例:同时按下位置(2,2)(2,3),(3,2)和(3,3)的按钮。

  3. 它是如何工作的?


7
在Google搜索“键盘多路复用”之类的内容时,您会发现这是常识。在发布之前,您没有先尝试过吗?
TonyM,2017年

3
@TonyM当然,我做了很多搜索,甚至还订购了几天前到达家中的一些多路复用器芯片74HC164。当我发现这一点时,我正准备使用该多路复用器芯片进行所有布线。然后,我想知道“没有任何多路复用器怎么办?”?
巴斯基(Basj)

1
左侧的设备内部必须具有复用代码
Marcelo Espinoza Vargas

3
@TonyM感谢您指出这个。您可以链接PDF而不是做个谜;)吗?也许我搜索了除键盘等以外的其他关键字,但可能找不到相同的关键字。
巴斯基(Basj)

1
@Basj:多次按下不是问题。您一次又一次扫描所有四行。如果发现在第1行中按下了某个按钮,则将其记录下来。当涉及到第3行时,您会发现在那里按下了另一个按钮,您也注意到了这一点。最后,您将获得两个按钮。只要您能够以比人们按下按钮快得多的速度进行扫描,您就不会错过它。
加博尔

Answers:


24
没有任何多路复用器怎么办?

没有。键盘板上似乎只有开关,也许还有一些我们看不到的二极管。但是,左侧板看起来像上面有处理器。几乎可以肯定,多路复用是在固件中完成的。

复用算法的工作原理如下:

  1. 驱高一排,其他驱使低。

  2. 在列线上启用被动下拉。

  3. 查看哪些列线高。按下这些列线与一条断言的行线相交处的按钮。释放该行上的其他按钮。

  4. 重复回到第一步,依次声明下一行。

重复上述过程的速度要足够快,以便在人类观察者仍然觉得是瞬间的时间内检查所有按钮。在这种情况下,“瞬时”的人为极限约为50毫秒。即使是低端微控制器也可以用更少的时间扫描4x4键盘。

这样可以准确检测多个按钮的按下情况吗?

大概是。一种方法是在每个按钮上串联一个二极管。这些可能在您显示的面板的底部。使用二极管,上述算法可以正常工作。

另一种方法是将电阻器与线路串联并测量其模拟电压。即使使用多个按钮将多个行/列线短路在一起,您最终也可以弄清楚按下了哪些按钮。这就要求微型中的A / D输入,而不仅仅是使用二极管时的数字输入。


1
谢谢。那么,同时按下多个按键呢?注意:左面板是RaspberryPi。
巴斯基(Basj)

1
@海曼为什么会这样?你能给个例子吗?如果没有二极管,为什么同时按下(1,2),(2,2)和(3,3)是一个问题?也许您会有小的原理图?由于这一点确实至关重要,因此值得@Hayman一个专门的答案吗?
巴斯基(Basj)

8
+1表示“左板看起来好像有处理器”。很喜欢
恩里克·布兰科

3
@Basj很明显,如果您使用它。每当您按下按钮时,即会将行连接到列。每当连接行和列时,相交处的按键都会按一下记录。但是,如果至少按下3个键,则可以间接连接行和列。
霍布斯(Hobbs)2017年

2
@Basj看看这张照片。红线表示逻辑高电平。如果按住带有“ x”指示的3个按钮,则可以跟踪它们并查看信号流动的路径。首先,选择行1并将其设置为高电平,通过按按钮1,1,使第一列为高电平。通过按按钮1,2,我们现在将第2行设为高。现在,如果我们在第2行上按下任何其他按钮,我们将使另一列高。问题在于,μC太笨了,它知道将行1设置为高电平并在列3上看到高电平,因此认为按钮1,3是高电平
Doodle

9

没有二极管...您将得到幻影矩形。

例如,在您的示例(2,2)(2,3),(3,2)和(3,3)中;您通过选择一个矩形来选择一个具有讽刺意味的示例。如果您实际上按了全部四个,则它将起作用。但是,如果按矩形的任何三个角,第四角落也会出现被按下,即使它不是。

该键盘显然是用于键盘数据输入的,用户约定一次只能按下一次。您会注意到,例如,加油站信用卡输入键盘上没有“ Shift”键。

但是,如果您将S1设置为Shift键,而将S3设置为alt Shift键,以便用户在按住S13的同时合理地按住两者,则S15也会被按下。


1
确实,大多数数据输入键盘一次都不会按下两个以上的键,因此没有问题。音乐键盘是另一个故事,因为一次可以按下许多键。它们中的大多数每个按键都有二极管或独立的接线。但是我确实在一家二手商店中找到了一个音乐键盘(价格为9欧元),该键盘无法一次按下多个键,因此无法做出适当的调整,并且结果令人讨厌!
Level St

按键开关可以是内置二极管的类型,也可以是隐藏在其下方的二极管。
rackandboneman

1

没有连续扫描的方法如下:

  • 将所有驱动程序设置为高
  • 在接收线路上启用被动下拉
  • 设置引脚更改中断以检测其中之一变高(或电平变化)
  • 发生这种情况时,启用键盘扫描,例如每10ms
  • 正常扫描并处理按键
  • 没有事件的超时后,停止扫描并在第一个项目符号点重新启动

0

我已经在裸露的Atmel AVR微控制器上使用汇编语言完成了此任务。
为简单起见:键盘行:使用Arduino引脚4,5,6和7(AVR引脚PD4,PD5,PD6和PD7)键盘列:使用Arduino引脚8、9、10和11(AVR引脚PB0,PB1,PB2和PB3 )使行引脚输入启用上拉功能。使列引脚输出并向其输出零。在所有行和列引脚上启用引脚更改中断。 http://playground.arduino.cc/Main/PinChangeInterrupt 按下键盘上的按钮会将行引脚拉低。中断例程需要读取行引脚并找到哪个引脚为低电平。高4位应为三个1和一个零。如果使用uint8_t 8位变量,则可以将其除以16或(var >> 4),以将4位放入数字的低位。您可以使用按位OR | 使用240进行操作以将高4位设置为1s,然后按位进行NOT〜操作以将所有位取反,因此您只需设置一个位来表示按下按钮的行。将此数字存储为0、1、2或3。
切换引脚配置:
使列引脚输入具有上拉功能。使行引脚输出并向其输出零。读取列引脚并找到哪个引脚为低电平。使用此值进行类似的操作,除了不必将数字向右移动。在var ^ 240和^ var之后,您将用一位代表键按下所在的列。请记住在重新配置端口之前禁用中断,因为这可能会触发不需要的中断。退出中断例程时,可能必须清除中断标志,以防止重复的中断处理。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.