键盘按键冲突那些事

      关于键盘的按键冲突,我们平时日常办公、游戏都或多或少会遇到,那么按键冲突是怎么来的,我们又是如何解决的呢?下面为大家一一解读。

1.什么叫按键冲突?

      简单的说,也就是当你同时按下键盘上的几个键的时候,这几个键不能同时反应出来,这就叫做键盘的键位冲突。例如你需要使用 QQ 的截图工具时,需要同时按下了 【Ctrl】、【Alt】 、【A】 这三个按键,但你的键盘只能读到 【Ctrl】、 【Alt】 而不能读到 【A】 时,此时就发现了按键冲突。

2.按键冲突是怎么产生的?

      在讲按键冲突怎么产生之前,我们先了解一下键盘按键的工作原理。

2.1 键盘按键工作原理

      大家虽然并不了解键盘的具体工作原理,但是相信很多玩家也都拆过薄膜键盘,键盘下面设计有线路板,上面印有很多导线,导线经过每个按键下方的部分是断开的。键盘上的每一个按键都相当于开关,当它压下的时候,下面的导线会被接通。然后交给电脑的 CPU 进行信号处理。

薄膜键盘内部构造

      但是我们总不能给每一个按键都设计一条线,然后连接到电脑中与 CPU 进行运算吧,想一想都感觉不靠谱,那我们怎么实现对键盘每一个按键的监视呢?

      这个难题在上世纪由电脑巨头 IBM 解决了,他在键盘内部设计了一款主控芯片(称为 MCU)、MCU 会检查测每条线的连通情况,从而随时判断哪个键当前是按下的,用来管理所有按键状态并转换为串行信号。

NXP LPC11U35 MCU(在键鼠上的主流 IC)

      这样用户仅仅需要 4 根线就可以将按下键盘的所有数据传输给主机内的 CPU 进行运算了。键盘的芯片又是如何得知每个按键的状态呢?不可能让所有的按键都连入芯片不同的引脚上,这样不仅增加成本,还无法节省空间。

      这时工程师想到了一个全新的办法:“矩阵”。即我们在高中学到的组合的方法,来实现高效率同时也更加节省成本的信号传输。

      在电路中,每个按键都是负责连接它所对应的两个引脚,比如按键 【1】 连接引脚 A1 和B1,而按键 【B】 连接 A5 和 B4。这样一来,引脚之间就形成了交叉组合关,也就是“矩阵”。任意两个引脚之间只通过一个按键连接。

      现在我们按下【R】键,芯片中的程序是怎么检测到这个行动的呢?

      首先令A1=0,其他所有引脚 = 1,然后从B1 到 B5 挨个检查。由于 A1 那一列的按键都没有按下,没有任何一个 B 引脚和 A1 接通,因此它们的值都是 1。

      接下来,令 A2=0,其他所有引脚 = 1,重复以上工作。接着再检查 A3 列……

      最后所有行列检查完毕后,结果发现只有在 A4=0 的时候,B2=0,也就是说 A4 和 B2 是接通的。于是程序便通过预先定义好的按键表格,知道按下的是 【R】 键。

      同样地,这一整轮扫描每秒要重复几十上百遍,所以你在任何时候敲下或抬起按键,电脑都能很快反应出来。

2.2 键盘按键冲突的产生

      还是以下面的图为例,由于工作或者游戏需要,我们同时按下了 【Q】、【2】、【W】三个按键。那么键盘是怎么处理的呢?


      首先,MCU 通过扫描后得到以下信息:

      A1 & B2 = 0 ---【Q】按键按下;

      A2 & B2 = 0 ---【W】按键按下;

      A2 & B1 = 0 ---【2】按键按下。

      但是,由于线路采用的是串联设计,所有当我们按下这三个按键时,导致 A1 & B1 也等于 0,造成了 【1】 按键按下的假象。

      按下同一个矩阵的四个角时便会出现键位冲突的现象。

      事实上,当我们按下这四个按键中的任何三个按键时,电脑得到的反馈都是相同的,而使得电脑无法处理我们刚才输入的信息。而设计矩阵的工程师也考虑到了这个问题,所以他们采用了保护处理,当我们在按下任意一个矩阵的两个交叉点时,键盘的另外两个交叉点,就会自动被锁定了,以防止电脑出现茫然的现象。根据上图也就是说,当我们按下 【Q】、【W】 这两个按键的同时,【1】、【2】按键已经被自动锁定了,用户即使按下去,电脑也得不到反馈,以让电脑能够正确的显示出【Q】、【W】 按键信息。

      这就是我们所说的键位冲突的问题。为什么不同的键盘会有不同的键位冲突呢?这因为不同品牌型号的键盘线路设计不可能是完全相同的,因此它们存在冲突的键位也不一样。只要不构成四角组合关系,大部分键都是可以随便同按的,普通的键盘,即使有这样那样的冲突,也足够日常使用了。

 

3.按键冲突怎么解决?

      由于很多游戏对于键盘的按键冲突还是有着比较高的要求的,市场上那些无冲突键盘又是采用了什么样的设计呢?这里便要提到一个二极管的名词。


二极管

      相信大家对于二极管都不会陌生,二极管有一个特性,电流只能从它的阳极流向阴极,而反向则难以通过。之前提到的键位冲突是因为当 A1 和 B2 、 A2 和 B2 、 A2 和 B1 分别连通时,程序误以为 A1 和 B1 也连通,因此当发现 3 个按键互相形成回路时,就屏蔽第三颗按键的设计。现在,我们在每个按键的电路中增加一个二极管,让电流只能从 A 端传向 B 端,而不能从B 跑向 A 。

      加入二极管后信号只会单项传输。

      回到之前的例子:

      同时按下 【Q】、【W】、【2】 三个键。尽管 【W】 键接通了 A2 和 B2 ,但由于二极管的限制,信息只能从 A2 到B2 传导,而不能从 B2 到 A2 ,这就不会使芯片检测到【1】 按键也是接通状态,便可以正确识别我们刚才按下了【Q】、【W】、【2】 这三个按键了。

      按照上面所讲,在硬件结构上加入二极管,也仅仅只能到 6 键无冲突 。而所谓的 6 键,是除去【Ctrl】、【Shift】、【Alt】、【Win】 之外的键,同时按下任意 6 个都不会有冲突,但第 7 个键按下就没有反应,或者会直接抹掉第一个键,总之逻辑上同时只能有 6 个键处于按下的状态。

      为什么会出现这种情况呢,根本原因在 USB 的传输协议上,USB 协议规定,键盘会以某个固定的回报率(每秒 125-1000 次),定期向主机发送当前按键的状态,每次发送 8 个字节,这 8 个字节的具体内容则是:

      第一个字节:8 位分别表示左右的【Ctrl】、【Shift】、【Alt】、【Win】 各自是否被按下。这8个键统称为“modifer key”,因为规范已经事先定义好每一位的含义,从而得以能够只用一个字节就表示8个键的状态。

      第二个字节:保留(无用)

      其余 6 个字节:当前正按下的  6 个普通按键(如果按了 7 个以上,根据键盘 MCU 内置的程序,可能取最先按的 6 个,也可能取最后按的 6 个)。即可以发送最多 14 个按键的状态信息。

      所以说,在 USB 协议下,包含两边的 【Ctrl】、【Shift】、【Alt】、【Win】 在内,单键盘最多只能同时识别 14 个键。如果只算普通键,则只能同时识别 6 个。这便是市场 6 键无冲键盘出现的原因。

      而最近刚兴起的机械键盘全键无冲技术,则是通过修改 USB 协议,将一个物理键盘虚拟成多个逻辑键盘实现的,可以一次性将全部的按键数据发送,实现全键无冲。

      关于按键冲突的部分已讲解完成,谢谢大家关注。

      后续将为大家介绍大联大世平集团的键盘方案。

 

博文预告:

  • NXP QN9080 USB+BLE+2.4G 三模键盘方案介绍
  • NXP LPC51U68 EZH 键盘方案介绍
  • NXP LPC11U35 USB 键盘方案介绍
  • NXP LPC54605 2000回报率高性能键盘方案介绍


【参考资料】:

①  《 所谓键位冲突和无冲突的各种原理 》
②  《 进阶高玩必知 游戏键盘防冲突完全解析 》
③  《 关于键盘冲突那点事(3键冲突/7键冲突/PS2/USB的各种原理) 》

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论