实验4 矩阵键盘的使用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

*
*函数名
: main
* 函数功能
: 主函数
*输 入
:无
*输 出
:无
*******************************************************************************
调用查键值子程序
返回
图 4-2 键盘扫描子程序流程图
其中,查键值子程序可以自行编写,也可以使用下面这个查键值子程序, 这个子程序的参数如下:
入口:行列关键值码放在累加器 A 中,高 4 位是列驱动码(被扫描列的对 应位为 0,其余位均为 1),低 4 位是行状态(按下键的对应位为 0,其余位均 为 1)。
选择列驱动码使某一列为低电平而其它列为高电平,再读取行输入,若该 列有键按下则相应的位便是低电平。每个键均安排一个键值,如图 4-1 所示。
四、实验内容:
1.编写一个键盘扫描子程序(在主程序中已对接口芯片 8255 做好必要的初 始化)。这个程序对键盘作一次扫描,若无键按下,返回时累加器 A 中为 FFH, 若有键按下,返回时 A 中为该键键值,键盘扫描子程序流程图如图 4-2 所示。
DB 0EH,0AH,06H,02H
DB 0DH,09H,05H,01H
DB 0CH,08H,04H,00H 2.键盘扫描子程序自身无法运行,为了运行这个子程序,另编写以下程序:
ORG 0000H
MOV SP,#6FH MOV R0,#5 ;延时 0.5 秒
LOOP1: MOV R1,#200
LOOP2: MOV R2,#250
DISP
LCALL KEY ;调用键盘扫描子程序,设键盘扫描子程序
入口为 KEY
CJNE A,#0FFH,LOOP4 ;如果有键按下转
SJMP LOOP3
LOOP4: MOV 20H,21H
MOV 21H,22H
MOV 22H,23H MOV 23H,24H MOV 24H,25H MOV 25H,A SJMP LOOP3 其中显示子程序使用实验 3 中的显示子程序。程序运行后,每按一键便从 显示器的右端移入一个对应的数。
实验 4 矩阵键盘的使用
一、实验目的:
掌握矩阵键盘的使用及键盘扫描程序的设计方法。
二、实验设备:
ZY15MCU12BD 型综合单片机实验箱一台、具有一个 RS232 串行口并安装 Keil C51 的计算机一台。
三、实验原理及环境:
实验箱上有一个 16 键的矩阵键盘,分为 4 行×4 列。4 行分别连接到一片 8255(与 8 段 LED 显示器的段驱动和位驱动共用)的 PC0~PC3,4 列分别连接 到 8255 的 PC4~PC7。8255 的 A 口、B 口、C 口、控制口的地址分别为片外 RAM 的 4000H、4001H、4002H、4003H。
;按每列4个键计算
MOV B,#4
MUL AB
MOV R1,A POP ACC
;恢复关键值
KEY23: JNB ACC.0,KEY24 ;计算行数
RR A
INC R1
SJMP KEY23 KEY24: MOV DPTR,#KEYTAB;读取键值
MOV A,R1
MOVC A,@A+DPTR
RET
KEYTAB: DB 0FH,0BH,07H,03H
代码如下:
#include<reg51.h> //--定义使用的 IO 口--// #define GPIO_DIG P0 #define GPIO_KEY P1 //--定义全局变量--// unsigned char code DIG_CODE[17]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F 的显示码
五、实验步骤:
1.将 P0.0~P0.7 与 JD0~JD7 连接起来。开关 KC 倒向上方。 2.建立一个工程,将在预习中做好的实验内容 1 和 2 的程序以及实验 5 中 的显示子程序拷贝到一个的*.asm 文件加入。 3.编译后与单片机硬件连接,运行。 4.按下键盘上的各键,相应的数字会出现在 LED 显示器上。
DJNZ R2,$
DJNZ R1,LOOP2
DJNZ R0,LOOP1 MOV DPTR,#4003H ;8255 初始化
MOV A,#10000001B ; A口、B口方式0输出,C口高4位输出,
低4位输入
MOVX @DPTR,A LOOP3: LCALL DISP ;调用显示子程序 DIS,设显示子程序入口为
出口:键码放在 A 中带出。 占用:R1、A、PSW、DPTR。 程序清单如下:
;查键值子程序,起始地址为KEY20
KEY20: PUSH ACC
;暂存关键值
MOV R1,#00H ;查键值自变量清0
KEY21: JNB ACC.4,KEY22 ;计算列数
RR A
INC R1
SΒιβλιοθήκη BaiduMP KEY21
KEY22: MOV A,R1
第 4 列(PC7) 第 3 列(PC6) 第 2 列(PC5)
行 PC3
00H
01H
02H
输 PC2
04H
05H
06H
入 PC1
08H
09H
0AH
PC0
0CH
0DH
0EH
第1列 (PC
03H 4)
07H
0BH
0FH
第4行 第3行 第2行 第1行
00H
01H
02H
03H
列驱动
图 4-1 键盘布置及键值
开始
N 有无键按下?
有无键按下?
Y ? R2置列驱动码初值 (第1列低电平,其他列高)
输出列驱动码 输入行状态
Y 有无键按下?
有无键按下?
N ?
暂存行状态 软件延时 20mS
列驱动码指向下一列 (列驱动码左移)
N 列驱动码超出? Y
A←#0FFH
返回
再读行状态 N
二次相同? Y
读行状态 直到键松开
unsigned char KeyValue; //用来存放读取到的键值
//--声明全局函数--//
void Delay10ms(unsigned int c); //延时 10ms
void KeyDown();
//检测按键函数
/******************************************************************************
相关文档
最新文档