PS/2 PC键盘编程资料
2012-07-25
红尘客
标签: 键盘 PS/2

1.PS/2的电气特性如下(电脑端):

1DATAKey Data
2n/cNot connected
3GNDGnd
4VCCPower , +5 VDC
5CLKClock
6n/cNot connected
2.数据格式如下:
1个起始位总是逻辑0
8个数据位(LSB)低位在前
1个奇偶校验位奇校验
1个停止位总是逻辑1
1个应答位仅用在主机对设备的通讯中

如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。

3.PS/2发送时序

其中a为键盘到PC机的发送时序(如果你用单片机接收,就按照此时序),在时钟的下降沿,数据被PC读入。

b为PC机到键盘的时序。

4.键盘返回值

需要说明的是:键盘的返回值并不是和ASCII码相对应!

一次按键过程至少会发送两组码,通码和断码,通码是按键被按下时发送,断码是当按键释放时发送,按住不动将发送通码。每个键的通码和断码都是唯一的,因此通过查唯一的扫描码,就可以知道哪个键被按下或释放。

扫描码集有三套标准,分别是第一套,第二套和第三套,所有现代的键盘默认使用第二套扫描码。

就以大定字母“A”,首先得按住Shift键,然后按下A键,再松开A键,再松开Shift键。查下面的码表,就得到这样一组键码:

12 1C F0 1C F0 12

5.第二套扫描码

101 102 和104 键的键盘:

KEY 通码 断码 KEY通码断码 KEY通码断码
A1CF0 1C946F0 46[54F0 54
B32F0 320EF0 0EINSERTE0 70E0 F0 70
C21F0 21-4EF0 4EHOMEE0 6CE0 F0 6C
D23F0 23=55F0 55PG UPE0 7DE0 F0 7D
E24F0 245DF0 5DDELETEE0 71E0 F0 71
F2BF0 2BBKSP66F0 66ENDE0 69E0 F0 69
G34F0 34SPACE29F0 29PG DNE0 7AE0 F0 7A
H33F0 33TAB0DF0 0DU ARROWE0 75E0 F0 75
I43F0 43CAPS58F0 58L ARROWE0 6BE0 F0 6B
J3BF0 3BL SHFT12F0 12D ARROWE0 72E0 F0 72
K42F0 42L CTRL14F0 14R ARROWE0 74E0 F0 74
L4BF0 4BL GUIE0 1FE0 F0 1FNUM77F0 77
M3AF0 3AL ALT11F0 11KP /E0 4AE0 F0 4A
N31F0 31R SHFT59F0 59KP *7CF0 7C
O44F0 44R CTRLE0 14E0 F0 14KP -7BF0 7B
P4DF0 4DR GUIE0 27E0 F0 27KP +79F0 79
Q15F0 15R ALTE0 11E0 F0 11KP ENE0 5AE0 F0 5A
R2DF0 2DAPPSE0 2FE0 F0 2FKP71F0 71
S1BF0 1BENTER5AF0 5AKP 070F0 70
T2CF0 2CESC76F0 76KP 169F0 69
U3CF0 3CF105F0 05KP 272F0 72
V2AF0 2AF206F0 06KP 37AF0 7A
W1DF0 1DF304F0 04KP 46BF0 6B
X22F0 22F40CF0 0CKP 573F0 73
Y35F0 35F503F0 03KP 674F0 74
Z1AF0 1AF60BF0 0BKP 76CF0 6C
045F0 45F783F0 83KP 875F0 75
116F0 16F80AF0 0AKP 97DF0 7D
21EF0 1EF901F0 01]58F0 58
326F0 26F1009F0 09;4CF0 4C
425F0 25F1178F0 78,52F0 52
52EF0 2EF1207F0 07,41F0 41
636F0 36PRNT SCRNE0 12
E0 F0
49F0 49
73DF0 3DSCROLL7EF0 7E/4AF0 4A
83EF0 3EPAUSEE1 14 77
-NONE-

以下是51单片机的读取键码程序,此程序仅仅是取得键盘的通码和断码,要得到ASCII还需要解码程序,要看到结果还得要显示程序。其它请看本站相关文章。

#define sck P3_3    //写义时钟线,选用中断口#define dat P3_4//定义数据线
unsigned char keyvalue;//键码
unsigned char intnum = 0; //中断次数
bit bf = 0; //已经取得一个键码时为1
/*------------------------------------------------------
51单片机设为低电平触发中断
当时钟线为低时,触发中断,然后读数,等待高电平退出中断
*/------------------------------------------------------
void int1(void) interrupt 2//中断处理
{
    if ((intnum > 0) && (intnum < 9)) {   //只读取第1--8位,也就是键码位,抛弃起始位0,校验位9与停止位10
        keyvalue >>= 1; //因为键盘先发送的是最低位,所以右移一位
        if (dat) {
            keyvalue |= 0x80; //当数据线为1时,将最高位置1
        }
    }

    intnum++;//中断次数加1
    while (!sck); //当时钟线为低电平时循环至到时钟线为高电平
    if (intnum > 10) { //当中断11次后,表示一个字已经发完,禁止中断,等待处理,处理完后,清零bf
        intnum = 0;
        bf = 1;
        EA = 0;
    }
}


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号