预设查表Set 2
在Scan Codes Tables Set 2中,键盘主要键位区Make Code每颗按键都是由1组8-bit位码(1Byte)组成,Break Code为2Bytes,其中Break Code第1个Byte皆为十六进位的F0,第2个Byte则与Mack Code相同。在主要键位区中,只有右侧Ctrl键与右侧Alt键不同,分别与左侧Ctrl键与左侧Alt键相比较,在Make Code部分多十六进位的E0,Break Code多十六进位的E0F0。
扩展功能键(Extended Keys)如键盘中间九宫格区(Insert、Delete等)、方向键区与右侧数字键区,与Number Lock关闭时的右侧数字键区功能重复。换句话说,因为扩展功能键常会随着Shift键与Number Lock键的开启与关闭而影响输出结果,所以独立定义出一组规则,不会与主要键位区相同。在Make Code会增加十六进位的E0,Break Code多出十六进位的E0F0。另外数字键区「/」、PrintScreen键、Pause键,这些也是有独立的Make Code与Break Code表示。
在Scan Codes Tables Set 2中,键盘主要键位区Make Code每颗按键都是由1组8-bit位码(1Byte)组成,Break Code为2Bytes,其中Break Code第1个Byte皆为十六进位的F0,第2个Byte则与Mack Code相同。在主要键位区中,只有右侧Ctrl键与右侧Alt键不同,分别与左侧Ctrl键与左侧Alt键相比较,在Make Code部分多十六进位的E0,Break Code多十六进位的E0F0。
扩展功能键(Extended Keys)如键盘中间九宫格区(Insert、Delete等)、方向键区与右侧数字键区,与Number Lock关闭时的右侧数字键区功能重复。换句话说,因为扩展功能键常会随着Shift键与Number Lock键的开启与关闭而影响输出结果,所以独立定义出一组规则,不会与主要键位区相同。在Make Code会增加十六进位的E0,Break Code多出十六进位的E0F0。另外数字键区「/」、PrintScreen键、Pause键,这些也是有独立的Make Code与Break Code表示。
USB HID限制6+2键
PS/2按键压下与放开,是分Make Code与Break Code送出,而USB界面下则完全不同。依据USB HID(Human Interface Devices)规范,它是将正在压下的按键信号送出,没有压下按键的信号就不送出。压下的信号按键每一次的封包为8 Bytes,其中2 Bytes为Modifier Keys与Reserved保留键。
PS/2按键压下与放开,是分Make Code与Break Code送出,而USB界面下则完全不同。依据USB HID(Human Interface Devices)规范,它是将正在压下的按键信号送出,没有压下按键的信号就不送出。压下的信号按键每一次的封包为8 Bytes,其中2 Bytes为Modifier Keys与Reserved保留键。
Modifier Keys为1Byte即8 bit,每一个bit可以记录Shift、Ctrl、Alt、Windows键,左右侧各有1颗键共8键。Reserved保留键可以做为Caps Lock、Number Lock、Scroll Lock等等键使用。扣除Modifier Keys与Reserved Keys之后,其他按键最多只有6键可以输出。
USB键盘按键定义
▲由USB HID 1.11中可以明确看到USB键盘使用8 Bytes。
![]()
▲Reserved Keys保留键可以让厂商做为多种用途。
![]()
▲Modifier Keys每1个bit各代表着不同按键信号。
![]()
▲其他按键的信号送出的定义也与Scan Codes Tables Set 2不同,USB有自己的一套查表,详细可以查询USB HID Uasage Tables。
模拟多把键盘
但其实仍有办法遵守USB HID规范,又能突破限制。最简单的方法,就是利用键盘芯片,让电脑在使用1把键盘情形下,误认为同时连接多把键盘。就能将键盘按键,透过模拟的键盘分送信号。原本限制的6颗键就能串联起来,而重复的Modifier Keys与Reserved Keys位置,也能重新定义新按键送出,达成多颗键同时输出。
但其实仍有办法遵守USB HID规范,又能突破限制。最简单的方法,就是利用键盘芯片,让电脑在使用1把键盘情形下,误认为同时连接多把键盘。就能将键盘按键,透过模拟的键盘分送信号。原本限制的6颗键就能串联起来,而重复的Modifier Keys与Reserved Keys位置,也能重新定义新按键送出,达成多颗键同时输出。
此种方法稳定性较高,造成系统误判的机率较低,许多键盘都采用这种方式。不过每多模拟1把键盘,至少就需要多1颗芯片,还要将芯片互接连接并将信号分配控制,成本也随之增加。通常采用此方法时会猜测玩家的按键需求,而非无上限地模拟键盘。
回复
我要赚赏金打赏帖 |
|
|---|---|
| 基于ArduinoUNO开发板的AT24C02读写测试被打赏¥16元 | |
| TCS3472S传感器及其色彩检测被打赏¥19元 | |
| 【S32DS】S32K3 RTD7.0.1 HSE 组件配置报错问题解决被打赏¥27元 | |
| 【S32K3XX】MCME 启动 CORE1被打赏¥23元 | |
| AG32VH407下温度大气压传感器及其检测被打赏¥20元 | |
| AG32VH407下光照强度传感器BH1750及其检测被打赏¥22元 | |
| AT32VH407下使用温湿度传感器DHT22进行检测被打赏¥20元 | |
| DIY一个婴儿澡盆温度计被打赏¥34元 | |
| 【FreeRtos】FreeRtos+MPU region 配置规则被打赏¥23元 | |
| 【分享开发笔记,赚取电动螺丝刀】三分钟快速上手驱动墨水屏(ArduinoIDE)被打赏¥28元 | |

我要赚赏金
