实验四 4x4键盘输入
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告四
实验名称:4*4键盘输入
1、实验内容
键盘扫描,求键值,并在LED上显示该键值。
2、实验目的
(1) 掌握键盘和显示器的接口方法和编程方法。
(2) 掌握键盘扫描和LED八段码显示器的工作原理。
3、实验要求
在上一个实验的基础上,利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。
实验程序可分为三个模块。
1)键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。
2)显示模块:将显示单元的内容在显示器上动态显示。
3)主程序:调用键输入模块和显示模块。
4、实验器材
(1) 计算机1台
5、实验电路
这里只是键盘草图,列为输出,行为输入。
图中电阻为上拉电阻。
(0e103H)
图6 8155键盘电路原理图
表2 键值表
6、实验说明
本实验仪提供了一个6×4的小键盘,向列扫描码地址(0e101H)逐列输出低电平,然后从行码地址(0e103H)读回。
如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。
这样就可以通过输出的列码和读取的行码来判断按下的是什么键。
在判断有键按下后,要有一定的时延,进行第二读键盘,防止键盘抖动。
7、实验流程图
注:LED显示程序框图见上个实验。
图7 键盘扫描主程序流程图图8 读键输入子程序流程图
8、实验程序清单
;****变量定义文件,文件名:para.lib****
OUTBIT equ 0e101h ; 位控制口
CLK164 equ OUTBIT+1 ; 段控制口(接164时钟位)
DAT164 equ OUTBIT+1 ; 段控制口(接164数据位)
IN equ OUTBIT+2 ; 键盘读入口
LEDBuf equ 60h ; 显示缓冲
; ***变量定义文件结束***
;*****************************************************
;****显示部分做成单独的文件,文件名为:dis.lib,在键盘扫描部分调用**** LEDMAP: ; 八段管显示码
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
db 00H
;******* 延时子程序**************
Delay: ; 延时子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
ret
;*********LED显示***************
DisplayLED:
mov r0, #LEDBuf
mov r1, #6 ; 共6个八段管
mov r2, #00100000b ; 从左边开始显示
Loop: mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 关所有八段管
mov a, @r0
mov B, #8 ; 送164
DLP: rlc a
mov r3, a
mov acc.0, c
mov dptr, #DAT164
anl a,#0fdh ;PB1=0,即时钟低电平
movx @dptr, a
mov dptr, #CLK164
orl a,#02h ;PB1=1,即产生时钟高电平
movx @dptr, a
anl a,#0fdh ;PB1=0,时钟低电平
movx @dptr, a
mov a, r3
djnz B, DLP
mov dptr, #OUTBIT
mov a, r2
movx @dptr, a ; 显示一位八段管
mov r6, #1
call Delay
mov a, r2 ; 显示下一位
rr a
mov r2, a
inc r0
djnz r1, Loop
ret
;******八段管显示码程序文件dis.lib结束****
;***************************************************** ;******键盘扫描程序文件,文件名:key.lib***** TestKey:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 输出线置为0
mov dptr, #IN
movx a, @dptr ; 读入键状态
cpl a
anl a, #0fh ; 高四位不用
ret
;*******键值表**************
KeyTable: ; 键码定义
db 00h, 01h, 04h, 07h
db 0fh, 02h, 05h, 08h
db 0eh, 03h, 06h, 09h
db 0dh, 0ch, 0bh, 0ah
db 10H,11H,12H,13H
db 14H,15H,16H,17H
;********************************
GetKey:
mov dptr, #OUTBIT
mov P2, dph
mov r0, #Low(IN)
mov r1, #00100000b ;列扫描初值
mov r2, #6 ;扫描6列
Kloop:
mov a, r1 ; 找出键所在列
cpl a
movx @dptr, a
cpl a
rr a
mov r1, a ; 下一列
movx a, @r0 ;读行值
cpl a
anl a, #0fh
jnz Goon1 ; 该列有键入
djnz r2,Kloop
mov r2,#0ffh ; 没有键按下, 返回 0ffh
sjmp Exit
Goon1:
mov r1,a ; R1中为行值,键序号 = (列-1)* 4 + 行
mov a,r2 ;R2中为列值
dec a
rl a
rl a
mov r2,a ; r2 = (r2-1)*4
mov a,r1 ; r1中为读入的行值
mov r1,#4 ;共有4行
LoopC:
rrc a ; 移位找出所在行
jc Exit
inc r2 ; r2 = r2+ 行值
djnz r1,LoopC
Exit: mov a,r2 ; 查表取出键值码
mov dptr,#KeyTable
movc a, @a+dptr
mov r2,a
WaitRelease:
mov dptr,#OUTBIT ; 等键释放
clr a
movx @dptr,a
mov r6,#10
call Delay
call TestKey
jnz WaitRelease
mov a,r2
ret
;****键盘程序文件key.lib结束****
;************************
;*******以下为另一文件:主程序***********
$include (para.lib)
ORG 0
Ljmp Start
Start:
mov sp, #40h
mov dptr,#0e100h
mov a,#03h
movx @dptr,a
mov LEDBuf,#0ffh ; 显示 8.8.8.8.
mov LEDBuf+1,#0ffh
mov LEDBuf+2,#0ffh
mov LEDBuf+3,#0ffh
mov LEDBuf+4,#0
mov LEDBuf+5,#0
Mloop:
call DisplayLED ; 显示
call TestKey ; 有键入?
Jz Mloop ; 无键入, 继续显示
call GetKey ; 读入键码
mov r2,a
anl a, #0fh ; 显示键码低位
mov dptr, #LEDMap
movc a, @a+dptr
mov LEDBuf+5,a
mov a,r2
swap a
anl a, #0fh ; 显示键码高位
mov dptr, #LEDMap
movc a, @a+dptr
mov LEDBuf+4, a
ljmp Mloop
$include (dis.lib)
$include (key.lib)
END
9、实验步骤
1) 编写程序。
2)机器汇编。
3)调试程序并全速执行程序,用手按键盘‘1’、‘2’……、‘F’,观察LED显示结果。