在键盘上按下一个键以后,屏幕上会很快把这个字符显示出来,我们觉得这是一个再自然不过的事情,但是要实现这一步,里面的机制却很复杂,这篇文章简单讨论一下这个问题。
图二中,我们看到,按下一个键以后,这个被按下的键的信息就被立刻送到一个寄存器中,然后CPU就知道了被按下的是什么键,并把这个键上的字符显示在屏幕上面。
那问题来了,CPU怎么就知道按下的是哪个键呢?
我们先看图三,图中的每一个按键下面,都有若干导线连接,按键的下面,是连接这些导线的开关,一个按键按下去,这些开关有的闭合,有的断开,闭合的为1,断开的为0,这就形成了一个二进制数字,也就是ASCII编码。我们再看图四就更清楚了。
上图中,假设每个按键下面都有k1-k8这八个开关,现在假设a按键按下时,k2,k3,k8闭合,其它的断开,那么a就对应二进制01100001,即十进制97,这正是字符a的ascii码值。到此为止,我们应该大致清楚了CPU能识别哪个按键的原因。
但接下来还有几个问题:
1:是不是任何时候键盘有按键的动作发生,我们的计算机都会响应呢?
相信大部分的朋友们都会说不是,就像我们刚打开百度
这个时候你无论怎么按键盘,那个框框里面都没反应,只有当我们把鼠标在框框里面按了一下,里面出现了闪动的光标的时候,这个时候我们按键才有用。
那么怎么来理解这个事情呢?首先,我们要有一个概念,前面讲的按下a键等于产生了一个二进制数字,但是这个数字由谁来识别呢?那么计算机里面所有这样的事情都是由程序来做的,这个程序叫做键盘扫描程序,是一个中断程序,也就是说,这个中断程序什么时候能够运行,必须得到允许才可以,计算机里面有一个中断控制电路
就是用来判断哪个中断程序什么时候允许执行。那么上述百度输入框的例子,我们就可以理解为,当我们把光标点进那个输入框的时候,键盘输入的中断程序才被允许执行。高级语言中的scanf,getfocus函数都可以这样理解。那么,那个被允许执行的中断程序又是用来干什么的呢?其实很简单,就是把那个输入的字符a的ascii码转换为输出字形码,并显示在屏幕上。
第二个问题,就是当我们按住一个键不放,或者同时按下两个键的时候,这个时候怎么处理呢?
从上面两个图可以看出,当我们按下一个键不放的时候,会出现多个a,那么系统肯定是以按键持续多长时间作为按了一次a来处理的;当同时按住两个键不放的时候,系统最终会判断出哪个键先按下后按下,因为同一秒按下,不等于区分到0.1秒的时候还相同,不等于0.01秒的时候还相同。。。。。。而程序指令的执行时间是纳秒级的。
那么,做这个事情的又是什么程序呢?就是一个键盘扫描程序。
这个程序我们不必深究,我们只需要知道,所谓的键盘扫描,就是在图四的基础上反复执行temp=P2这条指令,P2可以认为是一个寄存器,也就是不断地读出某个键被按下的键值。我们再看到里面有一个语句需要连续判断10次,就是用来判断某个按键被按下的持续时间是否足够,足够的话才能被认为是有效按键。
这个键盘扫描程序只要操作系统正常运行就在反复执行。