|
[心得]
Monkey进阶教程:无冲键盘,修改行列值
18
41548
楼主

Monkey推出一个月以来,得到了很多朋友的支持,虽然我们之前写了详细的入门教程,但是对于一些朋友来说可能说得不够深入,趁现在有点时间,总结一下一些大家比较关心的问题。
首先需要明白一个很简单的问题,行列只是相对的!如果把矩阵旋转90度,行列就互换了。
很多朋友问Monkey是否支持无冲,需要如何设置。在这里要说明的是,支持无冲的不仅仅是控制器,键盘本身也要有对应的设计结构。我们知道,键盘控制器是通过检测按键按下时候电路的通断来确定按键位置的,先来说一下键盘的扫描机制,控制器为了能正常检测到每个键,一般是给每行(或每列)依次输出低电平(为什么输出低电平?需要明白什么是线与,不明白的不用去追究这个问题),然后检测全部的列(或行),如果有一个或者多个列(或行)为低,则所扫描到的行号(或列号)与读取到的为低电平的列(或行)可以确定一个按键的位置。具体到Monkey,则是从COL逐一输出低电平,然后检查ROW,比如接在COL3和ROW4的按键按下时,则在COL3输出低电平时ROW4会检测到低电平,由此可以知道该按键按下。
现在我们来看看键盘为什么会冲突,以下面的2*2矩阵键盘为例
在图片中,红色实线表示按键单独按下时电流的方向,当我们单独按下S1~S4中的每个键时,控制器都能正确的识别按键,但是如果我们同时按下S1,S2,S4时,控制器检测到的就不仅仅是三个键,连S3也会被认为已经按下,因为S3已经通过按下的另外三个键形成了一条通路(ROW1->COL1->ROW2->COL2,相当于ROW1和COL2形成了通路),如图片上的红色虚线所示,于是当扫描到COL2时检测到ROW1为低,也就是出现了常说的ghost key,这个时候我们通常说S1,S2,S4冲突(当然任意三个键也可以认为是冲突的)。同时我们也可以看出,同一行或者同一列的任意多个按键都是不会冲突的,因为它并不会导致其他行和某一列或者其他列与某一行连通的现象。
那么,如何才能做到各个按键互不影响呢?我们看到,在上面的例子中,误认为S3按下的回路中有一条回路不符合由ROW->COL的电流方向,那就是COL1->ROW2这条S2的通路,只要切断这条通路,S1,S2,S4就不会冲突了,但是我们又需要ROW2->COL1这条通路否则就检测不到S2这个按键了,于是具有单向导电特性的二极管就出场了,矩阵变成了下面的形式
同样的,为了避免S1,S3,S4冲突,需要在S3串连一个二极管,以此类推,每个按键都串联一个二极管以后,任意三个按键都不会冲突了,如下图
把2*2矩阵扩展到实际的键盘中,比如16*8等等,在每个按键上串联一个二极管以后,于是一个无冲的矩阵键盘就诞生了!
看到这里,可能有些网友还有疑问,这个二极管应该串在哪里,极性如何确定?有刚才介绍的Monkey的扫描原理可以知道,应该将二极管的正极对着ROW,负极对着COL,至于二极管是在按键前面还是后面没有关系。注意这里的ROW,COL不一定接的就是Monkey上的ROW,COL,前面已经说过,行和列只是相对的,那么如何找出行列(在这里按照习惯依然称之为行列)呢?我们可以通过键盘的走线来判断,数一下走线上接了几个按键,然后记录下来,一般来说,以接了8个按键(当然也并不绝对)为分界点,小于8个按键的为一组,多余8个按键的为另一组,如果分组正确,那么每组所接按键个数加起来应该是相等的,等于实际键盘上的按键个数。可能我们得到了9*13,10*14等等各种分组的形式,那么如何接到Monkey上呢?一个方法是对分组进行合并,有些分组的部分按键可能是缺失的,比如COL2上的ROW13,ROW14上并没有接按键,而COL3上刚好只接了ROW13,ROW14两个按键,于是可以把COL2和COL3并接在一起作为一个新的COL,但是可能也会遇到COL2与ROW12和COL3与ROW12上都接了按键,当合并的时候将会有两个同样编码的按键,并且无法区分,因此这个方法比较麻烦,同时可能导致按键重码现象,这个方法不被推荐。
比较简单的方法是重新设置Monkey的行列值,比如ROW*COL=14*9,那么我们可以把ROW设置为14~~(26-9)之间的任意四个数(需要先Key Map Read),则COL将会自动设置成26-ROW(如ROW为14,COL自动为12),如下图
于是问题又来了,Monkey上只有8个COL,那其他的COL在哪里呢?经过实验发现,当COL增加时,最后面的一个ROW将作为COL1,原来的COL序号依次增加,比如设置COL为9时,ROW18自动变成COL1,原来的COL序号依次加1,当COL为12时,ROW15->COL1,ROW16->COL2,ROW17->COL3,ROW18->COL4,原来的COL1~COL8将成为COL5~COL12。当设置完成以后,需要先点击一次Key Map Write,把设置写入Monkey,然后重新读出看看是否与设定的一致。接下来,就分别把找出的两组线分别接到ROW和COL上就可以啦,用不到的让它悬空即可,这个步骤略过。
对于某些二极管已经做到轴里面的键盘,而扫描方式与Monkey不一样的,这种键盘要实现无冲可以把内部的二极管换个方向,但是操作起来是十分麻烦的,倒不如把二极管短路来得简单一些(比如y2kjim之前改的键盘),还有一种方法不用去动里面的二极管,而且操作起来更简单,以ROW*COL=14*8为例,但是内部的二极管是COL->ROW的,通过刚才说的方法我们可以设置成ROW*COL=8*14,同时把原来接到COL的线改接到ROW,原来接ROW的线接到COL即可实现无冲。接下去的设置步骤,前面已经说过了,不再重复
一句话,ROW和COL只是相对的,可以互换,根据具体情况具体分析,还有就是,COLx和ROWx的数字下标只是为了区分同一组的不同元素,不用刻意去追究是否该与Monkey对应连接,因为Monkey有强大的设置功能,我们不用去记住哪个按键接在哪行哪列。
全文完。
Monkey历史资料:
Monkey出世:http://www.pcwaishe.cn/thread-128828-1-1.html
XT接口的Z-150改装实例:http://bbs.kbc-china.com/thread-4114-1-1.html
tw友人用Monkey修改的G80-1800:http://bbs.kbc-china.com/thread-4168-1-1.html
实达黑轴改装:http://www.pcwaishe.cn/thread-133570-1-1.html
苹果M0110A改装:http://www.pcwaishe.cn/thread-134109-1-1.html |
评分
-
查看全部评分
|