11.4  键盘原理

早期的键盘实际上是一种5pin的键盘,称作AT键盘,是1984年IBM PC的标准键盘。在1987年IBM进行了改进,从而变成了现在的PS/2键盘。

当按下一个键或释放一个键,键盘都会发送键盘扫描码到主机。比如按下A,键盘就会发送0x1C到主机。如果持续按A,当经过一个给定时间后,就会发送0x1C到主机。当键盘被释放,键盘会发送0xF0加键码到主机,告诉主机键盘哪个键被释放。当再次按下A,键盘就会再次发送0x1C到主机。键盘的每一个键都有一个特定的键码,无论SHIFT、Num Lock、Caps Lock、Scroll Lock键是否被按下,键盘总是发送同样的键码,主机的键盘BIOS负责区分SHIFT、Num Lock、Caps Lock、Scroll Lock键的状态。键盘有101个键,而PS/2接口只有8比特。因此,并不是所有的键都只有一个字节的键码。扩展键盘中有一些键的键码是双字节的,以E0开头,比如向左键为E06B。有些键的扫描码非常夸张,比如Pause Brk键的键码为E1177E1F014F077!主键盘键码如图11-5所示,扩展键盘键码如图11-6所示。

bios PS2键盘 ps2的键盘_扩展

 


(点击查看大图)图11-5  主键盘键码

bios PS2键盘 ps2的键盘_scroll_02

 


(点击查看大图)图11-6  扩展键盘键码

扩展键盘的键被释放的时候,不是首先发送F0加E0开头的键码,而是发送E0F0加一个字节的区分码,比如向左键被释放时发送到主机的键码为E0F06B。

主机可以向键盘发送命令控制键盘,具体如下:

0xED命令设置键盘LED的状态,包括Num Lock、Caps Lock、Scroll Lock LED的状态。接收到0xED命令后,键盘返回应答0xFA,接下来主机向键盘发送一个字节的命令数据格式如图11-7所示。1表示开,0表关。

bios PS2键盘 ps2的键盘_ibm_03

 


(点击查看大图)图11-7  0xED命令后面跟的命令数据格式

0xEE是环回(Echo)命令,当接收到该命令,键盘返回0xEE。

0xF0设置扫描码集。当接收到0xF0,键盘返回0xFA应答。接下来主机向键盘发送一个字节的数据,如果数据为01~03,决定使用的扫描码集;如果数据为0x00,则主机返回当前使用的键盘扫描码集的编号。

0xF3设置打字重复率(Typematic Repeat Rate)。当接收到0xF3,键盘返回0xFA应答。接下来主机向键盘发送一个字节的数据,表示具体的打字重复率值。

0xF4设置键盘使能,清除键盘输出缓存,使能键盘扫描,键盘接收到该命令后返回0xFA。

0xF5设置键盘关闭,清除键盘输出缓存,停止键盘扫描,键盘接收到该命令后返回0xFA。

0xFE请求重传。键盘接收到该命令后,键盘重新发送刚刚发送的字节;主机接收到该命令后,重新发送刚刚发送的字节给键盘。

0xFF键盘复位。

0xFA键盘发送到主机的应答。

0xAA键盘发送给主机的加电自检完成指示(Power On Self Test Passed)。

0x00/0xFF键盘发送给主机,表示错误或缓存溢出。