单片机--矩阵键盘实验

  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

  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
实验矩阵键盘实验 一、实验内容 1、编写程序,做到在键盘上每按一个数字键(0-F)用发光二极管将该代码显示出来 。按其它键退出。 2、加法设计计算器,实验板上有12个按键,编写程序,实现一位整数加法运算功能 。可定义"A"键为"+"键,"B"键为"="键。 二、实验目的 1. 学习独立式按键的查询识别方法。 2、 非编码矩阵键盘的行反转法识别方法。 三、实验说明 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个键的反转码建一个表,通过查表就可知道是哪个键被 按下了。 四、接线方法 键盘连接成4×4的矩阵形式,占用单片机P1口的8根线,行信号是P1.0- 1.3,列信号是P1.4-1.7。 五、实验电路 参考学习板说明书P14。 六、参考程序 "程序一: " " " "/***********************************************************" "**** " "功能:4*4矩阵键盘,LED显示所按的键 " "作者:txl " "时间:2009-04 " "版本:V1.0 " "************************************************************" "***/ " "#include<reg52.h> " "#define uint unsigned int " "#define uchar unsigned char " " " "sbit wei1=P2^0; " " " " " "uchar code table[]={0xC0,0xF9,0xA4,0xB0, " "0x99,0x92,0x82,0xF8, " "0x80,0x90,0x88,0x83, " "0xC6,0xA1,0x86,0x8E};//共阳数码管码表 " "//全局变量 " "uchar num,temp,num1; " "//函数声明 " "void delay(uint z); " "uchar keyscan(); " "void display(uchar aa); " " " "void main() " "{ " "num=1; " "wei1=0; " "P0=0xC0; " " " " " "while(1) " "{ " " " "display(keyscan()); " "} " "} " " " " " "void display(uchar aa) " "{ " "P0=table[aa-1]; " "} " " " " " " " "uchar keyscan() " "{ " "P1=0xfe; " "temp=P1; " "temp=temp&0xf0; " "while(temp!=0xf0) " "{ " "delay(5); " "temp=P1; " "temp=temp&0xf0; " "while(temp!=0xf0) " "{ " "temp=P1; " "switch(temp) " "{ "

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值