光电工程师社区

标题: 键盘 [打印本页]

作者: suncon    时间: 2003-4-15 11:17
标题: 键盘
键盘
我们知道键盘上面的键就是一个个的开关,所以当你在键盘上按下一个键的时候就等于是按下了一个开关。于是,也许我们就有了这种猜测:是不是每个按键对应一条线路,计算机随时扫描每一条线路,当某条线路被导通或者被切断的时候,计算机就将相应的信息进行处理。从理论上讲这种方案是完全可行的。但是这样就会带来一个很大的麻烦,以我们现在常用的104键盘为例,那就是104条线路,并且每8个开关还要占用一个8位的并行端口,这样岂不是非常之麻烦?所以这种设想只能用在只有几个按键的小键盘,省时省力。那么我们的键盘应该怎样做呢?看看你手中的键盘像什么?学过线性代数的人也许马上就会想到矩阵,对,我们手中的键盘就是这样的。

看上面这张电路图,假设我们现在手中只有一个16键的键盘(104键的电路图实在太难画了),这16个键排成4行×4列的矩阵,然后接在计算机的控制端口上。端口由计算机的控制芯片构成,其中端口A做输出(此输出不同于声卡显卡,这里用来输出电平,后面的输入也一样),端口B做输入。矩阵的4条行线接到输出端口A的PA3-PA0。四条列线连接到输出端口B的PB3-PB0,四条列线还同时接到输入端口B的PB7-PB4上,这样做的目的就是为了用输入指令读取B口的状态时,可同时读取键盘的行列信号。在我们没有按键的时候,由于接到+5V(这里只是一个假设的电压)上的上拉电阻(用于置换高低电平)的作用,列线被置为高电平。当我们按下某一个键的时候,该键所在的列线和行线接通。这个时候,如果向被压下键所在的行线上输出一个低电平信号,则对应的列线也呈现低电平。当从B口读取列线信号的时候,便能检测到该列线的低电平。读取B口的状态时,还能读到行线上的低电平信号。这样一来,根据读入的行和列状态中低电平的位置,便能确定哪个按键被压下了。怎么样?是不是特简单?也许你现在还觉得云山雾罩的,下面我们结合实际说一说。

首先是计算机控制芯片反复的检测是不是所有的键都被松开,如果是,那么就从输出口A向所有的行线输出0电平,再通过B口的低四位读取列值,若其中有0值,那就表明有键被压下了。当检测到有按键被压下之后,控制电路首先要做的就是先延长一点时间(一般为x ms),然后再次检查该键是否仍未松开,若仍未松开,就确认该键被按下,这一步的目的就是为了消除我们前面已经说过的触点抖动现象。然后先从A口输出一个低电平到以行线上,再从B口读入各列的值,若没有一列为低电平,那就说明被按下的键不在此行。然后依次对每一行重复这个过程,直至查到某一列线上出现低电平为止。被置成低电平的行和被读到低电平的列便是被按下按键的行列值。在取得被按下按键的行列值之后,就能得到该键的扫描码。

现在知道了吧,键盘很多按键不能同时按下不是因为接口ps/2或者usb的问题。是因为控制芯片不能同时处理这么多信号~~


作者: neathosalo    时间: 2003-4-15 16:16
标题: 键盘
支持
作者: ntzhenhua    时间: 2009-2-13 16:22
看不懂,不过难为楼主想到这些了




欢迎光临 光电工程师社区 (http://bbs.oecr.com/) Powered by Discuz! X3.2