本节内容:键盘扫描码。
■键盘扫描码:8086计算机的键盘上的按键分为字符键、功能键和控制键。每一个按键都对应一个键盘扫描码。当按下按键时的扫描码称为通码,松开按键时的扫描码称为断码。如果按下的是字符键,则将其对应的一个字节的扫描码和一个字节的ASCII码存入键盘缓冲区。我们将在第十六章输入与输出中断中详细讲解。
4.3.1 键盘扫描码
键盘上的每一个键相当于一个开关,键盘中有一个芯片对键盘上的每一个键的开关状态进行扫描。
按下按键时,开关接通,该芯片就产生一个扫描码,并说明按下的键在键盘上的位置。扫描码被送入主板上相关接口芯片中的寄存器,端口地址为60h。
松开按键时也产生一个扫描码,扫描码说明松开的键在键盘上的位置。松开键时产生的扫描码也被送入60h端口中。
按下时产生的扫描码称为通码,松开时的扫描码称为断码。断码=通码+80h。
从60端口读出扫描码,并转化为相应的ASCII码或状态信息,并存储在内存指定的空间(键盘缓冲区或状态字节)中。从键盘缓冲区读取扫描码进入显存就可以在屏幕显示。或者直接写入文件。
■scan code 集
扫描码集分为set 1、set 2 和 set 3。这里只介绍一般日常应用中的键盘码集 set 2。
基本 scan code:绝大多数为 1 byte。
扩展 scan code:由 e0、e1 或 e2 引导。
特殊的 PrintScreen/SysRq 键:e0 2a e0 37。
物殊的 Pause/Break 键:e1 1d 45 e1 9d c5。
■小键盘 scan code 表
小键盘中的 <home><Up><PgUp><Left><Right><End><Down><PgDn><Ins><Del> 由 NumLock 按下后再按得来。因此,会产生一个 <NumLock> mark 码后,再产生上述的mark通码。 释放 <NumLock> 产生一个 break断码。如表4-1所示。
■附加键 scan code 表
如表4-2所示。
■功能键 scan code 表
如表4-3所示。
■主键盘 scan code 表
如表4-4所示。若输入字符“ABCD”有两种方法:
●按下 <CapsLock> 键后,再输入 abcd 键,再按 <CapsLock> 键,产生一个 <CapsLock> 键 mark 和 break 码,然后依次是 abcd 的 mark 和 break 码, 最后是 <CapsLock> 的 mark 和 break 码。
●按着 <L-shift> 或 <R-shift> 不放,再按 abcd 键,再放开 <L-shift> 或 <R-shift> 键
产生一个 <L-shift> 或 <R-shift> 键的 mark 码,然后依次是 abcd 的 mark 和 break 码,最后是一个 <L-shift> 或 <R-shift> 键的 break 码。
表4-1 小键盘扫描码
表4-2 附加键扫描码
表4-3 功能键扫描码
表4-4 主键盘扫描码
本文摘自编程达人系列教材《X86汇编语言基础教程》。