关于操作系统:敲击键盘后字符怎么出现在显示器

9次阅读

共计 1848 个字符,预计需要花费 5 分钟才能阅读完成。

咱们每敲击一次电脑键盘,按键对应的字符就会呈现在显示器上。这两头产生了什么?请听我缓缓细说。

相干概念

人对按键的操作,从两个维度去形容,一个是“动作”,另一个是“内容”。

按下一个按键,松开一个按键,按下一个按键并且放弃按住状态一段时间(长按),这些都是动作。

每个按键和动作组合起来,会传送给计算机一个编码,这就是内容,术语是“扫描码”,对应的英语词汇是scan code

按下按键、长按键对应的扫描码叫“Make Code”,松开按键对应的扫描码叫“Break Code”。

Break CodeMake Code 的关系是:Break Code = Make Code & 0x80

为什么两种编码之间有下面的关系?设计人员特意这样设计的。

三个硬件

8048

在键盘上执行某种操作(按键、长按、松开键)时,8048 会检测到这个操作,把这个操作对应的扫描码发送给 8042。

到当初为止,呈现了三套编码方案,咱们当初的键盘个别应用第 2 套计划。

8042

8042 从 8048 接管到第 2 套计划的扫描码后,把它转换成第 1 套扫描码,并且放入缓冲区,最初,告诉 8259A 产生了键盘中断。

中断例程取走缓冲区的数据后,8042 才会接管新的数据。缓冲区的数据不被取走,8042 就不会接管新数据。

8259A

8259A 接管来自 8042 的键盘中断,让操作系统分派中断例程解决缓冲区的数据。

流程

  1. 人类敲击键盘,8048 监测到”敲击了哪个键“,把对应的扫描码传送给 8042。
  2. 8042 接管到 8048 的数据后,将数据转换成第 1 套扫描码,放入缓冲区;而后告诉 8259A。
  3. 8259A 接管到告诉后,通知操作系统产生了键盘中断。
  4. 操作系统运行键盘中断例程把缓冲区的数据取走;8042 又能够从新接管新数据了。

解析扫描码

映射数组

在第 1 套扫描码中,一个 Make Code 对应一个按键。咱们能够通过 Make Code 辨认出以后被按下的键是哪个键。例如,A键的 Make Code 是 0x1E;当操作系统接管到的 Make Code 是0x1E 时,就能够认为接管到的数据是A

然而,问题呈现了。咱们在理论输出中有输出 Aa的需要。可扫描码计划中只有 A 的扫描码,没有 a 的扫描码。相似的按键还有数字键 1、2、3 等。怎么解决这个问题呢?

先看看上面这个表格。

Make Code

0

1

2

0x1E

a

A

0

0x02

1

!

0

在下面的表格中,Make Code 是行号,每行有三个不同的值。0x1E行的第 0 列表示意 a0x1E 行的第 1 列示意A

这可能实现一个键示意两种不同的值。

咱们平时怎么取得一个键的不同值呢?以数字键 1 为例。敲击数字键 1 时,获取的值是 1;同时按下shift 键和数字键 1 时,获取的值是感叹号!

在具体实现中,依据是否同时按下了 shift 键来决定是获取第 X 行的第 0 列还是第 1 列。显然,按下 shift 键,获取第 1 列;没有按下 shift 键,获取第 0 列。

第 1 套扫描码一共有 0x80 个,其实就是 ASCII 码表中元素的个数。

咱们仿照下面的表格建设一个元素更多的表格 TB(表头雷同,行数裁减到 0x80 行)。

  1. 第一列是行号,值是 Make Code,假如是 A。
  2. 第二列是 A 对应的键的默认值(没有按下 shift 键)。
  3. 第二列是 A 对应的键的另一个值(按下了 shift 键)。

然而,在键盘上存在不可打印的字符,例如 esc、F1、F2 等。在 TB 中,这些不可打印的键对应的值是咱们设置的某个数值(这一行的第 0 列和第 1 列的数值雷同)。

怎么应用 TB?依据 Make Code 找到对应的行,依据是否按下了 shift 键决定是获取第 0 列还是第 1 列的值。

要在 C 语言中应用这个表格,只能将它用数组示意进去。把这个表格的每一行的 第 0 列、第 1 列、第 2 列 按程序组成一个数组keyMap

如果接管到的 Make Code 是 MC,没有按下 shift 键,对应的值是 keyMap[MC * 3];按下shift 键,对应的值是keyMap[MC * 3 + 1]

反正就是这么回事,硬是要解释一下怎么弄出这个数组的,我解释不分明。

Pause

Pause键只有 Make Code,没有 Break Code。这是仅有的特例,其余键同时具备 Make Code 和 Break Code。

Pause键的 Make Code 是 E1、1D、45、E1、9D、C5。辨认一个键是不是Pause 的算法是:

  1. 查看 Make Code 的结尾是不是 `E1。

    1. 不是,不是 Pause 键。
    2. 是,持续查看残余的扫描码是不是 1D、45、E1、9D、C5。不是,不是Pause 键;是,是 Pause 键。

Print Screen

辨认算法和 Pause 键雷同。

其余

下回分解。

正文完
 0