敲击键盘后字符怎么出现在显示器
我们每敲击一次电脑键盘,按键对应的字符就会出现在显示器上。这中间发生了什么?请听我慢慢细说。
相关概念
人对按键的操作,从两个维度去描述,一个是“动作”,另一个是“内容”。
按下一个按键,松开一个按键,按下一个按键并且保持按住状态一段时间(长按),这些都是动作。
每个按键和动作组合起来,会传送给计算机一个编码,这就是内容,术语是“扫描码”,对应的英语词汇是scan code。
按下按键、长按键对应的扫描码叫“Make Code”,松开按键对应的扫描码叫“Break Code”。
Break Code和Make Code的关系是:Break Code = Make Code & 0x80。
为什么两种编码之间有上面的关系?设计人员特意这样设计的。
三个硬件
8048
在键盘上执行某种操作(按键、长按、松开键)时,8048会检测到这个操作,把这个操作对应的扫描码发送给8042。
到现在为止,出现了三套编码方案,我们现在的键盘一般使用第2套方案。
8042
8042从8048接收到第2套方案的扫描码后,把它转换成第1套扫描码,并且放入缓冲区,最后,通知8259A发生了键盘中断。
中断例程取走缓冲区的数据后,8042才会接收新的数据。缓冲区的数据不被取走,8042就不会接收新数据。
8259A
8259A接收来自8042的键盘中断,让操作系统分派中断例程处理缓冲区的数据。
流程
人类敲击键盘,8048监测到”敲击了哪个键“,把对应的扫描码传送给8042。
8042接收到8048的数据后,将数据转换成第1套扫描码,放入缓冲区;然后通知8259A。
8259A接收到通知后,告诉操作系统发生了键盘中断。
操作系统运行键盘中断例程把缓冲区的数据取走;8042又可以重新接收新数据了。
解析扫描码
映射数组
在第1套扫描码中,一个Make Code对应一个按键。我们可以通过Make Code识别出当前被按下的键是哪个键。例如,A键的Make Code是0x1E;当操作系统接收到的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键,获取第1列;没有按下shift键,获取第0列。
第1套扫描码一共有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 Code,没有Break Code。这是仅有的特例,其他键同时具有Make Code和Break Code。
Pause键的Make Code是E1、1D、45、E1、9D、C5。识别一个键是不是Pause的算法是:
检查Make Code的开头是不是`E1。
不是,不是Pause键。
是,继续检查剩余的扫描码是不是1D、45、E1、9D、C5。不是,不是Pause键;是,是Pause键。
敲击键盘后字符怎么出现在显示器相关推荐
- python作业.创建两个文本框,一个按钮。第 1 个文本框绑定任意键事件,敲击键盘任意可显示字符,在交互窗口中显示该字符;第 2 个文本框绑定<a>键事件,敲击键盘 a 字符,在交互窗口中显示 10
""" 创建两个文本框,一个按钮. 第 1 个文本框绑定任意键事件,敲击键盘任意可显示字符,在交互窗口中显示该字符: 第 2 个文本框绑定<a>键事件,敲击键 ...
- 创建两个文本框,一个按钮。第 1 个文本框绑定任意键事件,敲击键盘任意可显示字符,在交互窗口中显示该字符;
创建两个文本框,一个按钮.第 1 个文本框绑定任意键事件,敲击键盘任意可显示字符,在交互窗口中显示该字符:第 2 个文本框绑定键事件,敲击键盘 a 字符,在交互窗口中显示 10 个'a'字符:按钮绑定 ...
- 计算机的击键方法教学教案,2.2 敲击键盘 教案
2.2 敲击键盘 教案 ==================资料简介====================== <第2节 敲击键盘>教学设计 教科书选材: 四川教育出版社 三年级上册 教 ...
- 解决ubuntu更改Linux内核(或更新系统)后扩展屏(第二显示器)无法正常显示问题)
解决ubuntu更改Linux内核(或更新系统)后扩展屏(第二显示器)无法正常显示问题 我的解决方案 一定先看这个(很重要) 直接看这个就可以 前几天更新了一下ubuntu系统,一切正常,但是当我把系 ...
- swift:iOS模拟器键盘设置(弹出,中文键盘,隐藏)
1 当点击UItextField输入框时,没有弹出虚拟键盘 解决方案:取消勾选Hardware>Keyboard>Connection HardWare Keyboard选项 2 想要模拟 ...
- 联想笔记本键盘亮屏幕不亮_联想电脑显示器不亮怎么办
联想电脑显示器不亮怎么办 联想电脑显示器不亮解决方法一: 1 .开机后,我们先不管显示器是否能正常的亮或显示,我们 先再次按主机上的重启键,然后我们按一下键中的" num lock &quo ...
- 电脑一直黑屏,但敲击键盘时按键有亮光,问题解决办法之一
说明: 电脑:Dell.windows10 按键:电脑正常前已经通过"Fn"+亮灯键(一般是键盘F10或空格键)打开键盘灯光 问题说明: 电脑一直黑屏,关机后再开机,开机后敲击键盘 ...
- java字符串去重复_java去除字符串中重复、不重复、消除重复后字符
java去除字符串中重复.不重复.消除重复后字符 import java.util.HashSet; import java.util.Set; public class Main { public ...
- Tecplot 360 按教程安装完毕后,弹出“Is your Tecplot 360 EX liense valid?”【终极解决办法】
Tecplot 360 按教程安装完毕后,弹出"Is your Tecplot 360 EX liense valid?"[终极解决办法] 1. 解决办法总结 参考经典讨论帖:ht ...
最新文章
- 用ASP.NET上传大文件
- 零散的MySQL基础总是记不住?看这一篇就够了!
- [C#基础知识系列]专题十:全面解析可空类型
- 学生电脑哪个牌子好_泡脚足浴盆哪个牌子好?家用足浴盆哪个品牌好?足浴盆哪个牌子最安全?...
- invalid new-expression of abstract class type 'CurveFittingEdge'
- Linux 标准I/O函数库
- LRU和LFU的区别
- 揭秘ARouter路由机制,源码+原理+手写框架
- VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法
- http与https的作用与区别
- C# OO(初级思想)。
- 计算机组成原理在线实验,《计算机组成原理》实验.doc
- atitit ui引擎之道 游戏引擎之道.docx 1. 概念	2 1.1. (cocos,createjs,dom)	2 2. 游戏引擎的构成(图形引擎(渲染系统),控件部件系统,事件系统 ,布局
- 鼠标移入移出时定时器加速的原因_2020年值得购买的鼠标有哪些?
- ROSDUCT:通过rosbridge在本地公开远程ROS主题、服务和参数
- 算法题目打卡:Ques20201012
- 微信公众号、企业服务号如何配置运营管理人员
- android 垃圾清理 文件清理
- [生存志] 第22节 历代大事件概览 五代十国
- Verilog纠错记录