这是产品。我理解这个想法:这16个按钮使用4x4矩阵。行4线,列4线,我们有8根电缆。
但:
没有任何多路复用器怎么办?
这样可以准确检测多个按钮的按下情况吗?即使按钮使用同一行或同一列?示例:同时按下位置(2,2)(2,3),(3,2)和(3,3)的按钮。
它是如何工作的?
这是产品。我理解这个想法:这16个按钮使用4x4矩阵。行4线,列4线,我们有8根电缆。
但:
没有任何多路复用器怎么办?
这样可以准确检测多个按钮的按下情况吗?即使按钮使用同一行或同一列?示例:同时按下位置(2,2)(2,3),(3,2)和(3,3)的按钮。
它是如何工作的?
Answers:
没有任何多路复用器怎么办?
没有。键盘板上似乎只有开关,也许还有一些我们看不到的二极管。但是,左侧板看起来像上面有处理器。几乎可以肯定,多路复用是在固件中完成的。
复用算法的工作原理如下:
重复上述过程的速度要足够快,以便在人类观察者仍然觉得是瞬间的时间内检查所有按钮。在这种情况下,“瞬时”的人为极限约为50毫秒。即使是低端微控制器也可以用更少的时间扫描4x4键盘。
这样可以准确检测多个按钮的按下情况吗?
大概是。一种方法是在每个按钮上串联一个二极管。这些可能在您显示的面板的底部。使用二极管,上述算法可以正常工作。
另一种方法是将电阻器与线路串联并测量其模拟电压。即使使用多个按钮将多个行/列线短路在一起,您最终也可以弄清楚按下了哪些按钮。这就要求微型中的A / D输入,而不仅仅是使用二极管时的数字输入。
没有二极管...您将得到幻影矩形。
例如,在您的示例(2,2)(2,3),(3,2)和(3,3)中;您通过选择一个矩形来选择一个具有讽刺意味的示例。如果您实际上按了全部四个,则它将起作用。但是,如果按矩形的任何三个角,第四角落也会出现被按下,即使它不是。
该键盘显然是用于键盘数据输入的,用户约定一次只能按下一次。您会注意到,例如,加油站信用卡输入键盘上没有“ Shift”键。
但是,如果您将S1设置为Shift键,而将S3设置为alt Shift键,以便用户在按住S13的同时合理地按住两者,则S15也会被按下。
我已经在裸露的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之后,您将用一位代表键按下所在的列。请记住在重新配置端口之前禁用中断,因为这可能会触发不需要的中断。退出中断例程时,可能必须清除中断标志,以防止重复的中断处理。