【键盘的构造及历史】
来源:互联网 发布:python logger 配置 编辑:程序博客网 时间:2024/06/08 08:34
分类: 云计算
http://bbs.chinaunix.net/thread-3609756-1-1.html
【键盘的构造及历史】
对于键盘,如果想要表示某个按键,硬件上对应着某个点,有两种方法,一种是对于每个按键,都设计一个硬件的点,另外一种是设计成矩阵式,即由多少行,多少列所组成。
比如,某个键盘一共需要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 codeIBM PC XT Keyboard1Eh9Eh Scan Code Set2AT Style scan codeIBM PC AT Keyboard1ChF0h,1ChMost frequently used onScan Code Set3 IBM 3270 PC1ChF0h,1ChSubset 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'
keyboard scan code 表
当按下一键时,产生 mark 码,产生一次 IRQ1 中断。
放开键时,产生 break 码,产生一次 IRQ1 中断。
因此:当按下 A 键放开,实际上产生了两次 IRQ1 中断
break 是 mark 码的 bit7 置 1 得来,也就是: break = mark + 0x80
1、scan code 集
这里只说一般日常应用中的键盘码集 set 2(有 set 1、set 2 以及 set 3)
- 基本 scan code:绝大多数 scan code 是 1 byte 的。
- 扩展 scan code:由 e0、e1 或e2 引导
- 特殊的 PrintScreen/SysRq 键:e0 2a e0 37
- 物殊的 Pause/Break 键:e1 1d 45 e1 9d c5
2、小键盘 scan code 表
key
mark(Hex)
break(Hex)
描述
NumLock
45
c5
break = mark + 0x80
/
e0 35
e0 b5
由 e0 引导出 extend scan code
*
37
b7
break = mark + 0x80
-
4a
ca
同上
7/Home
47
c7
同上
8/Up
48
c8
同上
9/PgUp
49
c9
同上
4/Left
4b
cb
同上
5
4c
cc
同上
6/Right
4d
cd
同上
1/End
4f
cf
同上
2/Down
50
d0
同上
3/PgDn
51
d1
同上
0/Ins
52
d2
同上
./Del
53
d3
同上
+
4e
ce
同上
Enter
e0 1c
e0 9c
extend scan code
小键盘中的<home><Up><PgUp><Left><Right><End><Down><PgDn><Ins><Del>由 NumLock 按下后再按得来。
因此,会产生一个 <NumLock> mark 码后,再产生上述的mark 码。 释放 <NumLock> 又产生一个 break码。
3、附加键 scan code 表
key
mark(Hex)
break(Hex)
描述
PrintScreen/SysRq
e0 2a e0 37
e0 b7 e0 aa
extend scan code
Scroll Lock
46
c6
同上
Pause/Break
e1 1d 45 e1 9d c5
*
同上
Insert
e0 52
e0 d2
同上
Home
e0 47
e0 c7
同上
Page Up
e0 49
e0 c9
同上
Delete
e0 53
e0 d3
同上
End
e0 4f
e0 cf
同上
Page Down
e0 51
e0 d1
同上
left
e0 46
e0 c6
同上
right
e0 4d
e0 cd
同上
up
e0 48
e0 c8
同上
down
e0 50
e0 d0
同上
抱歉:我对 PrintScreen/SysRq 和 Pause/Break 的理解未透彻。在这不便讲解。
如果您知道,请留言赐教。
4、功能键 scan code 表
key
mark(Hex)
break(Hex)
描述
<esc>
01
81
scan code
F1
3b
bb
同上
F2
3c
bc
同上
F3
3d
bd
同上
F4
3e
be
同上
F5
3f
bf
同上
F6
40
c0
同上
F7
41
c1
同上
F8
42
c2
同上
F9
43
c3
同上
F10
44
c4
同上
F11
57
d7
同上
F12
58
d8
同上
5、主键盘 scan code 表
key
mark
break
key
mark
break
key
mark
break
key
mark
break
~/·
29
a9
<tab>
0f
8f
<scapslock>
3a
ba
<L-shift>
2a
aa
!/1
02
82
q
10
90
a
1e
9e
z
2c
ac
@/2
03
83
w
11
91
s
1f
9f
x
2d
ad
#/3
04
84
e
12
12
d
20
a0
c
2e
ae
$/4
05
85
r
13
93
f
21
a1
v
2f
af
%/5
06
86
t
14
94
g
22
a2
b
30
b0
^/6
07
87
y
15
95
h
23
a3
n
31
b1
&/7
08
88
u
16
96
j
24
a4
m
32
b2
*/8
09
89
i
17
97
k
25
a5
</,
33
b3
(/9
0a
8a
o
18
98
l
26
a6
>/.
34
b4
)/0
0b
8b
p
19
99
:/;
27
a7
?//
35
b5
_/-
0c
8c
{/[
1a
9a
"/'
28
a8
<R-shift>
36
b6
+/=
0d
8d
}/]
1b
9b
<Enter>
1c
9c
<L-ctrl>
1d
9d
|/\
2b
ab
<L-alt>
38
b8
<backspace>
0e
8e
<space>
39
b9
<R-alt>
e0 38
e0 b8
<R-ctrl>
e0 1d
e0 9d
若输入字符“ABCD”有两种方法
(1)按下 <CapsLock> 键后,再输入 abcd 键,再按<CapsLock> 键
这样会产生一个 <CapsLock> 键 mark 和 break码,然后依次是 abcd 的 mark 和 break 码, 最后是<CapsLock> 的 mark 和 break 码
(2)按着 <L-shift> 或<R-shift> 不放,再按 abcd 键,再放开<L-shift> 或<R-shift> 键
这样会产生一个 <L-shift> 或<R-shift> 键的 mark 码,然后依次是 abcd 的 mark和 break 码,最后是一个 <L-shift> 或<R-shift> 键的 break 码
Keyboard codes
Keyboard codes
top keyboard row: escape key and function keys
cursor-control pad
numeric pad, numlock OFF
====
http://www.pwilson.net/kbhit_notes.html- 【键盘的构造及历史】
- 构造干净的 Git 历史线索
- 构造干净的 Git 历史线索
- IT历史: 键盘发展历史
- 键盘风格 及设置键盘的inputView
- Cobol的历史及相关资源
- Ethernet和802.3的区别及历史
- 计算机图形学的历史及发展
- 验证方法学的历史及比较
- eMMC的发展历史及未来市场前景
- 机器人的发展历史及未来发展趋势
- Selenium 1.0的历史及工作原理
- Unix(及Linux)的演变历史
- Unix(及Linux)的演变历史
- 数据压缩的历史、原理及常用算法
- Git历史及与SVN的不同之处
- java IO简介及演变的历史
- soledede--推荐系统的历史及意义
- 习惯决定成败(转)
- 字符串之字符统计
- iOS 发布公司内部应用指导
- DeviceStorageManagerService学习
- CompareText 比较两个字符串的ordinal value,不区分大小写
- 【键盘的构造及历史】
- java笔记
- 小试牛刀
- 银行业务调度---第九篇
- java.lang.ArrayIndexOutOfBoundsException
- HDU4278
- s5pv210-Uboot启动流程
- UVa 10881 - Piotr's Ants
- Java数组中常见的面试题