enter键的ascii码_键盘两个键同时按下时计算机如何识别被按下的是哪个键

7a56bbbc21c25d1ebf2694ea81bf3be8.png

图一

fdbb84eae4b2a662075a53dec3cf4722.png

图二

在键盘上按下一个键以后,屏幕上会很快把这个字符显示出来,我们觉得这是一个再自然不过的事情,但是要实现这一步,里面的机制却很复杂,这篇文章简单讨论一下这个问题。

图二中,我们看到,按下一个键以后,这个被按下的键的信息就被立刻送到一个寄存器中,然后CPU就知道了被按下的是什么键,并把这个键上的字符显示在屏幕上面。

那问题来了,CPU怎么就知道按下的是哪个键呢?

b3c2b62d464ec950e7b4ed124dee7718.png

图三

我们先看图三,图中的每一个按键下面,都有若干导线连接,按键的下面,是连接这些导线的开关,一个按键按下去,这些开关有的闭合,有的断开,闭合的为1,断开的为0,这就形成了一个二进制数字,也就是ASCII编码。我们再看图四就更清楚了。

29587ebdce314cc1c517f1fa9e445839.png

图四

上图中,假设每个按键下面都有k1-k8这八个开关,现在假设a按键按下时,k2,k3,k8闭合,其它的断开,那么a就对应二进制01100001,即十进制97,这正是字符a的ascii码值。到此为止,我们应该大致清楚了CPU能识别哪个按键的原因。

但接下来还有几个问题:

1:是不是任何时候键盘有按键的动作发生,我们的计算机都会响应呢?

相信大部分的朋友们都会说不是,就像我们刚打开百度

47b87cf5c4bf74d5cc1bc4c72bcd998e.png

这个时候你无论怎么按键盘,那个框框里面都没反应,只有当我们把鼠标在框框里面按了一下,里面出现了闪动的光标的时候,这个时候我们按键才有用。

82ae43b20ccbdfe976ad2731ea1f5005.png

那么怎么来理解这个事情呢?首先,我们要有一个概念,前面讲的按下a键等于产生了一个二进制数字,但是这个数字由谁来识别呢?那么计算机里面所有这样的事情都是由程序来做的,这个程序叫做键盘扫描程序,是一个中断程序,也就是说,这个中断程序什么时候能够运行,必须得到允许才可以,计算机里面有一个中断控制电路

cd959f2113508026d0aa0f796e499418.png

图五

就是用来判断哪个中断程序什么时候允许执行。那么上述百度输入框的例子,我们就可以理解为,当我们把光标点进那个输入框的时候,键盘输入的中断程序才被允许执行。高级语言中的scanf,getfocus函数都可以这样理解。那么,那个被允许执行的中断程序又是用来干什么的呢?其实很简单,就是把那个输入的字符a的ascii码转换为输出字形码,并显示在屏幕上。

第二个问题,就是当我们按住一个键不放,或者同时按下两个键的时候,这个时候怎么处理呢?

5afd89afc70b8214c6d64f48ca17aae3.png

按住a键不放

41966220998f0fe8c90274ee0a20894e.png

同时按下f和d两个键

从上面两个图可以看出,当我们按下一个键不放的时候,会出现多个a,那么系统肯定是以按键持续多长时间作为按了一次a来处理的;当同时按住两个键不放的时候,系统最终会判断出哪个键先按下后按下,因为同一秒按下,不等于区分到0.1秒的时候还相同,不等于0.01秒的时候还相同。。。。。。而程序指令的执行时间是纳秒级的。

那么,做这个事情的又是什么程序呢?就是一个键盘扫描程序。

db630b9bfe090406825a79e3f3893d10.png

这个程序我们不必深究,我们只需要知道,所谓的键盘扫描,就是在图四的基础上反复执行temp=P2这条指令,P2可以认为是一个寄存器,也就是不断地读出某个键被按下的键值。我们再看到里面有一个语句需要连续判断10次,就是用来判断某个按键被按下的持续时间是否足够,足够的话才能被认为是有效按键。

这个键盘扫描程序只要操作系统正常运行就在反复执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值