rovershen 阅读(1004) 评论(3)

在嵌入式系统中,经常需要接受用户输入或者选择。按键多的时候,一般采用现成的键盘扫描芯片来处理,如8279,而按键少的时候,则一般自己用I/O口做键盘扫描端口,这样便需要自己编写键盘扫描程序程序。
键盘扫描方式有两种,即交叉扫描和直接扫描,它们各有优点。在同样多I/O口的情况下,交叉扫描可以接比较多的键盘,但处理相对复杂一些,直接扫描可以接的键盘较少,但处理简单。
所谓交叉扫描,是将I/O口分成两组,分别做行和列,形成一个键盘矩阵。假设行为M个,列为N个,则可以提供MxN个按键,接法如下:

扫描每隔一段时间进行一次,例如50ms。扫描时,先将行作为输出,列作为输入。先在第一行输出L(低电平),其余行输出H(高电平),读取N个列的值,如果有L,则说明在则一列上有按键按下,那么将行变为输入,列变为输出,在该列输出L,其余列输出H,读出M行的值,哪一行为L则该行和该列交叉的按键被按下,这样便得到了按键的ID。按照这个方法,依次扫描到第M行,则所有按键都能被扫描到。在扫描过程中,如果有多行或者多列读出来的值为L,则说明有多个按键按下,因为每个按键都能被准确定位,因此每次只接受一个按键还是都接受可以按自己的需要处理。
所谓直接扫描,是每个端口直接接按键,不与其它端口交叉,因此有多少端口就可以接多少按键。接法如下:

跟交叉扫描一样,也是每隔一段时间扫描一次。扫描时,直接读取端口的值,如果某位为L,则表示对应的按键按下。
当然,不管是交叉扫描还是直接扫描,都有去抖动的问题,可以用软件来解决,如多次判断,或者加大扫描间隔,也可以用硬件来解决,如加RC网络。则要看自己的喜好和需要了。
还有一个问题就是重复按键的问题,即按住一个键一段时间后,可视为重复按键,这个也是根据需要通过软件的算法做到的。


评论列表
Jiang
re: 嵌入式系统的键盘设计
如果同时有两个按键按下,那是不是分别各有两个行和列为低,这样不是对应了4个键值了?
rovershen
re: 嵌入式系统的键盘设计
如果两个按键按下,要么是两个行,要么是两个列,怎么跑出来4个?
ggg
re: 嵌入式系统的键盘设计
sdfsfsfsd

发表评论
切换编辑模式