首页 > 编程知识 正文

对于字符显示器 主机送给显示器,电脑上如何显示键盘

时间:2023-05-04 04:34:55 阅读:146261 作者:4323

我们每敲一次计算机键盘,显示屏上就会显示出与键对应的字符。 这路上发生了什么? 请慢慢听我说。

相关概念

人按键的操作由两个维度描述:“动作”和“内容”。

按下一个按钮、松开按钮、按下按钮或按住一段时间是动作。

每一个键和操作组合在一起,都会将代码发送到计算机。 这是内容,术语是“扫描码”,对应的英语词汇是扫描码。

按键,长键对应的扫描码称为“Make Code”,松开键后对应的扫描码称为“Break Code”。

Break Code和Make Code之间的关系是Break Code=Make Code0x80。

为什么两个代码之间有上面的关系? 设计师特意这样设计的。

三个硬件

8048

当用键盘进行某种操作(按键、长按、释放键)时,8048检测到该操作,并将与该操作对应的扫描码发送到8042。

到目前为止,已经出现了三个编码计划,但是我们现在的键盘通常使用第二个计划。

8042

8042在从8048接收到第二个计划的扫描码后,将其转换为第一个扫描码并放入缓冲区,最后通知8259A发生键盘中断。

在中断例程清除缓冲区中的数据之前,8042不会接收新数据。 如果未获取缓冲区数据,则8042不会接收新数据。

8259A

8259A从8042接收键盘中断,并使得OS分配中断例程处理缓冲器的数据。

过程

当人敲键盘时,8048监视“敲了哪个键”,并将对应的扫描码发送到8042。

在接收到80428048的数据后,将数据转换为第一组扫描码,放入缓冲区; 然后通知8259A。

8259A收到通知,通知操作系统发生了键盘中断。

操作系统运行键盘中断例程以删除缓冲区中的数据; 842又可以接收新数据了。

扫描码的分析

数组映射

在第一套扫描码中,一个Make Code对应一个键。 可以识别Make Code中当前按下的键是哪个键。 例如,a密钥的make代码为0x1E; 如果OS接收到的Make Code为0x1E,则接收到的数据被认为是a。

但是,发生了问题。 我们有在实际输入中输入a和a的需求。 扫描码方式只有a的扫描码,没有a的扫描码。 同样的键有数字键1、2、3等。 怎么解决这个问题?

先看看下表吧。

Make Code 0 1 2

0x1E a A 0

0x02 1! 0

在上表中,Make Code是行号,每行有三个不同的值。0x1E行的第0列表示a,0x1E行的第1列表示a。

这样,一个键可以表示两个不同的值。

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

在具体的实现中,根据是否同时按下shift键,决定是取得第x行的第0列还是取得第1列。 很明显,按shift键获取第一列; 不按shift键获取第0列。

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

按照上表,制作要素多的表TB。 标题相同,行数扩展为0x80行。

第一列是行号,值为Make Code,a。

第二列是与a对应的键的默认值。 没有按下shift键。

第二列是与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代码,没有break代码。 这是唯一的特例,其他密钥同时具有Make Code和Break Code。

Pause密钥的make代码为E1、1D、45、E1、9D和C5。 识别密钥是否为Pause的算法如下。

检查Make Code的开头是否为` E1。

不,不是Pause键。

是的,继续检查剩下的扫描代码是否为1D、45、E1、9D、C5。 不,不是Pause键; 是的,是Pause键。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。