|
[评测]
关于键盘冲突那点事(3键冲突/7键冲突/PS2/USB的各种原理)
55
231615
楼主
本帖最后由 白金之星 于 2011-7-28 01:59 编辑
最近闲得无聊,正好看到有人发帖提问,于是就来详细说说所谓键位冲突和无冲突的各种原理——基本上这也是个老生常谈的话题了,但相关的技术帖比较零乱难找,而且充斥了大量电工术语,也不是很容易看懂。这里就尽量用通俗易懂的语言来讲(我的目标是即使你只有初中文化水平也能看懂,保守地说绝对不超过高中文科生能理解的范围),帖子比较长,有兴趣的朋友请慢慢阅读。慢慢看,用心理解,包你看懂。
为了降低阅读门槛,本文难免有不严谨之处,还请工科同学高抬贵手。如果是特别荒谬的原则性错误,欢迎指正。
——————电路基本常识:输出与输入——————
我们的手指按下一个键,电脑是怎么知道的呢?在这短短几十微秒的时间里发生了什么事呢?为什么有时候同时按下几个键就没反应了呢?首先要讲讲电路的通断。
即使你没有什么计算机知识,大概也应该听过一个词:【二进制】。不管你家里的电脑外表多么五颜六色,它底层的逻辑却是非黑即白,只有【1】和【0】。任何储存在你电脑里的东西,无论游戏、音乐还是你最钟爱的小电影,都是用一长串你数不清的1和0的组合来记录和处理的。
明白了这个概念以后,再想想,电脑电脑,它的基础是什么?对,要有【电】。下一个问题很自然地:这电怎么就能变成1和0呢?说来更简单,有电就是1,没电就是0呗——这么说似乎太不专业了。严谨一点说:在电路中一个点,它当前表示的数据是1还是0,需要检测这一点的电压到底是更接近【悬空】(对于USB和PS/2接口,指+5V),还是更接近【大地】(0V)。如果高于某个界限值,称作【高电平】,也就是1;而相对地,低于某个界限值,称作【低电平】,也就是0。
接下来的问题更是小学生也会答:1×1等于多少?
你当然知道答案是1。
那么1×0呢?
对了,不管什么数字乘以0,结果都是0。
如同在游泳池里面尿尿一样,一泡尿就把干净水变成脏水。大地就是这么邪恶:无数个悬空的点,它们之间互相连接还是悬空,然而只要其中有一个点接着地,它们就全等于接地了。
(重要知识)高电平的点和低电平的点连通短接之后,两点都成为低电平。
你压住不耐烦,看到这里,心想,这他妈的和键盘有毛的关系?
别着急,我们再来看看一个典型的可编程芯片是什么样子(图片引自泡泡网的poker拆解):
这个黑色方方的就是芯片,它周围那一排排张牙舞爪的刺叫做【引脚】,是芯片用来和外界沟通的渠道,图中这只芯片一共有48个引脚。
其中一些引脚负责电源、时钟、控制等基础功能,但占绝对多数的是负责输入/输出数据的,称为【I/O引脚】。
通过程序设置,芯片既可以改变每个I/O引脚的电压(设置1或0的值),也可以检测引脚的电压(读取1或0的值),以下如果没有特殊说明,提到引脚一词均指数据I/O引脚。
现在请假设这样一个场景:
你是一颗芯片,你的左手和右手是两个引脚,有一大团杂乱无章的导线,露出两个线头摆在你面前,你如何判断它们是否是同一根线的两头?(即这两个线头是否连通)
仔细考虑之后,聪明的你大概可以想到:只要把左手设置为0,右手设置为1,分别握上两个线头,然后检查右手的状态,如果变成0了,说明它们刚刚做过一次相乘运算,1被拉下水变成了0,这条线是连通的。
换一个比喻:如同一根管道,在左手的洞口放一只小老鼠,右手的洞口放一块奶酪(这只小老鼠的速度无敌快)。当小老鼠从左边进去,又从右边钻出来吃掉了奶酪,说明管道中间没有被堵死。
对,这就是键盘按键接通的原理。
在按键下面的【电路板】(或者电路薄膜)上,印制有许多导线,导线经过每个按键下方的部分是断开的。按键,也就是开关,当它压下的时候,下面的导线会被接通。而导线最终两端都是连接到芯片上,芯片会不停地反复检测每条线的连通情况,从而随时判断哪个键当前是按下的。这就好像学校的保安头子坐在监控室里,切换着镜头,偷窥哪个自习室中有男女生OOXX那样。
——————主控芯片与矩阵设计——————
我们继续深入话题:一块普通的键盘,少则几十个多则上百个按键,显然无论从哪个方面看,怎么都不可能给每个键都单独连个导线到CPU芯片去——先不说成本多高,谁愿意桌面上横着手腕粗的一大捆线呢?
在上个世纪末,电脑开始走入寻常百姓家庭,当时的PC界霸主是IBM公司。为了简化接口,顺便垄断标准,IBM陆续设计了XT、AT、PS/2协议用来处理键盘这样的输入设备,大体意思是,只要在键盘内部放一块主控芯片,用来管理所有按键状态并转换为串行信号,包括电源在内总共只要4根线就可以传输所有的数据(扫描码),而相应地,主板上也会有一个称作键盘控制器的IO芯片(一般集成在南桥中),把这些扫描码翻译为ASCII码给CPU。
最后,PS/2协议作为成熟而稳定的形态,成为了二十多年来的市场规范,也就是大家熟知的那个圆形接口,里面实际用到的4根线分别负责:时钟、数据、电源、接地。
上面这一段可能有点复杂,如果你没能全看懂,也没啥大碍,只是为了说明【键盘主控芯片】的存在。
总之,整理一下到目前为止的知识,现在你应当知道键盘是遵循如下的通讯过程:
【按键】——【键盘主控芯片】——(翻译成扫描码,经过PS/2协议)——【主板IO芯片】——(翻译成ASCII码)——【CPU】
这样看起来不错,但还有个问题:主控芯片是怎么“知道”所有键的状态的?
按照前面说的,要得知一个按键是否按下,需要在引脚A输出0,引脚B输出1,再检测引脚B的值是1还是0。(如果这里看不懂就麻烦了,请向上翻翻,复习一下左右手攥电线或者小老鼠吃奶酪的例子)
现在,假设我们要做一个36键的键盘,包括10个数字和26个英文字母。
于是我们令引脚A永远=0,而且连接到所有的按键上。
然后做引脚B1、B2、B3、……、B36,分别与对应的36个按键连接。
这样总共是需要37个引脚。
接着,先令所有B引脚=1,然后从B1到B36挨个检查,谁变成0了,就说明谁对应的按键按下了。当然,为了时刻获取最新的状态,每秒钟要进行几十至上百轮这样的扫描。
但是104个键的键盘怎么办?老老实实做105个引脚吗?这也太复杂了吧!有没有办法能用更小、更简单一些的芯片实现呢?要知道这可直接关系到成本啊。
工程师们想了个办法:【矩阵】。听起来很专业,其实就是利用“组合”,来成倍地提高引脚利用率。还拿上面的例子说,我们可以把引脚数量从37缩减到12。怎么做呢?
请想象一个表格,行标题为A1、A2、A3、A4、A5、A6,列标题为B1、B2、B3、B4、B5、B6。这样就构成了一个6×6=36的矩阵。然后把按键分别放到每个格子里面去,如下图。
在电路中,每个按键都是负责连接它所对应的两个引脚,比如按键A连接引脚A1和B1,而按键W连接A5和B4。这样一来,引脚之间就形成了【交叉组合关系】,也就是矩阵。任意两个引脚之间只通过一个按键连接。
现在我们按下J键,芯片中的程序是怎么检测到这个行动的呢?
首先令A1=0,其他所有引脚=1,然后从B1到B6挨个检查。由于那一列的按键都没有按下,没有任何一个B引脚和A1接通,因此它们的值都是1。
接下来,令A2=0,其他所有引脚=1,重复以上工作。接着再检查A3列……
最后所有行列检查完毕后,结果发现只有在A4=0的时候,B2=0,也就是说A4和B2是接通的。于是程序便通过预先定义好的按键表格,知道按下的是J键。
同样地,这一整轮扫描每秒要重复几十上百遍,所以你在任何时候敲下或抬起按键,电脑都能很快反应出来。
现在市面上绝大多数键盘的工作原理都是基于这种矩阵的。我们很容易想到,矩阵的行数乘以列数的结果,就是它能够容纳按键的最大数量。普通的104键键盘是应用16×8的矩阵,来覆盖所有按键。只需要24个数据引脚。
【待续】 |
评分
-
查看全部评分
|