实验三 键盘扫描控制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三4*4键盘扫描显示控制
一、实验目的
实现一4×4键盘的接口,并在两个数码管上显示键盘所在的行与列。即将8255单元与键盘及数码管显示单元连接,编写实验程序扫描键盘输入,并将扫描结果送数码显示,键盘采用4×4键盘,每个数码管值可以为0到F,16个数。将键盘进行编号记作0—F当按下其中一个按键时将该按键对应的编号在一个数码管上显示出来,当按下下一个按键时便将这个按键的编号在下一个数码管上显示出来,且数码管上可以显示最近6次按下按键的编号。
二、实验要求
1、接口电路设计:根据所选题目和所用的接口电路芯片设计出完整的接口电路,并进行电路连接和调试。
2、程序设计:要求画出程序框图,设计出全部程序并给出程序设计说明。
三、实验电路
四、实验原理说明
图2 数码管引脚图
图1为AT89C51引脚图,说明如下:
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口同时为闪烁编程和编程校验接收一些控制信号。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址
的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
图2为数码管引脚图,功能说明如下:
显示字形g f e d c b a 段码
0 0 1 1 1 1 1 1 3fh
1 0 0 0 0 1 1 0 06h
2 1 0 1 1 0 1 1 5bh
3 1 0 0 1 1 1 1 4fh
4 1 1 0 0 1 1 0 66h
5 1 1 0 1 1 0 1 6dh
6 1 1 1 1 1 0 1 7dh
7 0 0 0 0 1 1 1 07h
8 1 1 1 1 1 1 1 7fh
9 1 1 0 1 1 1 1 6fh
A 1 1 1 0 1 1 1 77h
b 1 1 1 1 1 0 0 7ch
C 0 1 1 1 0 0 1 39h
d 1 0 1 1 1 1 0 5eh
E 1 1 1 1 0 0 1 79h
F 1 1 1 0 0 0 1 71h
五、实验流程图
六、程序清单
OUTBIG EQU 8002H ; 位控制口
OUTSEG EQU 8004H ; 段控制口 KEYIN EQU 8001H ; 键盘读入口
READY: MOV 20H,#3FH ;缓冲器设初值,赋值到6个数码管 MOV 21H,#3FH MOV 22H,#3FH
否
是 是
否
开始 显示缓冲区初始化
LED 显示
读取键值
键值转换为显示数据
开始
输出列扫描信号
列扫描信号移位
该列有键输入?
读入行信号
返回
6列扫描完?
有键输入?
初始化地址参数
按照行列计算键值
查表得键码
等待按键释放
返回
MOV 24H,#3FH
MOV 25H,#3FH
MAIN: LCALL DISPLAY ;无键码输入,调用显示模块
LCALL TEST
JZ MAIN ;累加器为0即说明无按键,则转移继续显示 LCALL SEARCH ;有键值输入,寻找输入键值所在的行和列
MOV 20H,21H ;数码管显示出输入的键值
MOV 21H,22H
MOV 22H,23H
MOV 23H,204
MOV 24H,25H
MOV DPTR,#LEDTAB
MOVC A,@A+DPTR
MOV 25H,A
SJMP MAIN
DISPLAY: ;显示模块
MOV R0,#20H ;缓冲区从20H处开始
MOV R1, #6 ;共 6个八段管
MOV R2, #00100000B ;从左边开始显示灯亮为1,灭为0,
LOOP: MOV DPTR, #OUTBIG
MOV A, #0
MOVX @DPTR, A ; 位选码初值设为0,即关闭所有八段管
MOV A, @R0 ;将以20H为首地址的内存值发送到段码输出口8004H MOV DPTR, #OUTSEG
MOVX @DPTR,A
MOV DPTR, #OUTBIG ;输出位选通信号,使每次只显示一位八段管
MOV A, R2
MOVX @DPTR, A
LCALL DELAY ;延时
MOV A, R2
RR A ;位选信号右移一位,即动态显示下一个数码管 MOV R2, A
INC R0 ;内存地址加一,提供段码输出
DJNZ R1, LOOP
RET
DELAY: MOV R7,#01H ; 延时子程序
DEL1: MOV R6,#00H
DEL2: DJNZ R6, DEL2
DJNZ R7, DEL1
RET
TEST: MOV DPTR,#OUTBIG ;检测有无键值输入
MOV A,#00H
MOVX @DPTR,A ;输出线置为0