键盘的电路属于矩阵式,也就是各个引脚之间连线相互交叉,在这些交叉点上安排按键。键盘控制器探测到闭合电路就认为是键被按了。
下图是一个简单的键盘。
其中A,B,C,D是4个按键,分别位于结点R1C1,R1C2,R2C1和R2C2。
实际的电路大概是这样的。
检测按键按下的时候,键盘控制器对所有的列逐一通电。若A,B,C,D均没有按下,则R1,R2没电。
若按下A键,则C 1通电时R 1带电,C2通电时R1,R2不带电,可知A键被按下了。如下图所示。
同理可知一个键被按下的情况。
若A和D两键同时按下,则C 1通电时R1带电,C2通电时R2带电。如下两图所示。
同理可知其他两键被按下的情况。
若同时按下A,B,D三键,则会产生键盘拖毛与键盘遮蔽。
给C 1通电时,如下图所示,R1和R2都会带电。
因为给C1通电时R2带电,所以C键会被认为按下了,其实并没有按下,这就是传说中的键盘拖毛。
若此时按下C键,因为C键已经被认为是按下了,所以没有反应,这就是传说中的键盘遮蔽。放开B键也是一样的问题,会被认为没有放开。
在qwerty键盘上,同时按下 “e”和 “c”是再按 “u”的话大概会产生键盘遮蔽的现象。
再其他的键盘布局,如azerty或dvorak貌似没有这种问题。
解决办法:加装二极管,如图所示。
可以使用1N4148开关二极管,每个大约两分钱。
原作者Dave Dribin