2024年5月27日发(作者:)

2 PS/2键盘的编码与命令集 2.1 PS/2键盘的编码

目前,PC机使用的PS/2键盘都默认采用第2套扫描码集.扫描码有两种不同的类型“通:

码(make code)”和“断码(break code)”.当一个键被按下或持续按住时,键盘会将该键的

通码发送给主机;而当一个键被释放时,键盘会将该键的断码发送给主机.根据键盘按键扫描

码的不同,可将按键分为3类:

第1类按键 通码为一个字节,断码为0xF0+通码形式.如A键,其通码为0x1C;断码为

0xF0 0x1C.

第2类按键 通码为两字节0xE0+0xXX形式,断码为0xE0+0xF0+0xXX形式.如

Right Ctrl键,其通码为0xE0 0x14;断码为0xE0 0xF0 0x14.

第3类特殊按键 有两个,Print Screen键,其通码为0xE0 0x12 0xE0 0x7C;断码为

0xE0 0xF0 0x7C 0xE0 0xF0 键,其通码为

0xE1 0x14 0x77 0xE1 0xF0 0xl4 0xF0 0x77;断码为空.

组合按键扫描码的发送是按照按键发生的次序,如按下面顺序按左Shift十A键:① 按

下左Shift键;② 按下A键;③ 释放A键;④ 释放左Shift键,那么计算机上接收到的一串数据

为0x12 0x1C 0xF0 0x1C 0xF0 0x12. 在文中的驱动程序设计中,就是根据按键的分类对其

分别进行处理.

2.2 PS/2键盘的命令集

主机可通过向PS/2键盘发送命令对键盘进行设置或者获得键盘的状态等操作.每发送

一个字节,主机都会从键盘获得一个应答0xFA(“重发resend”和“回应echo”命令例外).

驱动程序在键盘初始化过程中所用的指令:0xED,主机在该命令后跟随发送一个参数字节,用

于指示键盘上Num Lock,Caps Lock,Scroll Lock Led的状态;0xF3,主机在这条命令后跟

随发送一个字节参数定义键盘机打的速率和延时;0xF4,用于当主机发送0xF5禁止键盘后,

重新使能键盘.

4.1 单片机与键盘间PS/2通信的程序设计

在PS/2通信过程中,主设备(文中是单片机)是在时钟信号为低时发送和接收数据信号.

因为单片机向键盘发送的是指令,需要键盘回应,所以这部分程序采用查询方式;而单片机接

收键盘数据时,数据线上的信号在时钟为低时已经稳定,所以这部分程序采用中断方式,且不

需要在程序中加入延时程序. 单片机向PS/2键盘发送数据程序代码为:

void ps2_sentchar(unsigned char sentchar){//ps2主设备向从设备发送数

据 unsigned char sentbit_cnt= 0x00; unsigned char sentchar_chk = 0x00; EX0=0; /

/关外部中断0 //发起一个传送,发起始位

PS2_SGN_CLOCK = 0; //将时钟线拉低并保持100 us delay100us();

PS2_SGN_DATA= 0; //起始位 PS2_SGN_CLOCK = 1; //发送DATA0-7

for(sentbit_cnt=0;sentbit_cnt< 8;sentbit_cnt++){ while(PS2_SGN_CLOCK) _nop

_(); //等待时钟线变为低 PS2_SGN_DATA = sentchar& 0x01;//发送数

据 if(PS2_SGN_DATA) sentchar_chk++; //计算校

验 while(!PS2_SGN_CL0CK) _nop_(); //等待时钟线变高 sentchar>>=1; //待发送数据