矩阵式键盘采用行列式结构,按键设置在行列的交叉点上。当使用单片机的P1口与矩阵式键盘连接时,可以将P1口低4位的4条端口线定义为行线,P1口高4位的4条端口线定义为列线,形成4×4键盘,可以配置16个按键,如图6-7所示。
通常将矩阵式键盘的行线作为输入线,通过上拉电阻接+5V电源(在图6-7中,由于P1口内部有上拉电阻,所以不用外接上拉电阻),使行线的状态为1;列线作为输出线,送出低电平0。当键盘上没有键闭合时,所有行线与列线相互分开,行线均呈高电平1状态;当键盘上某一个按键被按下时,该按键所对应的行线与列线短接,此时该行线的电平将被短接的列线钳位为低电平0。
在确认有按键按下,并进行了去抖动后,接下来需要确定被按键所在的行号和列号,并在查找过程中进行防窜键处理。求列号的方法是:先让Y0列线送出低电平,其余列线为高电平,然后读入行线状态,如行线状态不全为1,则说明所按键就在该列;否则,不在该列。然后让Y1列线为低电平,其他列线为高电平,从而判断Y1列有无按键按下。其余列类推。
图6-7 单片机与矩阵式键盘的接口电路
键号是键盘上每个按键的编号。键号的求法,与键盘接口电路的连线和键号的编排方式有关,对应图6-7所示的矩阵式键盘接口电路,可采用如下方法求得键号:
键号=所在行号×键盘列数+所在列号;键号=所在行号的行首键号+所在列号
在图6-7中,键号为14的按键,所在行号为3,所在列号为2,键盘的列数为4,所在行号的行首键号是12,所以键号=3×4+2=14或键号=12+2=14。
求出被按键的键号后,即可调用执行被按键处理程序,在执行被按键处理程序时,再根据键号执行该键所对应的功能程序,以完成该键被按下时所要实现的系统功能。
2 键盘扫描的控制程序
键盘读键程序设计一般有两种方法,即反转读键法和扫描读键法。
(1)反转读键法
采用反转读键盘法,行、列轮流作为输入线。
1)置单片机行线P2.0~P2.3为输入线,列线P2.4~P2.7为输出线,且输出为0。相应的I/O接口的编程数据为0FH。若读入低4位的数据不等于F,则表明有键按下,保存低4位数据。其中为电平“0”的位对应的是被按下键的行位置。
2)设置输入、输出口对换,行线P2.0~P2.3为输出线,且输出为0,列线P2.4~P2.7为输入线,I/O接口编程数据为F0H。若读入高4位数据不等于F,即可确认按下的键。读入高4位数据中为0的位为列位置。保存高4位数据。将两次读数值组合,便得按键码。
(2)扫描读键法
扫描读键法,将所有行线I/O依次置为低电平,如果有键按下,总有一根列线电平被拉至低电平,从而使列输入I/O不全为1。依次向不同行线送低电平,保证在只有一行为低电平的情况下,查所有列的输入线状态。如果全为1,则按键不在此列,否则按键必在此列,且是在与0电平行线相交点上的那个键。
1)送1110到行线:P2.3~P2.0=1110B,再从列线P2.7~P2.4读入数据。若有按键,则其中必有一位为0,如按“3”键,则读入P2.7~P2.4=0111B;同理按“1”键,读入数据为1101B。
2)第一行接着送出P2.3~P2.0=1101B,扫描第二行,依此类推。P2.3~P2.0变化为1110B→1101B→1011B→0111B→1110B循环进行。各按键的扫描码列表见表6-2。
表6-2 各按键的扫描码列表
(续)
3)由于扫描码不易让人联想按键,因此需将扫描码用程序转换成按键码。
4)显示按键情况,可在电路中设计数码显示管。使得按“0”显示0,按“1”显示1……。例如,单片机采用矩阵式键盘接口电路,连接数码管为共阳型,晶振频率为12MHz。
(3)反转读键法的程序设计
ORG 0000H
SJMP STAR
ORG 30H
STAR:ACALL DE100;调用延时
KEY:MOV P2,#0FH;查键开始,行定义输入,列定义输出为0
MOV A,P2;读入P2的值
CPL A
ANL A,#0FH;确保低4位
JZ KEY;无键按下返回
MOV R5,A;有键按下,暂存
MOV P2,#0F0H;列定义输入,行定义输出为0
MOV A,P2
CPL A
ANL A,#0F0H
JZ KEY
MOV R4,A;暂存高4位输入
LCALL DE10;消抖动
KEY1:MOV A,P2;等待键松开
CPL A
ANL A,#0F0H
JNZ KEY1;按键没松开,等待
LCALL DE10
MOV A,R4;取列值
ORL A,R5;与行值相或为组合键值
MOV B,A;结果暂存于B中
MOV R1,#0;键值寄存器R3赋初值=0
MOV DPTR,#TAB;取键码表首址到DPTR
VAL0:MOV A,R1
MOVC A,@A+DPTR;查键码表
CJNE A,B,VAL;非当前按键码,继续查找(www.xing528.com)
ACALL KEYV;以按键码查显示码
MOV P1,A;查找到显示码送P1二极管显示
SJMP KEY;下一次按键输入,循环
VAL:INC R1
SJMP VAL0
TAB:DB 11H,21H,41H,81H;组合键码
DB12H,22H,42H,82H
DB14H,24H,44H,84H
DB18H,28H,48H,88H
KEYV:MOV A,R1
INC A
MOVC A,@A+PC;取显示码(即共阳段码)
RET
DB 0C0H,0F9H,0A4H,0B0H;共阳段码0,1,2,3
DB 99H,92H,82H,0F8H;4,5,6,7
DB 80H,90H,88H,83H;8,9,A,B
DB 0C6H,0A1H,86H,8EH;C,D,E,F
DE100:MOV R6,#200;延时100ms
D1:MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
DE10:MOV R6,#20;延时10ms
D2:MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
RET
END
(4)扫描读键法的程序设计
将上述反转读键法程序设计中读键部分(从标号KEY到标号TAB)换为以下程序,其余部分不变。两种程序设计方法实现的功能完全一样。
KEY:MOV R3,#0FEH;扫描初值
MOV R1,#0;取码指针
KEY1:MOV A,R3;开始扫描
MOV P2,A;将扫描值输出至P2
MOV A,P2;读入P2值,判断是否有按键按下
SWAP A;高低4位互换
MOV R4,A;有按键,存入R4,以判断是否放开
SETB C;C=1
MOV R5,#4;扫描P2.4~P2.7
KEY2:RRC A;将按键值右移1位
JNC KEYIN;=0有键按下,转KEYIN
INC R1;无按键,取码指针加1
DJNZ R5,KEY2;4列扫描完毕?
MOV A,R3
SETB C
RLC A;扫描下一行
MOV R3,A;存扫描指针
JB ACC.4,KEY1
JMP KEY;4行扫描完
KEYIN:ACALL DE10;消抖动
K1:MOV A,P2;与上次读入值进行比较
XRL A,R4
JZ K1;相等,键未放开
ACALL KEYV;键放开后调显示段码
MOV P1,A;段码送P1口显示
SJMP KEY;不相等,键放开,进入下一次的扫描
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。