敲击键盘后字符怎么出现在显示器

Posted 东垂小夫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了敲击键盘后字符怎么出现在显示器相关的知识,希望对你有一定的参考价值。

我们每敲击一次电脑键盘,按键对应的字符就会出现在显示器上。这中间发生了什么?请听我慢慢细说。

相关概念

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

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

每个按键和动作组合起来,会传送给计算机一个编码,这就是内容,术语是“扫描码”,对应的英语词汇是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键相同。

其他

下回分解。

以上是关于敲击键盘后字符怎么出现在显示器的主要内容,如果未能解决你的问题,请参考以下文章

iOS崩溃:在键盘上敲击地球仪以转到表情符号键盘会导致崩溃

ListView 仅在刷新后显示项目

敲击键盘时触发 hotTest

linux系统怎么查看内存和CPU占用情况呀?

如何拦截转到 Java Swing JTextField 的键盘敲击?

输入网址后显示“您的输入包含非法字符”