南京林业大学
实验报告
基于 AT89C51
单片机 4x4 矩阵键盘接口电路设计
课 程 院 系 班 级 学 号 姓 名 指导老师
机电一体化设计基础 机械电子工程学院
杨雨图
2013年 9月 26日
一、实验目的
1、 掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。 2、 掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。 3、 掌握利用 Keil51 软件对程序进行编译。
4、 用 Proteus 软件绘制“矩阵键盘扫描”电路,并用测试程序进行仿真。 5、 会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果
能做出分析和解释,能写出符合规格的实验报告。
二、实验要求
通过实训,学生应达到以下几方面的要求: 素质要求
1. 以积极认真的态度对待本次实训,遵章守纪、团结协作。
2. 善于发现数字电路中存在的问题、分析问题、解决问题,努力培养独立工作能力。 能力要求
1. 模拟电路的理论知识
2. 脉冲与数字电路的理念知识
3. 通过模拟、数字电路实验有一定的动手能力 4. 能熟练的编写 8951 单片机汇编程序 5. 能够熟练的运用仿真软件进行仿真
三、实验工具
1 、软件: Proteus 软件、 keil51 。
2 、硬件: PC机,串口线,并口线,单片机开发板
四、实验内容
1
2 3 4
、掌握并理解“矩阵键盘扫描”的原理及制作,了解各元器件的参数及格
元器件的作用。
、用 keil51 测试软件编写 AT89C51单片机汇编程序 、用 Proteus 软件绘制“矩阵键盘扫描”电路原理图。 、运用仿真软件对电路进行仿真。
五.实验基本步骤
1 2 3 4 5 6 7
、用 Proteus 绘制“矩阵键盘扫描”电路原理图。
、编写程序使数码管显示当前闭合按键的键值。
、利用 Proteus 软件的仿真功能对其进行仿真测试, 观察数码管的显示状态和按键开关的对应关系。
、用 keil51 软件编写程序,并生成 HEX文件。
、根据绘制“矩阵键盘扫描”电路原理图,搭建相关硬件电路。 、用通用编程器或 ISP 下载 HEX程序到 MCU。 、检查验证结果。
六、实验具体内容
使用单片机的 P1 口与矩阵式键盘连接时, 可以将 P1 口低 4 位的 4 条端口线定义为行线, P1 口高 4 位的 4 条端口线定义为列线,形成 4*4 键盘,可以配置 16 个按键,将单片机 P2口与七段数码管连接,当按下矩阵键盘任意键时,数码管显示该键所在的键号。
1、电路图
2、程序流程图
3、程序源码
ORG00H ; 起始地址 00H
K1:
K2:
OVER:
OVER1:
ROW_0:
MOV MOV ANL CJNE
CALL MOV ANL CJNE JMP
CALL MOV ANL CJNE JMP
MOV MOV ANL CJNE MOV MOV ANL CJNE MOV MOV ANL CJNE MOV MOV ANL CJNE LJMP
MOV SJMP
P1, #0F0H A, P1
A, #11110000B A, #11110000B, K1
DELAY A, P1
A, #11110000B
A, #11110000B, OVER K2
DELAY A, P1
A, #11110000B
A, #11110000B, OVER1 K2
P1, #11111110B A, P1
A, #11110000B
A, #11110000B, ROW_0 P1, #11111101B A, P1
A, #11110000B
A, #11110000B, ROW_1 P1, #11111011B A, P1
A, #11110000B
A, #11110000B, ROW_2 P1, #11110111B A, P1
A, #11110000B
A, #11110000B, ROW_3 K2
DPTR, #KCODE0 FIND
; 设置 P1.4~P1.7 为输入端口 ; 从 P1 读取所有列的值
; 屏蔽掉无用的低 4 位,非列值 ; 查询直到所有的按钮释放
; 调用 20ms延时子程序 ( 省略 )
; 从 P1 读取状态,看有没有按钮被按下; 屏蔽掉无用的低 4 位,非列值 ; 如果有按钮按下,跳到 OVER ; 循环检测
; 延时 20ms防止抖动 ; 从 P1 读取状态 ; 屏蔽掉无用的位
; 如果有按钮按下,找到行 ; 如果没有按钮按下,循环扫描
; 第 0 行输出低电平 ; 读所有的列 ; 屏蔽掉无用的位
; 如果第 0 行有按钮按下,找列 ; 第 1 行输出低电平 ; 读所有的列 ; 屏蔽掉无用的位
; 如果第 1 行有按钮按下,找列 ; 第 2 行输出低电平 ; 读所有的列 ; 屏蔽掉无用的位
; 如果第 2 行有按钮按下,找列 ; 第 3 行输出低电平 ; 读所有的列 ; 屏蔽掉无用的位
; 如果第 3 行有按钮按下,找列 ; 如果没有,则循环
; 设置 DPTR=第 0 行的起始地址 ; 找列
ROW_1:
MOV SJMP
ROW_2:
MOV SJMP
ROW_3:
MOV
FIND:
SWAP
FIND1:
RRC JNC INC SJMP
MATCH:
CLR MOVC CLR MOV LJMP
DELAY:
MOV
D1:
MOV DJNZ DJNZ
DPTR, #KCODE1 FIND
; 设置 DPTR=第 1 行的起始地址 ; 找列
DPTR, #KCODE2 FIND
; 设置 DPTR=第 2 行的起始地址 ; 找列
DPTR, #KCODE3
; 设置 DPTR=第 3 行的起始地址
A
A
MATCH DPTR FIND1
; 看看是否进位 C为 0
; 如果是 0,就跳到 MATCH找键值 ;DPTR加 1 ; 循环查找
A
A, @A+DPTR P2.7 P0, A K1
;
R1, #2
; A=0
; 用 DPTR在数据表中找到键值装入 A ; 置 P2.0 口为低,显示数字 ; 显示键值 ; 循环
延时子程序, 1ms
R2, #248 R2, $ R1, D1
RET ORG
//KCODE0: DB KCODE0: DB KCODE1: DB KCODE2: DB KCODE3: DB
; 键值保存在以下的数据表中,可根据系统实际需要进行修改
300H
80H,0C0H,
0C0H,0F9H,0A4H,0B0H 99H,92H,82H,0F8H 80H,90H,88H,83H 0C6H,0A1H,86H,8EH
END
; 数据表起始地址
0C0H,
0C0H ; 第 0 行 ; 第 1 行 ; 第 2 行
; 第 3 行
; 第0行
4、仿真实验结果
当矩阵键盘的 0 号键被按下时, P0 口的七段数码管显示的数据为
1 所以:
0. 如下图
矩阵键盘设计实验报告
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)