原创 关于键盘鼠标的PS/2接口的开发笔记

2008-3-28 09:56 3863 8 9 分类: MCU/ 嵌入式

PS/2硬件接口:计算机(Host)端是母的,键盘鼠标(Device)端是公的。由6-pin的mini-DIN连接

Pin1 - Data; Pin3 - Ground; Pin4 - +5V; Pin5 - Clock; Pin2 & Pin6 - Not
Implemented。

Data和Clock可以被计算机和键盘鼠标双向控制,所以是OC的。

Clock的频率最大为33kHz,一般在10-20kHz之间,周期约为50-100us。



通常,Device是主动向Host发送数据的。发送格式是:1
Start bit(logic "0"); 8 Data bits(least
significant bit first
); 1 Odd Parity bit; 1 Stop bit(Logic
"1"); 1 ACK bit(Host-to-device
communication only,Logic "0"
)。

Host总是在Clock下跳沿时读入Data的状态。所以,Device要在Clock为“1”时改变Data的状态。

Device发送完一字节后,至少要等待50us方可发送下一字节。

如果Host要Device暂停数据发送,只要把Clock拉低就行了;如果此时Device正发送到一半,就放弃当前字节。在Host释放Clock后,Device要等候50us后方可继续发送数据。




当Host要向Device发送命令时,首先要拉低Clock
100us,然后拉低Data,释放Clock(形成Clock的上跳沿),使得这时候Device收到了一个Start
bit。

Device要在10ms内响应这个请求,继续向Host发送Clock(首先令Clock为“0”),Host在Clock为“0”的时候改变Data的状态,而Device在Clock上跳沿的时候读入Data的状态。在读到Stop
bit后,Device将Data拉低,然后将Clock拉低(形成Clock的下跳沿),Host接受到ACK信号。最后,Device先释放Data,然后释放Clock,进入空闲状态。




Scan Code: 按下按键时发送“Make Code”,松开时发送“Break
Code”。

通常,Make Code有一个字节:如“A”的Make Code是“1C”。

特殊功能键有两个到四个字节,以“E0”或“E1”开头:如Pause的Make
Code是“E1,14,77”; PrtScreen的Make Code是“E0,12,E0,7C”。

Break Code是在Make Code前面加一个“F0”。所以,“A”,Pause和PrtScreen的Break
Code就是“F0,1C”“E1,F0,14,F0,77”“E0,F0,7C,E0,F0,12”。注意PrtScreen的Break
Code中的“12”和“7C”顺序与Make Code中相反,它实际上两个特殊功能按键的组合。




现在常用的是第二套键盘扫描码:


101 102 104
键的键盘

KEY MAKE BREAK KEY MAKE BREAK        
KEY MAKE BREAK


A 1C F0,1C    
9 46 F0,46            
[ 54 FO,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 FO,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
FO,12        D ARROW E0,72 E0,F0,72

K 42 F0,42     L CTRL 14
FO,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             
] 5B F0,5B

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   PRNTSCRN 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(PAUSE被释放时不会发送Break
Code)





Device在复位后向Host发送0xAA(初始化成功)或0xFC(初始化失败)。

Host向Device发送命令后,Device要回复一个0xFA,作为应答。Resend和Echo命令不需要回复0xFA。如果是带参数的多字节命令,在发送完每一个字节后都要收到0xFA后才能发送下一个字节。

Device接到Host命令后,要清空所有缓冲区。



给键盘的命令列表:

0xFF: (Reset).复位Device。




0xFE: (Resend).要求重新发送上一个字节(此命令可以由Host发给键盘,也可以由键盘发给Host)。



0xFD/0xFC/0xFB: (Set Key Type Make/Make &
Break/Make & Typematic).指定一个按键只发送Make Code/Make Code &
Break Code/Make Code & Typematic Repeat。该键值依照第三套键盘扫描码设定。



0xFA: (Set all keys Make,Break & Typematic).缺省设置,恢复所有按键的Make
code, Break code 和 Typematic repeat功能。



0xF9/0xF8/0xF7: (Set all keys Make/Make &
Break/Make & Typematic).设置所有按键只发送Make Code/Make Code &
Break Code/Make Code & Typematic Repeat。



0xF6: (Set Default).设置缺省的Typematic
rate/delay(10.9cps/500ms),第二套键盘扫描码,执行0xFA命令。



0xF5: (Disable).键盘停止扫描,执行0xF6命令。



0xF4: (Enable).使能键盘扫描。



0xF3: (Set Typematic Rate/delay). 后面跟1个字节设置Repeat
Rate & Delay。

Bit0-4:Repeat rate 0x00-0x10-0x1F (2.0-8.0-30.0 cps);

Bit5-6:Delay 0.25/0.5/0.75/1.0 second。



0xF2: (Read ID). 键盘回复双字节的设备ID(0xAB,0x83).



0xF0: (Set Scan code set).
设置或读取当前使用的扫描码。参数为0x01,0x02或0x03时设置当前扫描码,参数为0x00时读取当前扫描码。



0xEE: (Echo).键盘回复一个0xEE。


0xED: (Set/Reset LEDs).
后面跟一字节参数,用来设置键盘的Caps Lock/Num Lock/Scroll Lock。

Bit0:ScrollLock;Bit1:NumLock;Bit2:CapsLock。




PS/2键盘作为单片机的输入设备时,单片机可以将Clock拉低,然后每20ms释放Clock一次,用查询的方式接收键盘的数据。

设置两个字节标志键盘工作状态:

字节1包括:校验位,读取过程完整标志,0xE0收到标志,0xE1收到标志,0xF0收到标志,请求发送键盘LED状态标志,有效按键标志。

字节2包括:功能键标志,释放状态(Break Code)标志,CapsLock,Ctrl,Shift,Alt,NumLock,ScrollLock标志。




计算机在Reset后要向键盘发送命令关闭键盘所有的LED,然后发送命令读取键盘ID。




鼠标向Host发送三字节的数据包:


Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
Y OverflowX OverflowY Sign bitX Sign bit1Middle buttonRight buttonLeft button



Xmovement





Ymovement





鼠标的工作模式:


1、Reset模式:鼠标上电或受到复位命令(0xFF)时进入次模式。

设置缺省的Sample rate:100samples/s;Resolution: 4 counts/mm;Scaling:
1:1; Data report disabled。

复位完成后向Host发送0xAA/0xFC(successful/Error)。Host如果没有收到0xAA,就重新给鼠标上电。

发送完0xAA后,鼠标继续向Host发送自己的ID号:0x00。之后进入Stream模式,此时,禁止向Host发送任何数据包,直到收到0xF4(Data
report enable)。 


2、Stream模式:缺省模式。一旦发现鼠标状态有任何变化,就向Host发送数据包。


3、Remote模式:鼠标不主动向Host发送数据包,只有在收到命令0xEB后才发送数据包并复位计数器。


4、Wrap模式:鼠标将除了Reset(0xFF)和Reset Wrap
Mode(0xEC)以外的所有从Host收到的命令发送回去。




Intellimouse扩展:


Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
Y OverflowX OverflowY Sign bitX Sign bit1Middle buttonRight buttonLeft button



Xmovement





Ymovement


005th button4th button
Zmovement

进入Intellimouse的三键滚轮模式:

Set sample rate to 200;

Set sample rate to 100;

Set sample rate to 80。

然后,Host发送命令0xF2查询鼠标的ID,如果鼠标支持Intellimouse,则返回0x03,否则返回0x00。


进入Intellimouse的五键滚轮模式:

Set sample rate to 200;

Set sample rate to 200;

Set sample rate to 80。

然后,Host发送命令0xF2查询鼠标的ID,如果鼠标支持Intellimouse,则返回0x04,否则返回0x00。




给鼠标的命令列表:




0xFF: (Reset).复位Device。




0xFE: (Resend).要求重新发送上一个字节(此命令可以由Host发给鼠标,也可以由鼠标发给Host)。



0xF6: (Set Default).设置缺省的参数,然后进入Stream模式。



0xF5: (Disable).禁止Stream模式下的数据包发送,使之在Stream模式下完成类似于Remote模式下的功能。



0xF4: (Enable).使能Stream模式下的数据包发送。



0xF3: (Set Sample Rate). 后面跟1个字节参数。有效参数为:10,20,40,60,80,100,200。



0xF2: (Read ID). 鼠标回应ID号码:0x00,0x03,或0x04。



0xF0: (Set Remote Mode). 设置Remote模式。



0xEE: (Set Wrap Mode).设置鼠标为Wrap模式。


0xEC: (Reset Wrap Mode).退回到鼠标进入Wrap以前的那个模式。


0xEB: (Read Data). 在Remote Mode下向鼠标索取数据。注意:鼠标回送数据前一定先用0xFA做收到命令的Echo信号。


0xEA: (Set Stream Mode).设置鼠标为Stream
Mode。


0xE9: (Status Request).查询鼠标状态。鼠标回复的数据包为3字节:


Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
0ModeEnableScaling0Left buttonMiddle buttonRight button




Resolution






Sample Rate



其中:Mode=0为Stream Mode, Mode=1为Remote
Mode。


0xE8: (Set Resolution).设置分辨率,带一字节参数。有效值为0x00/0x01/0x02/0x03,分别对应的分辨率为:1/2/4/8
Count/mm。


0xE7: (Set Scaling 2:1).设置比例为2:1。

此时,当Movement Counter分别为0/1/2/3/4/5/n时,Reported Movement为0/1/1/3/6/9/2*n。


0xE6: (Set Scaling 1:1).设置比例为1:1。




鼠标在复位成功后要先向Host发送0xFA(复位成功),然后发送自己的ID:0x00。

键盘则只需发送0xFA。




PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户108675 2008-4-18 11:07

写的不错,如能给出一个51单片机与鼠标的通讯程序更好!(汇编语言的)
相关推荐阅读
用户411912 2013-10-17 15:21
实用链接
贴片元件型号查询: http://www.s-manuals.com/smd  ...
用户411912 2011-03-26 18:47
Word2007小贴士
为文档添加页码: 1、    将文档分为若干“节”,每节有自己独立的页码设置及编号:在第一节最后一页的末尾,选择“页面布局”->“分隔符”->“分节符”,添加一个分节符。分节符后面的页成为...
用户411912 2009-05-20 23:27
国际邮政邮件跟踪查询
全国统一咨询电话11185 。国际邮政邮件跟踪查询:http://intmail.183.com.cn EMS查询:http://211.156.193.130邮编查询:http://211.156....
用户411912 2009-02-24 15:38
Protel99 SE被忽视的细节
今天,排了一块小板。HTML clipboard1、用"Design"->"Netlist Manager"->"Menu"->"Compare Net Li...
用户411912 2008-09-27 21:35
C语言的优先级
今天,又被优先级耽搁了1小时零2分钟,索性把这个东东放在网上,经常看到可以增强记忆。1、( )   [ ]   ->   .   四种最高优先级。2、 !   ~   ++   --   -  ...
用户411912 2008-09-25 17:47
惨烈的爆炸现场
随着惊天动地的一声巨响,某小区发生了一起罕见的爆炸事故!据目击者称,这次爆炸不是恐怖分子所为。到目前为止,未发现有人在这次爆炸事故中受伤。本博记者到达时,现场的工作人员正闻着满屋的酸味 儿,收拾着一片...
我要评论
1
8
关闭 站长推荐上一条 /3 下一条