首页 理论教育 矩阵式键盘扫描应用-单片机原理与接口技术设计与实训

矩阵式键盘扫描应用-单片机原理与接口技术设计与实训

时间:2023-11-16 理论教育 版权反馈
【摘要】:1 单片机与矩阵式键盘的接口矩阵式键盘采用行列式结构,按键设置在行列的交叉点上。图6-7 单片机与矩阵式键盘的接口电路键号是键盘上每个按键的编号。1)置单片机行线P2.0~P2.3为输入线,列线P2.4~P2.7为输出线,且输出为0。2)第一行接着送出P2.3~P2.0=1101B,扫描第二行,依此类推。例如,单片机采用矩阵式键盘接口电路,连接数码管为共阳型,晶振频率为12MHz。

矩阵式键盘扫描应用-单片机原理与接口技术设计与实训

1 单片机与矩阵式键盘的接口

矩阵式键盘采用行列式结构,按键设置在行列的交叉点上。当使用单片机的P1口与矩阵式键盘连接时,可以将P1口低4位的4条端口线定义为行线,P1口高4位的4条端口线定义为列线,形成4×4键盘,可以配置16个按键,如图6-7所示。

通常将矩阵式键盘的行线作为输入线,通过上拉电阻接+5V电源(在图6-7中,由于P1口内部有上拉电阻,所以不用外接上拉电阻),使行线的状态为1;列线作为输出线,送出低电平0。当键盘上没有键闭合时,所有行线与列线相互分开,行线均呈高电平1状态;当键盘上某一个按键被按下时,该按键所对应的行线与列线短接,此时该行线的电平将被短接的列线钳位为低电平0。

在确认有按键按下,并进行了去抖动后,接下来需要确定被按键所在的行号和列号,并在查找过程中进行防窜键处理。求列号的方法是:先让Y0列线送出低电平,其余列线为高电平,然后读入行线状态,如行线状态不全为1,则说明所按键就在该列;否则,不在该列。然后让Y1列线为低电平,其他列线为高电平,从而判断Y1列有无按键按下。其余列类推。

978-7-111-54295-7-Chapter06-8.jpg

图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 各按键的扫描码列表

978-7-111-54295-7-Chapter06-9.jpg

(续)

978-7-111-54295-7-Chapter06-10.jpg

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;不相等,键放开,进入下一次的扫描

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈