实验七实验七 键盘与显示键盘与显示1、实验内容、实验内容键盘扫描,求键值,并在 LED 上显示该键值2、实验目的、实验目的(1) 掌握键盘和显示器的接口方法和编程方法2) 掌握键盘扫描和 LED 八段码显示器的工作原理3、实验要求、实验要求在上一个实验的基础上,利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来实验程序可分为三个模块1)键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元2)显示模块:将显示单元的内容在显示器上动态显示3)主程序:调用键输入模块和显示模块4、实验器材、实验器材(1) 超想-3000TB 综合实验仪 1 台 (2) 超想 3000 仿真器 1 台(3) 计算机 1 台5、实验电路、实验电路这里只是键盘草图,详细原理参见“8155 键显模块” 列为输出,行为输入图中电阻为上拉电阻46行码 (0e103H)列码 (0e101H)VCC图 6 8155 键盘电路原理图表 2 键值表0708090a13复位0405060b12160102030c1115000f0e0d10146、实验说明、实验说明本实验仪提供了一个 6×4 的小键盘,向列扫描码地址(0e101H)逐列输出低电平,然后从行码地址(0e103H)读回。
如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高这样就可以通过输出的列码和读取的行码来判断按下的是什么键在判断有键按下后,要有一定的时延,进行第二读键盘,防止键盘抖动7、实验流程图、实验流程图 注:LED 显示程序框图见上个实验显示缓冲区初始化LED显示读取键值键值转换为显示数据是否 有键输入?开始初始化地址参数输出列扫描信号列扫描信号移位读入行信号6列扫描完?是否该列有键输入?返回是否按照行列计算键值查表得键码等待键盘释放图 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, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hdb 00H;******* 延时子程序**************Delay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopret;*********LED显示***************DisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop: mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov B, #8 ; 送164DLP: rlc amov r3, amov acc.0, cmov dptr, #DAT164anl a,#0fdh;PB1=0,即时钟低电平movx @dptr, amov dptr, #CLK164orl a,#02h;PB1=1,即产生时钟高电平movx @dptr, aanl a,#0fdh;PB1=0,时钟低电平movx @dptr, amov a, r3djnz B, DLPmov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopret;******八段管显示码程序文件dis.lib结束****;*****************************************************;******键盘扫描程序文件,文件名:key.lib*****TestKey:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 输出线置为0mov dptr, #INmovx a, @dptr ; 读入键状态cpl aanl a, #0fh ; 高四位不用ret;*******键值表**************KeyTable: ; 键码定义db 00h, 01h, 04h, 07hdb 0fh, 02h, 05h, 08hdb 0eh, 03h, 06h, 09hdb 0dh, 0ch, 0bh, 0ahdb 10H,11H,12H,13Hdb 14H,15H,16H,17H;********************************GetKey:mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000b;列扫描初值mov r2, #6;扫描6列Kloop:mov a, r1 ; 找出键所在列cpl amovx @dptr, acpl arr amov r1, a ; 下一列movx a, @r0;读行值cpl aanl a, #0fhjnz Goon1 ; 该列有键入djnz r2,Kloopmov r2,#0ffh ; 没有键按下, 返回 0ffhsjmp ExitGoon1:mov r1,a ; R1中为行值,键序号 = (列-1)* 4 + 行mov a,r2;R2中为列值dec arl arl amov r2,a ; r2 = (r2-1)*4mov a,r1 ; r1中为读入的行值mov r1,#4;共有4行LoopC:rrc a ; 移位找出所在行jc Exitinc r2 ; r2 = r2+ 行值djnz r1,LoopCExit: mov a,r2 ; 查表取出键值码mov dptr,#KeyTablemovc a, @a+dptrmov r2,aWaitRelease:mov dptr,#OUTBIT ; 等键释放clr amovx @dptr,amov r6,#10call Delaycall TestKeyjnz WaitReleasemov a,r2ret;****键盘程序文件key.lib结束****;************************;*******以下为另一文件:主程序***********$include (para.lib)ORG 0Ljmp StartStart:mov sp, #40hmov dptr,#0e100hmov a,#03hmovx @dptr,amov LEDBuf,#0ffh ; 显示 8.8.8.8.mov LEDBuf+1,#0ffhmov LEDBuf+2,#0ffhmov LEDBuf+3,#0ffhmov LEDBuf+4,#0mov LEDBuf+5,#0Mloop:call DisplayLED ; 显示call TestKey ; 有键入?Jz Mloop ; 无键入, 继续显示call GetKey ; 读入键码mov r2,aanl a, #0fh ; 显示键码低位mov dptr, #LEDMapmovc a, @a+dptrmov LEDBuf+5,amov a,r2swap aanl a, #0fh ; 显示键码高位mov dptr, #LEDMapmovc a, @a+dptrmov LEDBuf+4, aljmp Mloop$include (dis.lib)$include (key.lib)END9、实验步骤、实验步骤1) 编写程序。
2)机器汇编3)联机将机器码输入单片机实验装置4)调试程序并全速执行程序,用手按键盘‘1’ 、 ‘2’……、 ‘F’ ,观察 LED 显示结果5)程序调试通过后,将 LED 显示部分该为单独的文件,在主程序中用“$include (文件名)”的伪指令调用,重新做上述实验,所得结果应是一样的10、填写实验报告、填写实验报告。