
预设查表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颗芯片,还要将芯片互接连接并将信号分配控制,成本也随之增加。通常采用此方法时会猜测玩家的按键需求,而非无上限地模拟键盘。
回复
打赏帖 | |
---|---|
分享一种检测按键状态的方法被打赏20分 | |
周末总结一下,STM32C0系列的开发经验被打赏50分 | |
【Cortex-M】Systick Timer使用被打赏10分 | |
分享汽车防盗系统的组成与分类(一)被打赏5分 | |
VOFA+波形显示+JYD-31蓝牙发送和解析不定长数据被打赏10分 | |
【换取手持数字示波器】-STM32F4PWM控制LED灯管亮度被打赏22分 | |
【换取手持数字示波器】STM32F4驱动RPR-0521RS照度、接近一体型传感器被打赏23分 | |
宏定义和const关键字定义被打赏5分 | |
【分享开发笔记,赚取电动螺丝刀】几个单片机I2S外设的BLCK时钟对比被打赏20分 | |
【功率监测与控制系统DIY活动成果贴】DIY功率计与LabVIEW数据采集被打赏100分 |