您的位置:首页技术文栏单片机C51
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

PS/2 PC键盘编程资料

[日期:2008-01-28 ] [来源:网络 作者:佚名] [字体: (投递新闻)
 

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

1 DATA Key Data
2 n/c Not connected
3 GND Gnd
4 VCC Power , +5 VDC
5 CLK Clock
6 n/c Not 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 通码 断码
A 1C F0 1C 9 46 F0 46 [ 54 F0 54
B 32 F0 32 ` 0E F0 0E INSERT E0 70 E0 F0 70
C 21 F0 21 - 4E F0 4E HOME E0 6C E0 F0 6C
D 23 F0 23 = 55 F0 55 PG UP E0 7D E0 F0 7D
E 24 F0 24 \ 5D F0 5D DELETE E0 71 E0 F0 71
F 2B F0 2B BKSP 66 F0 66 END E0 69 E0 F0 69
G 34 F0 34 SPACE 29 F0 29 PG DN E0 7A E0 F0 7A
H 33 F0 33 TAB 0D F0 0D U ARROW E0 75 E0 F0 75
I 43 F0 43 CAPS 58 F0 58 L ARROW E0 6B E0 F0 6B
J 3B F0 3B L SHFT 12 F0 12 D ARROW E0 72 E0 F0 72
K 42 F0 42 L CTRL 14 F0 14 R ARROW E0 74 E0 F0 74
L 4B F0 4B L GUI E0 1F E0 F0 1F NUM 77 F0 77
M 3A F0 3A L ALT 11 F0 11 KP / E0 4A E0 F0 4A
N 31 F0 31 R SHFT 59 F0 59 KP * 7C F0 7C
O 44 F0 44 R CTRL E0 14 E0 F0 14 KP - 7B F0 7B
P 4D F0 4D R GUI E0 27 E0 F0 27 KP + 79 F0 79
Q 15 F0 15 R ALT E0 11 E0 F0 11 KP EN E0 5A E0 F0 5A
R 2D F0 2D APPS E0 2F E0 F0 2F KP 71 F0 71
S 1B F0 1B ENTER 5A F0 5A KP 0 70 F0 70
T 2C F0 2C ESC 76 F0 76 KP 1 69 F0 69
U 3C F0 3C F1 05 F0 05 KP 2 72 F0 72
V 2A F0 2A F2 06 F0 06 KP 3 7A F0 7A
W 1D F0 1D F3 04 F0 04 KP 4 6B F0 6B
X 22 F0 22 F4 0C F0 0C KP 5 73 F0 73
Y 35 F0 35 F5 03 F0 03 KP 6 74 F0 74
Z 1A F0 1A F6 0B F0 0B KP 7 6C F0 6C
0 45 F0 45 F7 83 F0 83 KP 8 75 F0 75
1 16 F0 16 F8 0A F0 0A KP 9 7D F0 7D
2 1E F0 1E F9 01 F0 01 ] 58 F0 58
3 26 F0 26 F10 09 F0 09 ; 4C F0 4C
4 25 F0 25 F11 78 F0 78 ' 52 F0 52
5 2E F0 2E F12 07 F0 07 , 41 F0 41
6 36 F0 36 PRNT SCRN E0 12
E0 7C
E0 F0
7C E0
F0 12
. 49 F0 49
7 3D F0 3D SCROLL 7E F0 7E / 4A F0 4A
8 3E F0 3E PAUSE E1 14 77
E1 F0 14
F0 77
-NONE-      

Widows多媒体码:

KEY 通码 断码
Next Track E0 4D E0 F0 4D
Previous Track E0 15 E0 F0 15
Stop E0 3B E0 F0 3B
Play/Pause E0 34 E0 F0 34
Mute E0 23 E0 F0 23
Volume Up E0 32 E0 F0 32
Volume Down E0 21 E0 F0 21
Media Select E0 50 E0 F0 50
E-Mail E0 48 E0 F0 48
Calculator E0 2B E0 F0 2b
My Computer E0 40 E0 F0 40
WWW Search E0 10 E0 F0 10
WWW Home E0 3A E0 F0 3a
WWW Back E0 38 E0 F0 38
WWW Forward E0 30 E0 F0 20
WWW Stop E0 28 E0 F0 28
WWW Refresh E0 20 E0 F0 20
WWW Favorites E0 18 E0 F0 18

以下是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;
        }
}

阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐