单片机--矩阵键盘实验

  1. 实验目的和任务

目的:利用“模块化单片机教学实验平台”,加深对单片机与矩阵键盘的接口电路设计以及程序设计的理解。

任务:1、学习独立式按键的查询识别方法。

2、非编码矩阵键盘的行反转法识别方法。

3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。

4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。

5、掌握利用Keil51软件对程序进行编译。

6、会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果

  1. 实验原理

1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。

2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。

3、识别键的闭合,通常采用行扫描法和行反转法。行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。

行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。

行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。

  1. 实验内容

使用扫描法通过矩阵键盘(2行4列,一共八个按键)控制8个LED灯的点亮。按下第一行第一列的按键使LED1点亮,其他LED熄灭;按下第一行第二列的按键使LED2点亮,其他LED熄灭;按下第一行第三列的按键使LED3点亮,其他LED熄灭;按下第一行第四列的按键使LED4点亮,其他LED熄灭;按下第二行第一列的按键使LED5点亮,其他LED熄灭;按下第二行第二列的按键使LED6点亮,其他LED熄灭;按下第二行第三列的按键使LED7点亮,其他LED熄灭;按下第二行第四列的按键使LED8点亮,其他LED熄灭。

图1 LED电路图

图2 按键电路图

注:把拨码开关(DIP)拨到断开的一侧。该矩阵键盘只用到前两行,即2*4的矩阵键盘。

表1 硬件连线表

CPU_CORE_51

MAIN_BOARD

P2:P1.0-P1.7

J14:LINE0-COLUM3

P3:P2.0-P2.7

J48:LED1-LED8

注意:实验箱的AT89S52单片机的晶振频率为11.0592MHz!

  1. 实验过程和结果

①关掉实验电源。将CPU 板插接在JK1、JK2 上,注意CPU 板的插接方向。按照前面连接关系表将硬件连接好。

②将AT89S52 芯片插在CPU 板的CPU 插座上(注意不要插反)。母板上电。

③运行Keil 开发环境,按照“模块化单片机教学实验平台配套的实验指导书1.2.3 节”介绍的方法建立工程exp11.uV2,CPU 为AT89S52,不包含启动文件STARTUP.A51。

④编写汇编语言源程序exp11.asm 完成基本实验的功能。把源程序exp11.asm加入到工程exp11.uV2,并设置工程exp11.uV2 属性,将其晶振频率设置为11.0592MHz,选择输出可执行文件。

⑤构造(Build)工程exp11.uV2。

⑥通过PROGISP 烧写软件,利用ISP 下载线(见“模块化单片机教学实验平台配套的实验指导书1.3 节”)把HEX 文件下载到单片机中。

⑦下载成功后,通过按下不同按键,观察LED1~7 的亮灭。

图3 实验结果图

  1. 实验心得

本次实验需要先判别整个键盘有无按键按下,从第0列开始逐列检测检测,可以检测出哪个按键被按下。然后用到去除按键的抖动。该实验难度较高,相比以往实验更考验综合能力。如何使用扫线法判断所在行是实验的难点所在。实验中因为对扫线法的理解不深入,在实验中没能完成实验。试验后仔细阅读书上的解释和题本提供的案例程序,我知道了自己实验失败的原因所在,并重新设计了程序和实验。通过学习后,对扫描键盘的程序更加了解,将理论上的结果和自己实验做的结果相印证,对书本上知识掌握的更加牢固,对代码程序有更加深刻的理解。在实验中,对模板的使用更加熟练,对电路的连接更加熟练。我对于矩阵键盘的工作方式有了更进一步的认识,也对扫描法查询矩阵键号的方法编写有了更进一步的掌握。单片机提高重在实践,想要学好单片机,软件编程必不可少。

  1. 附录(代码)

(1)基本实验

ORG 0000H

LJMP MAIN

MAIN:MOV P1,#11110000B;给p1口送数11110000

MOV A,P1       ;获取P1口的电平

XRL A,#11110000B

;将P1口电平与11110000异或运算

;若有按键按下,A不为0

JZ MAIN        ;无按键按键则返回

LCALL TIME_    ;跳转到延时程序

MOV P1,#11110000B

MOV A,P1

XRL A,#11110000B   ;该部分操作与上述操作相同

MOV R3,A       ;保存此时A的值

JZ MAIN          ;确认有按键按下

MOV R0,#11110111B;扫描法判断

MOV R1,#0      ;R1存储列的权值

I:    MOV P1,R0      ;将R0值传递给P1

MOV A,P1       ;读取P1的值

AAA0:JNB ACC.4,AAA1

;如果ACC的第四位(即第一列)不为零

MOV R1,#0      ;r1存0

LJMP OK     ;跳转到计算环节

AAA1: JNB ACC.5,AAA2 ;同上,判断第二列

MOV R1,#01

LJMP OK

AAA2:JNB ACC.6,AAA3  ;同上,判断第三列

MOV R1,#02

LJMP OK

AAA3: JNB ACC.7,AAA4 ;同上,判断第四列

MOV R1,#03

LJMP OK

AAA4:MOV A,R0

JNB ACC.2,MAIN ;判断是否结束

RR A        ;环移

MOV R0,A

MOV A,R1

MOV R1,A   

LJMP I

TIME_:MOV R0,#05

TT:   MOV R1,#250

DJNZ R1,$

DJNZ R0,TT

RET

OK:     ;判断所在行并送数

MOV A,R1

ADD A,R0

MOV R0,A

MOV A,#1

INC R0

AAA:CJNE R0,#0,BBB

RL A

INC A

LJMP AAA

BBB:MOV P2,A

LJMP MAIN

END

(2)扩展实验

ORG 0000H

LJMP MAIN

MAIN:MOV P1,#11110000B;送数11110000

MOV A,P1    ;取当前P1的值

XRL A,#11110000B;与11110000与或运算

JZ MAIN     ;如果为0则跳转回

LCALL TIME_ ;延迟子系统

MOV P1,#11110000B

MOV A,P1

XRL A,#11110000B

JZ MAIN     ;再次判断确定非误触

MOV R3,A    ;存储当前A信息

MOV P1,#00001111B  ;判断所在列

MOV A,P1

XRL A,#00001111B

MOV R4,A    ;存至R4

MOV A,R3

JNB ACC.1,NEXT1

MOV R3,#4;若为第二行则若R3存4,否则存0

LJMP NEXT2

NEXT1: MOV R3,#0;判断行,依次为0,1,2,3

NEXT2:MOV A,R4

JNB ACC.4,NEXT3

MOV R4,#0

LJMP NEXT7

NEXT3:JNB ACC.5,NEXT4

MOV R4,#1

LJMP NEXT7

NEXT4:JNB ACC.6,NEXT5

MOV R4,#2

LJMP NEXT7

NEXT5:MOV R4,#3

NEXT7:MOV A,R3

ADD A,R4      ;将两个权值相加

MOV P2,A      ;送至P2

LJMP MAIN

TIME_:MOV R0,#05

TT:   MOV R1,#250

DJNZ R1,$

DJNZ R0,TT

RET

END

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜航一直在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值