第8章键盘接口技术8.1键盘的工作原理个人计算机普遍使用三种标准建盘:(1)早期的PC、XT和AT机用的83与84键键盘。(2)后来推出了101键的扩展键盘。(3)当前又推出Windows键盘每个键盘的动作包括两部分:一是按下,二是弹起。1.每个动作产生一个扫描编码,为区分两种不同的动作,当按下时转换为接通码,也叫扫描码;由一个字节组成。当弹回时产生断开码,也是一个字节,通常固定为F0h。这样,每个动作由两字节组成。在早期的PC机和XT机中,接通码和断开码只有一个字节。通常用高位bit#7表示按下和弹起时的状态,在按下时,bit#7=0;在弹起时,bit#7=1。例如:键B的7位扫描码是48,其二进制码为110000,按下时,被送到系统控制端口A的码是00110000,当弹起时,这个码变为10110000。2.当扫描码存放在端口A后,键盘中断IRQ#9被激活,这时,处理器立刻停止工作,并执行与中断有关的例行程序。如果扫描码的产生来自换挡键或切换键,存储器中记下转换的状态。除此以外的多数是扫描码转换为字符码并显示。在换挡和切换开关状态,通常的字符是“a”或“A”,这个码放在键盘缓冲器中,程序随时可以取出。3.特殊情况:如PrtSc键,键盘中断程序直接由中断向量指向例行程序激活,不把代码存放在缓冲区中,程序随时可以取出。4.键盘中断程序调用:对多数计算机键盘中断程序调用BIOS中断号15h的功能4Fh,把键盘的扫描码送入AL。不做任何处理,并返回相同的码。5.早期在1982年8月11日以前的XT机中,没有功能4Fh。键盘中断程序能将两类码---ASCII和扩展码插入键盘缓冲区。6.从键盘到屏幕的过程:键盘8048单片机8255CPU显示缓冲显示键盘扫描计算机内部的BIOS提供了从键盘缓冲区取码的例行程序。在DOS中也为此提供例程。BIOS例程有两个版本,分别为83键键盘和101键盘。并没有84键盘,因为84键盘只增加了一个SysReq键,它不把代码存入键盘缓冲器中。在使用101键盘时,对扩充的有软件确认使用的键盘类型,具有支持扩充键盘功能的BIOS计算机,在使用101键盘时,也提供83键盘功能,在这种情况下,83键盘功能滤掉附加码,这些码通常由101键盘放在键盘缓冲区中。这样,只使用83键盘软件,不必做不同键盘的适应性修改,即可。8.2击键截取和击键译码8.2.1清除键盘缓冲区有时用户的按键响应可能导致数据丢失或破坏了数据而不能挽回。在这种情况下,消除缓冲区可以消除不恰当或意外的击键,这种击键或许在缓冲区中正等待处理,或许可能发出错误的响应。在其他情况下,清理缓冲区不是好办法,因为这样做会损害超前键入的特性。并不能再使用键盘宏指令。缓冲区可存放15个键入码,为每个键入码在存储器中提供两个字节。包括转换码、单字节的ASCII码和双字节的扩展码。对单字节码,第一字节放ASCII码,第二字节放扫描码;对扩展码,第一字节存放ASCII0,第二字节通常放扩展码的扫描码。但并不是绝对的因为功能键与换挡键组合后可产生一个扩展码。键盘缓冲区设计成一个环行队列,称为先进先出的(FIFO)算法缓冲区。实际是两个指针跟踪计数器记录着当前在缓冲器中代码串的“头”和“尾”。键盘缓冲区设在BIOS数据区,BIOS数据区的开始地址:0040:2000。32字节缓冲区:0040:001E开始头指针:0040:001A尾指针:0040:001C中断21h功能6的子功能FFh返回键入码,如果不存在有效代码将不等待。没有键入码时,设0标志。不断调用中断直到没有键入码返回为止。P223例8-1清理键盘缓冲区KEY-FOUND:MOVAH,6hMOVDL,0FFhINT21hJNZKEY-FOUND8.2.2检测键盘缓冲区中的键入码不用从键盘缓冲区移出字符,就能检测是否已有键在输入。因为键盘缓冲区使用两个指针一直跟踪记录当前在缓冲区中连续字符串的头和尾。当两个指针相等时,说明缓冲区是空的。键盘缓冲区有一个或多个字符返回时,INT21h的功能Bh把FFh送入AL寄存器,缓冲区空时返回0。P224例8-3和例8-4所示8.2.3在键盘缓冲区中键入码对于101键扩展键盘,BIOS含有一个例程,用于将代码插入键盘缓冲中,这种代码与由键盘中断插入的代码相配——即可以作为键入码用。中断16h的功能5h在键盘缓冲区中插入代码在入口处:CH:CL含有由其他BIOS功能返回在AH:AL的两个字节内容,通常CL放ASCII,CH放字符扫描码。对扩展码来说,CL中放0,CH中放扩展码。返回时,AL中为0;已满或不插入时,AL为1。P224例8-58.2.4截取键入码但不显示通常用回显新输入的键码来表示输入了什么字符。多数程序设计语言具有自动回显字符的功能,特别是有输入整串字符并以Enter为结束的例程。但是,往往并不需要自动显示,而是首先检查每个输入键码,确定是否要回显。通过测试可判别该字符是否在程序执行的任务的字符范围之内。INT21h的功能7和功能8,当键盘缓冲区中无码时就等待着,来一个字符时就返回这一个字符,但是,并不在屏幕上显示。功能8检测Ctrl+Break条件,而功能7不检测。P225例8-6说明。8.2.5截取键入码并自动显示击键自动回显特性源于电传打字机,现在几乎不使用这个特性,取而代之的是当有键入时,检查每个键入码是否应该显示,若要显示,程序准确的把握显示位置以及如何显示。INT21h的功能1h从键盘缓冲区取一个字符,然后在屏幕光标目前的位置上回送这个字符。例8-7取一个键入码:MOVAH,1hINT21hCMPAL,0JEEXTENDED-CODE8.2.6截取可用码某些实用程序不能停下来等待操作员击键。比如视频游戏在等待击键时,需要停止屏幕上的一切活动,这类应用程序在从缓冲区取码前,先要知道有无键入码或实用一个例程,立刻从缓冲区送回一个码或设置无可用码的标志。INT21h的功能6h是惟一的截取键入码时不等待的中断。例8-8截取可用码8.2.7截取一串键入码大多数编译器含有键盘返回一整串字符串的库函数,收到的每个字符都回送到屏幕上。当按下(Enter)键,函数将输入内容送到一个串变量之中(〈Enter〉字符(ASCII13)并不附加到串后面)。DOS也含有这样一个功能,这些输入例程源于软件启动的电传打字机年代。当时,把输入输出都显示成靠左边对齐的序列。INT21h功能0Ah输入的字符串可达254个字符回送到屏幕上。在入口处,DS:DX指向存储器中存放串的地址。例8-9从键盘截取一字符串;数据段STRINGDB53DUP(?)LEADX,STRINGMOVBX,DXMOVAL,51MOV[BX],ALMOVAH,0AhINT21h;检查串的长度MOVAH,[BX]+18.2.8击键的种类每当键被按下或释放,键盘送一个扫描码给计算机。键盘中断解释每个扫描码并完成11种动作中的一种。(1)当扫描码与Shift键(包括〈Shift〉/〈Ctrl〉/〈ALT〉/〈Toggle〉/〈CapsLock〉〈NumLock〉/〈ScrollLock〉/〈Ins〉)有关时,键盘中断改变BIOS数据域中的两个状态字节的设置。这些字节中的位表示toggle键是“开”还是“关”。(2)当扫描码与一般的字符键有关时,如大小写、换挡/切换,键盘中断根据换当/切换的状态寄存器确定。(3)特殊功能键,当扫描码来自特殊特殊功能键时,这个扫描码可能是ASCII码,也可能是扩展码。这取决于ASCII字符集是否为键入码提供一个符号。如:〈Enter〉/〈Esc〉都与电字节ASCII码相关,而ASCII字符集不支持〈Cursor+down〉()和〈F1〉,因此使用扩展码。(4)击键组合和一些功能组合击键。如〈Ctrl+Alt+Del〉/〈PrtSc〉和〈SysReq〉,使键盘中断程序直接调用其它的中断例程。(5)木些特殊击键的组合,包括〈Ctrl+Brak〉/〈Ctrl+PrtSc〉。设置一些标志,这些标志操作系统要用到。本章主要列举各种键的编组;给出它的代码;并说明异常情况处理;另外还能找到ASCII码、扩展码表和扫描码表。并不是所有的键都根据它们生成码的种类进行逻辑分组。比如〈Tab〉生成单字节ASCII码,而〈BackTab〉生成双字节扩展码。因为ASCII字符集的限制产生了这些不规则的情况。在编写键盘输入例程应考虑下列各种异常情况:(6)有4个ASCII码能用两种方法生成:ASCII8由〈Backspace〉或〈Ctrl+H〉生成。ASCII9由〈Tab〉或〈Ctrl+I〉生成。ASCII3由〈Enter〉或〈Ctrl+M〉生成。ASCII27由〈Esc〉或〈Ctrl+[〉生成。(7)〈Ctrl〉键与字母表中的字母结合生成单字节(ASCII)码。与其他字符的结合生成双字节的扩展码。(8)对应于32个ASCII控制码的符号不能由自动回显字符的那些键输入功能显示出来,可通过INT10h的功能10h显示或代码映射到显示缓冲区中显示。(9)当〈NumLock〉键置作光标控制用时,数字辅助键盘上的〈5〉键不起作用。(10)〈Ins〉键按下时既在键盘缓冲区放置一个码,也同时改动了换挡/切换状态寄存器。(11)每次被击活的键盘中断16h的功能4Fh。该功能在进入和退出时,AL寄存器存放的都是扫描码。8.2.9检测/设置切换键和换挡状态1.换挡/切换键状态指示位BIO数据区0040:0017单元和0040:0018单元的两字节中保存换挡/切换键状态指示位如下:地址0040:0017位76543210键IsertCapsLockNumLockScrollLockAlt+ShiftCtrl+ShiftLefthandshiftRighthandshift当bit=1时的含义Insert方式为onCapsLock方式为onNumLock方式为onScrollLock方式为on按下键按下键按下键按下键2.换挡键三种换挡键只导致键盘上的其他一些键生成不同的码。当字符键被换成上档键或〈Ctrl〉与字母〈A〉~〈Z〉组合时,换档键的组合生成ASII码;所有其他的换档键的组合生成扩展码。除特殊的Ctrl+Alt组合外,不能接纳的换档键的组合不产生任何码.在按下多个键时,只有一种情况是有效的,即先按Alt,再按Ctrl,然后按Shift,换档键才有效.判断换档键是否已按下的功能,在许多常驻内存程序使用转换键的组合作为热键来“叫醒”程序.3.切换键切换键有4个:〈CapsLock〉、〈NumLock〉、〈ScrollLock〉和〈Ins〉。(1)〈CapsLock〉的功能与打字机键盘上的CapsLock一样。(2)〈NumLock〉切换数字键盘上的功能。(3)〈ScrollLock〉用于切换光标键,管理光标屏幕滚动的进退状态而不是移动光标。(4)〈Ins〉键用于切换软件的模式,可将一个文本插入另一个文本之中。例8-11检查CapsLock方式状态P232配置101键键盘的机器还可以使用16h的功能12h。P232表所示8.2.10使用数字辅助键和光标键数字辅助键包括数字键,这些数字键可兼用于光标控制键、〈Ins〉和〈Del〉键,以及〈+〉和〈-〉键。数字0~9对应ASCII码48~57。辅助数字键和键盘上顶部的一行数字键生成同样的单字节ASCII码,程序通过检测键的扫描码能区分这两类键。键盘截取功能中断号16h的功能4Fh可用来检测这些组合键,并将他们作为受支持的键组合传送给键盘中断程序。8.2.11专用键的使用除了数字辅助键以外,键盘有几个专用键,即:〈Enter〉、〈Escape〉、〈Delete〉、〈Backspace〉、〈Tab〉、〈Backtab〉、〈PrtSc〉和功能键。1.Enter、Escape、Backspace和Tab键:这4个键是产生单字节ASCII的非字符键。它们的码属