线反转法行列键盘扫描-Read
-DYDIY-
线反转法行列键盘扫描
杜洋 2005-11-21
行列键盘的学习是单片机学习的必经之路,可是对了初学者来说学习起来并
不容易。书上的资料不多,或是说明不细,抑或太复杂不易理解。我在学行列键
盘时也有过此类的问题,近日我发现了一个非常好的行列扫描的方式——线反转
法行列键盘扫描,它简单易懂,非常适合初学者学习,也可作为程序开发之用。
我同时也写了汇编和C 语言两个事例程序,不论你说什么语言 可以看懂。汇编
和C 的双语言例程也是我今后技术类文章的特点之一。
了解行列键盘扫描得从硬件开始学习,我们得知道行列扫描是什么意思。在
单片机系统中为了扩大同一个I/O 口的键盘个数,则采用了行列式键盘接法,就
是交叉相接。如图:
图1
键盘接的前4 个I/O 口为 接线,后4 个为列接线。这样的接法就构成了一
个坐标,每一个键 对应这一个行的位置和一个列的位置。例如我们说左上角的
那个所对应第1 行和第4 列,即单片机P 10 和P 17 两个I/O 口。键盘的组成是用
的微动开关,微动开关的特性是当有键按下时开关的两个引脚闭合导通。无按键
时两个引脚是断开的状态。这样当我们按下图1 中左上角的键时P 10 和P 17 在
物理上是导通了,而其它的I/O 口(P 11~P 16)都处于独立的状态。我们只要让
单片机发现哪两个I/O 口是导通的我们就可以知道是哪一个键被按下了。
这里我们用的一种方法是先将4 个行线的I/O 口置为 “0 ”(低电平),将列
线的I/O 口置为 “1”( 电平)。这样当有键按下时某一行的I/O 口就和某一列
/ - 1 -
-DYDIY-
中的I/O 口导通了,因为行线的口 是 “0 ”(低电平)所以和行线导通的列线也
将会变成“0 ”,而其余的列线因为开始时是 “1”又没和其它的行线导通,所以
依然是“1”。这样我们就可以找出了我们的按键所在的列了 (因为列线中只有导
通的列线变为了“0 ”,任何电平与低电平相导通 属于短路,短路的线将会是低
电平)。
其实,所谓的“ ”、“列”是我们人为规定的,如果试着把列看成行,将
看成列是一样的。这里我们规定P 10~P 13 为行,P 14~P 17 为列。
现在我们知道了我们按下的键所在的列了,只要再知道它所在的行的话,我
们就可以确定它的位置了。这时我们将4 个 线的I/O 口置为 “1”( 电平),
将列线的I/O 口置为 “0 ”(低电平),这是和最初的置式相反。被按着的那个按
键还是导通的,还是属于短路,所以在被置“1”的行线中将会有一个变成了“0 ”,
这样我们就确定了按键在 中的位置,到此我们还要确定什么呢?不需要了,我
们已经找到了按下的键了。
举一个例子吧。例如我们按下了左上角的那个按键,首先当4 个行线的I/O
口置为 “0 ”,列线的I/O 口置为 “1”时 (即P1 口的字节数据,第
1 行和第4 列导通,使第4 列 (P 17)变为了 “0 ”(此时的P1 口的字节数据为 。之后当4 个 线的I/O 口置为 “1”,列线的I/O 口置为 “0 ”时 (即
P1 口的字节数据,第4 列和第1 导通,使第1 (P 10)变为了
“0 ”(此时的P1 口的字节数据)。通过了两次用单片机读出2 个字
节的数据,分别是 和 (从左向右,由 位到低位,P 17
—>P 10)。前一个字节的低4 位和后一个字节的 4 位 是 “0 ”,于是我们将它
们去掉再将余下的数据拼成一个新的字节,即。如果我们按下的是
第一行的第2 个键的话,我们得到的字节将会是(第1 行,第3 列)。
每按一个键我们都得到不同的字节,比对我们的字节是什么就可以知道键值
是什么了。
/ - 2 -
-DYDIY-
单片机行列键盘扫描程序流程: