1、第二章 PS2键盘接口程序设计总结 2.1 PS/2键盘接口简介 键盘上包含了一个大型的按键矩阵,它们是由安装在电路板上的处理器(叫做“键盘编码器”)来监视的。具体的处理器在键盘与键盘之间是多样化的,但是它们基本上都做着同样的事情:监视哪些按键被按下或释放了,并传送适当的数据到主机。如果有必要,处理器处理所有的去抖动并在它的16 字节缓冲区里缓冲数据。你的主板包含了一个“键盘控制器”,负责解码所有来自键盘的数据,并告诉你的软件什么事件发生了。在主机和键盘之间的通讯使用IBM 的协议。 2.1.1 扫描码 键盘的处理器花费很多的时间来扫描或监视按键矩阵。如果它发现有键被按下、释放
2、或按住,键盘将发送“扫描码”的信息包到计算机。扫描码有两种不同的类型:“通码”和“断码”当一个键被按下或按住就发送通码;当一个键被释放就发送断码。每个按键被分配了唯一的通码和断码,这样主机通过查找唯一的扫描码就可以测定是哪个按键。每个键一整套的通断码组成了“扫描码集”。有三套标准的扫描码集分别是第一套、第二套和第三套。所有现代的键盘默认使用第二套扫描码。 2.1.2 通码、断码和机打重复率 只要一个键被按下,这个键的通码就被发送到计算机。记住通码只表示键盘上的一个按键,它不表示印刷在按键上的那个字符。这就意味着在通码和ASCII 码之间没有已定义的关联。直到主机把扫描码翻译成一个字符或命
3、令。 虽然多数第二套通码都只有一个字节宽,但也有少数扩展按键的通码是两字节或四字节宽。这类的通码第一个字节总是为“E0h”。 正如键按下通码就被发往计算机一样,只要键一释放断码就会被发送。每个键都有它自己唯一的通码,它们也都有唯一的断码。幸运的是你不用总是通过查表来找出按键的断码。在通码和断码之间存在着必然的联系,多数第二套断码有两字节长它们的第一个字节是“F0h”, 第二个字节是这个键的通码。扩展按键的断码通常有三个字节,它们前两个字节是“E0h”,“F0h” ,最后一个字节是这个按键通码的最后一个字节。 例如:通码和断码是以什么样的序列发送到你的计算机,从而使得字符“G”出现在你的字
4、处 理软件里的呢?因为这是一个大写字母,需要发生这样的事件,次序按下“Shift”键,按下“G” 键,释放“G”键,释放“Shift”键,与这些时间相关的扫描码如下:“Shift”键的通码12h, “G”键的通码“34h”,“G”键的断码“F0h,34h”,“Shift”键的断码“F0h,12h”。因此发送到你的计算机的数据应该是“12h ,34h, F0h ,34h, F0h,12h”。 如果你按了一个键,这个键的通码被发送到计算机,当你按下并按住这个键,则这个键就变成了机打着,就意味着键盘将一直发送这个键的通码直到它被释放或者其他键被按下。要想证实这点只要打开一个文本编辑器,并按下
5、A 键当你首先按下这个键字符a 立刻出现在你的屏幕上在一个短暂的延迟后,接着出现一整串的a 直到你释放A 键。这里有两个重要的参数:机打延时是第一个和第二个a 之间的延迟,机打速率是在机打延时后每秒有多少字符出现你的屏幕。上机打延时的范围可以从0.25 秒到1.00 秒,机打速率的范围可以从2.0cps(字符每秒)到30.0cps。你可以用Set Typematic Rate/Delay “0xF3”命令来改变机打速率和延时。 2.1.3、复位 在上电或软件复位(见Reset 命令)后,键盘执行诊断自检,叫做BAT(基本保证测试)并载入如下的缺省值: ● 机打延迟为500ms。 ● 机
6、打速率为10.9cps。 ●* 第二套扫描码集。 ●* 置所有按键为机打/通码/断码。 * 所指的项在某些键盘上时可变的,而在其他键盘上时硬件编码的不可变。 当进入BAT,键盘点亮它的三个LED指示器,并在完成BAT 后关闭它们。此时,BAT完成代码要么“0xAA” BAT成功或“0xFC”有错误被发送到主机。 多数键盘忽略它们的时钟和数据线直到BAT完成代码发送后。所以“抑制”条件时钟线拉低可能不能防止键盘发送它们的BAT完成代码。 2.1.4、命令集 每个发送到键盘的字节都从键盘获得一个0xFA(应答)的回应,唯一例外的是键盘对Resend和Echo命令的回应。在发送下一个字
7、节给键盘之前,主机要等待“应答”。键盘应答任何命令后清除自己的输出缓冲区。下面列出了所有可能被发给键盘的命令: ● 0xFF (Reset)——引起键盘进入Reset 模式(见复位部分)。 ● 0xFE (Resend)——用于只是在接收中出现的错误。键盘的响应就是重发送最后的扫描码或者命令回应给主机。但是0xFE绝不会作为Resend命令的回应而被发送。 ● *0xFD (Set Key Type Make)——允许主机指定一个按键只发送通码。这个按键不发送断码或进行机打重复。指定的按键采用它的第三套扫描码。 ● *0xFC (Set Key Type Make/Break)——
8、类似于Set Key Type Make,只有通码和断码是使能的(机打被禁止了)。 ● *0xFB (Set Key Type Typematic)——类似于前两条命令通码和机打是使能的,而断码被禁止。 ● *0xFA (Set All Keys Typematic/Make/Break)——缺省设置所有键的通码、断码和机打重复都使能(除了Print Screen 键,它在第一套和第二套中没有断码)。 ● *0xF9 (Set All Keys Make)——所有键都只发送通码;断码和机打重复被禁止。 ● *0xF8 (Set All Keys Make/Break)——类似于前两条命
9、令,除了机打重复被禁止外。 ● *0xF7 (Set All Keys Typematic)——类似于前三条命令仅断码被禁止,通码和机打重复是使能的。 ● 0xF6 (Set Default)——载入缺省的机打速率/延时(10.9cps/500ms),按键类型(所有按键都使能机打/通码/断码),以及第二套扫描码集。 ● 0xF5 (Disable)——键盘停止扫描,载入缺省值键Set Default 命令,等待进一步指令。 ● 0xF4 (Enable)——在用上一条命令禁止键盘后,重新使能键盘。 ● 0xF3 (Set Typematic Rate/Delay)——主机在这条命令后
10、会发送一个字节的参数来定义机打速率和延时,具体含义如表2.1、2.2所示。 表2.1 Repeat Rate Bits0-4 Rate(cps) Bits0-4 Rate(cps) Bits0-4 Rate(cps) Bits0-4 Rate(cps) 00h 2.0 08h 4.0 10h 8.0 18h 16.0 01h 2.1 09h 4.3 11h 8.6 19h 17.1 02h 2.3 0Ah 4.6 12h 9.2 1Ah 18.5 03h 2.5 0Bh 5.0 13h 10.0 1Bh 20.
11、0 04h 2.7 0Ch 5.5 14h 10.9 1Ch 21.8 05h 3.0 0Dh 6.0 15h 12.0 1Dh 24.0 06h 3.3 0Eh 6.7 16h 13.3 1Eh 26.7 07h 3.7 0Fh 7.5 17h 15.0 1Fh 30.0 表2.2 Delay Bits5-6 Delay(seconds) 00b 0.25 01b 0.50 10b 0.75 11b 1.00 ● *0xF2 (Read ID)——键盘回应两个字节的设备ID,0xAB、0x83。
12、● *0xF0 (Set Scan Code Set)——主机在这个命令后发送一个字节的参数,是定键盘使用哪套扫描码集。参数字节可以是0x01、0x02或0x03分别选择扫描码集第一套、第二套或第三套。如果要获得当前正在使用的扫描码集,只要发送带0x00参数的本命令即可。 ● 0xEE (Echo)——键盘用“Echo”0xEE 回应。 ● 0xED (Set/Reset LEDs)——主机在本命令后跟随一个参数字节,用于指示键盘上Num Lock, Caps Lock,and Scroll Lock LED的状态这个参数字节的定义如下: MSB
13、 LSB Always0 Always0 Always0 Always0 Always0 Caps Lock Num Lock Scroll Lock ○"Scroll Lock" - Scroll Lock LED off(0)/on(1) ○"Num Lock" - Num Lock LED off(0)/on(1) ○"Caps Lock" - Caps Lock LED off(0)/on(1) *只是最初可用于PS/2 键盘。 2.1.4、初使化
14、 如下的通讯过程发生在计算机和键盘之间,当计算机启动后,前三个命令是初始化键盘控制器,后一条命令(使能Numlock LED),是由BIOS发送的,剩下来的命令是由OS Win98SE发送的。记住在计算机上这个结果是明确的,但是它只是一个一般性的概念,告诉我们启动时发生了什么。 Keyboard: AA 自检通过;键盘控制器初使化 Host: ED 设置/复位状态指示器 Keyboard: FA 键盘应答 Host: 00 关闭所有指示灯 Keyboard: FA 键盘应答 Host: F2 读ID Keyboar
15、d: FA 键盘应答 Keyboard: AB ID的第一个字节 Host: ED 设置/复位状态指示器;BIOS初使化 Keyboard: FA 键盘应答 Host: 02 点亮 Num Lock指示灯 Keyboard: FA 键盘应答 Host: F3 设置机打速率和延时;Windows初使化 Keyboard: FA 键盘应答 Host: 20 500 ms / 30.0 reports/sec Keyboard: FA 键盘应答 Host: F4
16、 使能键盘 Keyboard: FA 键盘应答 Host: F3 设置机打速率和延时 Keyboard: FA 键盘应答 Host: 00 250 ms / 30.0 reports/sec Keyboard: FA 键盘应答 2.2 PS/2通讯协议 PS2通讯协议是一种双向同步串行通讯协议。通讯的两端通过Clock(时钟脚)同步,并通过Data(数据脚)交换数据。任何一方如果想抑制另外一方通讯时,只需要把clock(时钟脚)拉到低电平。如果是PC机和PS2键盘间的通讯,则PC机必须做主机,也就是说,PC机可以抑制P
17、S2键盘发送数据,而PS2键盘则不会抑制PC机发送数据, 也即主机总是在总线上有优先权。一般两设备间传输数据的最大时钟频率是33KHz,大多数PS2设备工作在10~20KHz。推荐值在15KHz左右,也就是说,clock(时钟脚)高、低电平的持续时间都为40μs。每一数据帧包含11~12个位,具体含义如表2.3所列。 表2.3 PS/2通讯数据帧格式 1个起始位 总是逻辑0 8个数据位 (LSB)低位在前 1个奇偶校验位 奇校验 1个停止位 总是逻辑1 1个应答位 仅用在主机对设备的通讯中 表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校
18、验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。 2.2.1、PS/2设备到主机的通讯 时钟频率为10-16.7kHz 。从时钟脉冲的上升沿到一个数据转变的时间至少要有5 微秒。数据变化到时钟脉冲的下降沿的时间至少要有5 微秒,并且不大于25 微秒。这个定时非常重要你应该严格遵循它。主机可以在第11 个时钟脉冲停止位之前把线拉低,导致设备放弃发送当前字节,这是非常罕见的。在停止位发送后设备在发送下个包前至少应该等待50 微秒。这将给主机时间,当它处理接收到的字节时抑制发送(主机在收到每个包时通常自动做这个)。在主机释放抑制后,设备至少应该在发送任何数据前等
19、50微秒。其通讯时序图如图2.1所示。 从PS2向PC机发送一个字节可按照下面的步骤进行: 1) 检测时钟线电平,如果时钟线为低,则延时50μs; 2) 检测判断时钟信号是否为高,为高,则向下执行,为低,则转到(1); 3) 检测数据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时PC机在向PS2设备发送数据,所以PS2设备要转移到接收程序处接收数据); 4) 延时20μs(如果此时正在发送起始位,则应延时40μs); 5) 输出起始位(0)到数据线上。这里要注意的是:在送出每一位后都要检测时钟线,以确保PC机没有抑制PS2设备,如果有则中止发送; 6) 输出8个数
20、据位到数据线上; 7) 输出校验位; 8) 输出停止位(1); 9) 延时30μs(如果在发送停止位时释放时钟信号则应延时50μs); 按如下的过程发送单个位 1) 设置/复位数据 2) 延迟20 微秒 3) 把时钟拉低 4) 延迟40 微秒 5) 释放时钟 6) 延迟20 微秒 图2.1 设备到主机的通讯 2.2.1、主机到PS/2设备的通讯 首先PS/2 设备总是产生时钟信号,如果主机要发送数据它必须首先把时钟和数据线设置为请求。发送状态如下示 ● 通过下拉时钟线至少100微秒来抑制通讯 ● 通过下拉数据线来应用请求,发送然后释放时钟 设备应
21、该在不超过10 毫秒的间隔内就要检查这个状态。当设备检测到这个状态,它将开始产生时钟信号,并且时钟脉冲标记下输入八个数据位和一个停止位。主机仅当时钟线为低的时候改变数据线而数据在时钟脉冲的上升沿被锁存,当发生在设备到主机通讯的过程中时正好相反。 在停止位发送后,设备要应答接收到的字节,就把数据线拉低并产生最后一个时钟脉冲,如果主机在第11 个时钟脉冲后不释放数据线,设备将继续产生时钟脉冲直到数据线被释放然后设备将产生一个错误。通讯时序图如图2.2、2.3所示。 主机可以在第11 个时钟脉冲应答位前中止一次传送,只要下拉时钟线至少100微秒。 主机必须按下面的步骤发送数据到PS/2设备
22、 1) 把时钟线拉低至少100微秒 2) 把数据线拉低 3) 释放时钟线 4) 等待设备把时钟线拉低 5) 设置/复位数据线发送第一个数据位 6) 等待设备把时钟拉高 7) 等待设备把时钟拉低 8) 重复 5-7步发送剩下的7 个数据位和校验位 9) 释放数据线 10) 等待设备把数据线拉低 11) 等待设备把时钟线拉低 12) 等待设备释放数据线和时钟线 图2.2 主机到设备的通讯 图2.3 主机到设备通讯的详细过程 图2.3描述了两个重要的定时条件:a和b。a在主机最初把数据线拉低后,设备开始产生时钟脉冲的时间,必须不大于15ms;b数据包被发送的
23、时间,必须不大于2ms。如果这两个条件不满足,主机将产生一个错误。在包收到后,主机为了处理数据立刻把时钟线拉低来抑制通讯,如果主机发送的命令要求有一个回应,这个回应必须在主机释放时钟线后20ms之内被收到。如果没有收到则主机产生一个错误,在设备到主机通讯的情况中,时钟改变后的5微秒内不应该发生数据改变的情况。 2.3 设计方案 2.3.1、设计思想 因为键盘的通码和断码存在一定的联系,断码前总为0xF0或0xE0、0xF0,而扩展键通码前总为0xE0,所以可设定两标志位,rx_released(断码标志)/rx_extended(扩展码标志),当键盘输出为断码时rx_released置
24、位;当键盘输出为扩展码时rx_extended置位。同时再设一(rx_shift_key_on)标志位用于表示SHIFT键的状态,SHIFT键按下rx_shift_key_on置位。这样就可以通过三个标志位的状态判断出按键的状态。此外还设置一标志位(rx_data_ready),当rx_data_ready为1时表示有新的数据从键盘发送过来。当外部模块或控制器读出(输入引脚rx_read置1)数据时,rx_data_ready清零,直到有新的数据到来再置位。 从键盘发送过来的字符(字符按键)在本模块中也转换成ASCII码输出。每个按键也直接输出扫描码,便于其它主机的控制。 收接键盘发送
25、过来的扫描码以及发送指令到键盘主要由一个状态机完成,当外部要对键盘发送指令时,通过输入引脚tx_data(要发送的指令)/tx_write(发送使能)/tx_write_ack(发送状态、应答)/tx_error_no_keyboard_ack(发送出错指示),可对键盘进行控制。 2.3.1、接口与控制 如上所述,其模块如图2.4所示。 ● Clock(input)——系统时钟,默认为48MHz,如要改为其它频率,需要改动如下几个参数: parameter TIMER_400USEC_VALUE = 19200; //400us延时,系统时钟的计数值 parameter T
26、IMER_400USEC_BITS = 15; //400us计时,计数器位宽 parameter TIMER_5USEC_VALUE = 240; //5us延时,系统时钟的计数值 parameter TIMER_5USEC_BITS = 8; //5us计时,计数器位宽 ● reset(input)——复位信号,高电平有效。复位时不会向PS/2键盘发送复位命令,只用于 初使化键盘控制器。 ● rx_read(input)——读控制器数据标志,当有新数据到来时rx_data_ready引脚将输出高电平,如果这时rx_read
27、输入高电平时则表示数据已经读出,同时rx_data_ready引脚被清零。如果rx_read一直为低电平,该控制器也会实时输出新的数据,只不过rx_data_ready引脚将一直为高电平。 ● tx_data[7..0](input)——写指令/数据输入口,当需要对键盘进行控制时通过该输入端口写入指令。 ● tx_wirte(input)——写指令/数据使能,高电平有效,当输入为高电平时,控制器转换到发送指令状态,将tx_data[7..0]的指令/数据发送到PS/2键盘;当输入为低电平时,控制器在接收状态,时刻检测键盘发送过来的扫描码。 ● ps2_clk(bidir)——PS
28、/2时钟线,为双向端口,外围电路需加上拉电阻。 ● ps2_data(bidri)——PS/2数据线,为双向端口,外围电路需加上拉电阻。 ● rx_extende(output)——扩展码标志位,当输出为扩展码时该位置位,(扩展码的通码和断码的扫描码都有0xE0,通过识别接收到的扫描码中是否有0xE0来置位或清零)。 ● rx_released(output)——断码标志位,当输出为断码时该位置位,(所有按键的断码中都含有0xF0,通过识别接收到的扫描码中是否有0xF0来置位或清零)。 ● rx_shift_key_on(output)——SHIFT键状态标志位,当SHIFT键按下时该
29、标志位置位;松开时标志位清零。 ● rx_scan_code[7..0](output)——扫描码输出端口。如一个断码为“E0、F0、14”,则输出14。 ● rx_ascii[7..0](output)——ASCII码输出端口。输出的ASCII码范围是0x20~0x7F共96个字符;除“ESC、TAB、ENTER、BACKSPACE、DEL”及字符按键外,其它按键输出为0x2E。 ● rx_data_ready(output)——高电平表示有新数据输出,rx_read为高电平时清零。 ● rx_write_ack(output)——为高电平时表示指令/数据开始传输。 ● tx_er
30、ror_no_keyboard_ack(output)——为高电平时表示发送指令给键盘时键盘应答出错。 图2.4 键盘控制器模块 2.4 调试与测试 键盘上电后就自动自测初使化到省缺状态后就能发送扫描码了,调试时用逻辑分析仪分析其输入输出波形,能有效的的提高调试效率。调试完毕完进行测试,通过调用之前调试完毕的VGA模块,再加上一个ASCII码字库,就能在显示器显示键盘输入的字符。 2.4.1、调试 调试过程比较顺利,吸取了PS/2鼠标接口程序同步问题的教训,由于协议相同,所以很快就通过了调试。设计之初,用逻辑分析议分析了数据通讯的一些时序。按住空格键不放,一断时间后松开按键,其
31、时序如图2.5所示。图中的机打延时为500ms,机打速率为10.9CPS。另外上电后大约560ms后键盘自检完成,自检时三个LED点亮,自检后灭。PS/2时钟为12.5KHz,脉冲宽度为40us。程序设计后用逻辑分析仪分析输出的接口,做了一些小的调整后就调试成功。 图2.5 键盘通讯时序 2.4.2、测试 键盘测试模块的原理是,通过VGA接口在显示器上显示输出的字符,首先利用字模软件“LcmZimo”生成一字符库,共包括94个字符,ASCII码为0x20~0x7E。字符格式为8*16像素,然后编写一主控制程序,通过查字库把键盘模块发送来ASCII码转换成字符图形,并发送到VGA接口
32、最后通过显示器显示出来。程序见“ps2_keyboard_test”。 2.5 第二套键盘扫描码 *所有的值都是十六进制的 101 102 和104 键的键盘: KEY MAKE BREAK KEY MAKE BREAK KEY MAKE BREAK 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
33、 = 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,
34、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
35、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
36、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,
37、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 PRNT SCRN E0,12, E0,7C E0
38、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,E1F0,14,F0,77 -NONE ACPI扫描码: Key Make Code Break Code Power E0,37 E0, F0, 37 Sleep E0,3F E0, F0, 3F Wake E0,5E E0, F0, 5E Windows多媒体扫描码: Key Make Cod
39、e Break Cod 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, 30 WWW Stop E0, 28 E0, F0, 28 WWW Refresh E0, 20 E0, F0, 20 WWW Favorites E0, 18 E0, F0, 18
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818