键盘Keyboard中的扫描码Scan Code 通码Make code 断码Break Code
原文地址:http://bbs.chinaunix.net/thread-3609756-1-1.html
Version:2011-10-21
Author: crifan
Mail: green-waste (at) 163.com
PDF版本:
Keyboard Scan Code Make code and Break Code v2011-10-21.pdf (386.53 KB, 下载次数: 155)
【键盘的构造及历史】
对于键盘,如果想要表示某个按键,硬件上对应着某个点,有两种方法,一种是对于每个按键,都设计一个硬件的点,另外一种是设计成矩阵式,即由多少行,多少列所组成。
比如,某个键盘一共需要35个按键,前者是要设计35个硬件上的点,后者只需要设计7行5列即可实现7×5=35个按键。
如下图:
图表
1 矩阵式的键盘
很明显,后者行列的矩阵式,比前者独立的点的方式,硬件上更容易实现,更简单,对于早期的键盘来说,也更加能省成本。当然现在来说,这点成本,可以忽略不计了,但是还是矩阵式的键盘,最容易设计和实现。
对于矩阵式的键盘,用户按了某个键后,硬件电路检测到某个点被按下了,可以知道对应的矩阵地址Matrix Address,有对应的矩阵值Matrix Value。
而对于矩阵值,到底对应哪个按键,如果是简单的系统,比如嵌入式开发板上,某些应用只需要上下左右和确定,取消等几个键的话,那么直接可以通过一个映射表,就可以实现将按对应的键值,对应到相应的按键上面,即可满足应用。
而普通PC上的键盘,由于按键太多,以及为了之后的普及和通用性,所以要有个统一的标准,去定义,到底哪个键值,对应到键盘上的哪个按键。
因此,才会出现后来的扫描码Scan Code。
【键盘Keyboard中的扫描码Scan Code和Make Code,Break Code】
用户按键盘上的字母,硬件底层会产生对应的Scan Code,而且是按下那一刻产生一个通码Make code,释放的时候产生一个断码Break code。
即你从按下一个键盘上的字母,到手松开,实际上对应着一个通码Make Code和一个断码Break Code,两者概念上都属于扫描码Scan Code。
【Scan Code,Make Code,Break Code名称的由来】
之所以叫做Scan Code和Make Code及Break Code,是因为硬件电路实现的时候,对于矩阵式的硬件电路,要去扫描Scan每一行和每一列,然后才能判断出哪行和哪列是电路上想连通,才知道是哪个键被按下了。因此才叫Scan Code,对应的按下键的动作产生的键码叫做通码Make Code。相应地,释放的时候,由于想通的电路被断开,所以产生的键码叫做断码Break Code。
【扫描码集合Scan Code Set】
目前现存有3种Scan Code,即第一种扫描码集合(Scan Code Set1),Scan Code Set2,Scan Code Set3。
其中,Set1的Scan Code的Make Code和Break Code都是单字节的,Make code和Break Code的差别就在最高位,即Break code = make code + 0x80,即将make code的最高位置1就是Break Code了。
下面以字母A为例来看看实际的Scan Code都是什么样的:
Table 1 以字母A为例的Scan Code Set
Scan Code Set | Alias | Used on | ‘A’ key as an example | Note | |
Make code | Break code | ||||
Scan Code Set1 | XT Style scan code | IBM PC XT Keyboard | 1Eh | 9Eh | |
Scan Code Set2 | AT Style scan code | IBM PC AT Keyboard | 1Ch | F0h,1Ch | Most frequently used on |
Scan Code Set3 | IBM 3270 PC | 1Ch | F0h,1Ch | Subset of Set2, used by the 122-key keyboard |
【USB中的Keyboard的Scan Code】
需要注意的是,USB的Keyboard,是用了另外一套的Scan Code,详情请参考USB协议。
【一些常见的键盘布局】
标准的英式布局(UK
Layout)的102键的键盘:
图表
2 英式的102键的键盘
和标准的101键的美式布局(US Layout)的键盘:
图表
3 美式的101键的键盘
我们最常用的,也是更常见的,是带Windows Key的美式US键盘:
图表
4 带Win Key的美式键盘
【简述:从按下键盘的字母到PC端显示出字母的常见流程】
(1)用户按了键盘上的某个键
(2)键盘的硬件产生Scan Code,其中目前常见的AT键盘中用的是Set2的Scan Code。
注:
A. 如果是按下则是Make Code,如果是释放则是Break Code
(3)键盘的控制器将Set2的Scan Code转化为Set1的Scan Code
注:
A. 此处是为了兼容旧的Scan Code Set1才去将Set2转为Set1。当然你也去通过设置而禁止掉此处的转换。
B. 将Scan Code Set2转为Scan Code Set1,对于普通PC机,一般是通过BIOS做的这个转换。
(4)控制器再将Set1的Scan Code发送给PC主机Host
(5)主机Host端,会有对应的驱动和软件去处理,将
的Scan Code,转化为对应的字母而显示出来。当前其间还会涉及到当前系统的本地语言设置,Code Page等知识。
【引用】
我所知道的EC====>Keyboard
http://blog.163.com/x_ares/blog/static/1015485620113731537928/
Scancode
http://en.wikipedia.org/wiki/Scancode
Key release
http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html#ss1.1
Keyboard Scan Codes: Set 2
http://www.computer-engineering.org/ps2keyboard/scancodes2.html
PC Keyboard Scan Codes
http://www.barcodeman.com/altek/mule/scandoc.php