键盘扫描显示实验原理及分析报告
学 院 计算机工程学院 专 业 计算机科学与技术 年级班别 09计算机科学与技术1班 学 号 ************* 学生姓名 李 指导教师 李 永
2012年01月
目录
一、内容提要 二、实验目的 三、实验要求 四、实验器材 五、实验电路 六、实验说明 七、实验框图 八、实验程序 九、实验分析 十、实验心得 十一、参考文献
一、内容提要
单片机技术日趋成熟的今天,其灵活的硬件电路的设计和软件的设计,让单片机得到了广泛的应用,几乎是从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。单片机在人们的生活中得到广泛的应用。
本文介绍了基于单片机的键盘扫描显示实验,详细讨论了它从软件上实现的过程,以及硬件接口的原理及其实现 ,根据输出的列码和读取的行码来判断按下的是什在么键,即有按键时向列扫描码地址(0e101H)逐列输出低电平,然后从行码地址(0e103H)读回,理解读取键盘按键的原理,和最简单的单片机接口原理
二、实验目的:
1、掌握键盘和显示器的接口方法和编程方法。 2、掌握键盘扫描和LED八段数码管显示器的工作原理。
二、实验要求:
在上一个实验的基础上,利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。
实验程序可分成三个模块:
1、键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。 2、显示模块:将显示单元的内容在显示器上动态显示。 3、主程序:调用键输入模块和显示模块。
三、实验器材:
1、超想-3000TC综合实验仪 1 台 2、KEIL仿真器 1 台 3、计算机 1 台
四、实验电路:
这里只是键盘草图,详细原理参见“8155键显模块”。
行码
列码
(0e103H)
(0e101H)
五、实验说明:
本实验仪提供了一个6×4的小键盘,向列扫描码地址(0e101H)逐列输出低电平,然后从行码地址(0e103H)读回,如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高.这样就可以通过输出的列码和读取的行码来判断按下的是什么键。在判断有键按下后,要有一定的延时,防止键盘抖动。列扫描码还可以分时用作LED的位选通信号。
六、实验框图:
LED显示
否 有键输入? 是 读取键值 键值转换为显示数据 显示缓冲区初始化
主程序框图 初始化地址参数 列扫描信号移位 读入行信号 是 该列有键输入? 按照行列计算键值 否 查表得键码 6列扫描完? 等待键盘释放 开始 输出列扫描信号 否 待按键释放 返回 读键输入子程序框图 七、实验程序如下:
ST MOV 11H,R7 键盘扫描实验
OUTBIT equ 0e101h ; 位控制口
CLK164 equ 0e102h ; 段控制口(接164时钟位) DAT164 equ 0e102h ; 段控制口(接164数据位)
IN equ 0e103h ; 键盘读入口 ORG 0000H
LJMP STAR
;==========================================================================
KEY1: MOV 13H,#06H MOV 12H,#20H KEY2: MOV A,12H CPL A MOV R7,A MOV DPTR,#0E101H MOV A,R7 MOVX @DPTR,A MOV A,12H CLR C RRC A MOV 12H,A MOV DPTR,#0E103H MOVX A,@DPTR MOV R7,A MOV A,R7 CPL A MOV R7,A MOV A,R7 ANL A,#0FH MOV 14H,A DEC 13H MOV R7,13H MOV A,R7 JZ KEYDIS MOV A,14H JZ KEY2 KEYDIS: MOV A,14H JZ TESTKEY5 MOV A,13H ADD A,ACC ADD A,ACC MOV 13H,A MOV A,14H JNB ACC.1,TESTKEY INC 13H SJMP TESTKEY2
;;================================================= ;键盘扫描
TESTKEY: MOV A,14H JNB ACC.2,TESTKEY1 INC 13H INC 13H SJMP TESTKEY2 TESTKEY1: MOV A,14H JNB ACC.3,TESTKEY2 MOV A,#03H ADD A,13H MOV 13H,A TESTKEY2: MOV DPTR,#0E101H CLR A MOVX @DPTR,A TE KEY3: MOV R7,#0AH LCALL MLOOP LCALL MLOOP4 MOV A,R7 JNZ TESTKEY3 MOV R7,13H MOV A,R7 MOV DPTR,#0134H MOVC A,@A+DPTR MOV R7,A RET
;==========================================================================
TESTKEY4: DB 22H ;\"
;==========================================================================
TESTKEY5: MOV R7,#0FFH RET
;==========================================================================
GETKEY: MOV 10H,#20H MOV 0EH,#00H GETKEY1: MOV A,0EH CLR C SUBB A,#06H JNC GOON2 MOV DPTR,#0E101H CLR A MOVX @DPTR,A MOV R7,0EH MOV A,#08H
ADD A,R7 MOV R0,A MOV A,@R0 MOV R7,A MOV 0FH,#00H
GETKEY2: MOV A,0FH CLR C SUBB A,#08H JNC GOON1 MOV A,11H JNB ACC.7,KLOOP MOV DPTR,#0E102H MOV A,#01H MOVX @DPTR,A SJMP KLOOP1
;;========================================== KLOOP: MOV DPTR,#0E102H CLR A MOVX @DPTR,A KLOOP1: MOV DPTR,#0E102H MOVX A,@DPTR MOV R7,A MOV A,R7 ORL A,#02H MOV R7,A MOV A,R7 MOVX @DPTR,A MOV DPTR,#0E102H MOVX A,@DPTR MOV R7,A MOV A,R7 ANL A,#0FDH MOV R7,A MOV A,R7 MOVX @DPTR,A MOV A,11H ADD A,ACC MOV 11H,A INC 0FH SJMP GETKEY2 GOON1: MOV DPTR,#0E101H MOV A,10H MOVX @DPTR,A MOV R7,#01H
LCALL MLOOP MOV A,10H CLR C RRC A MOV 10H,A INC 0EH SJMP GETKEY1 GOON2: RET
;==========================================================================
WAIT: MOV DPTR,#0E100H MOV A,#03H MOVX @DPTR,A MOV 08H,#0FFH MOV 09H,#0FFH MOV 0AH,#0FFH MOV 0BH,#0FFH MOV 0CH,#00H MOV 0DH,#00H WAIT1: LCALL GETKEY LCALL MLOOP4 MOV A,R7 JZ WAIT1 LCALL KEY1 MOV R6,#00H MOV R6,#00H MOV A,R7 ANL A,#0FH MOV R7,A MOV A,#24H ADD A,R7 MOV DPL,A MOV A,#01H ADDC A,R6 MOV DPH,A CLR A MOVC A,@A+DPTR MOV R7,A MOV 0DH,R7 SJMP WAIT1 RET
;========================================================================== TAB:
Q0124: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H ;?.[Ofm}. Q012C: DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H ;•ow|9^yq Q0134: DB 00H, 01H, 04H, 07H, 0FH, 02H, 05H, 08H ;........ Q013C: DB 0EH, 03H, 06H, 09H, 0DH, 0CH, 0BH, 0AH ;........ Q0144: DB 10H, 11H, 12H, 13H, 14H, 15H, 16H ;.......
;==========================================================================
MLOOP: MOV 15H,R7 MLOOP1: MOV R7,15H DEC 15H MOV A,R7 JZ MLOOP3 MOV 16H,#64H MLOOP2: MOV A,16H JZ MLOOP1 DEC 16H SJMP MLOOP2 SJMP MLOOP1 MLOOP3: RET
;==========================================================================
MLOOP4: MOV DPTR,#0E101H CLR A MOVX @DPTR,A MOV DPTR,#0E103H MOVX A,@DPTR MOV R7,A MOV A,R7 CPL A MOV R7,A MOV A,R7 ANL A,#0FH MOV R7,A RET
;==========================================================================
STAR: MOV R0,#7FH CLR A STAR1: MOV @R0,A DJNZ R0,STAR1 MOV SP,#16H LJMP WAIT END
;===============================================================
===
八.实验分析:
一:主程序分析
主程序执行步:
1:显示缓冲区初始化
2:LED显示
3:判断是否有键输入。 4:如果有键盘输入读取键值
: 5:键值转换为显示数据
二:子程序分析:
子程序执行步骤:
1:初始化地址参数 2:输出列扫描信号列 3:扫描信号移位 4:读入行信号
5:该列有键输入若是则执行6,7,8,若不是则执行9,2,3,4. 6按照行列计算键值 7查表得键码 9 :6列扫描完?
10:子程序主要代码分析如下:
键盘扫描子程序分析:
程序段TESTKEY分析:
本段程序主要作用是初始化地址参数,将14H放入运算器A中,判断A的值是否不小于ACC.2的值如果是则跳转到TESTKEY1 如果不是则A的值加13H再加13H, 程序无条件跳转到TESTKEY2
TESTKEY: MOV A,14H JNB ACC.2,TESTKEY1 INC 13H INC 13H SJMP TESTKEY2
程序段TESTKEY1分析:
将14H的值放入运算器A中判断A的值是否不小于ACC.3的值如果是则跳转到TESTKEY2 如果不是则将A的值加立即数03再放入运算器A中,再将地址13H的值加上运算器A中的值放入A中。再将A中的值放入13H中。
TESTKEY1: MOV A,14H JNB ACC.3,TESTKEY2 MOV A,#03H ADD A,13H MOV 13H,A
程序段TESTKEY2分析:
本程序段主要功能是:输出列扫描信号列扫描信号移位具体分析如下:地址指针DPTR指向立即数#0E101H的地址,将运算器A内存放的值的所有位都向左移动1位,将运算器A的值放入地址0E101H 中
TESTKEY2: MOV DPTR,#0E101H CLR A MOVX @DPTR,A
程序段TESTKEY3分析:
将立即数#OA放入R7中,程序长跳转到MLOOP,长跳转到MLOOP4将R7中存放的内容放入运算器A中,如果A中的值不等于0则程序跳转到TESTKEY3 将13H的值放入R7中,将13H的值放入R7中将R7中的值放入运算器A中,将立即数0134H放入DPTR所指的地址空间,将运算器A的值加上DPTR所指地址的值相加取地址再放入运算器A中,将A 中的值放入R7中,子程序结束。
TESTKEY3: MOV R7,#0AH LCALL MLOOP LCALL MLOOP4 MOV A,R7 JNZ TESTKEY3 MOV R7,13H MOV A,R7 MOV DPTR,#0134H MOVC A,@A+DPTR MOV R7,A RET TESTKEY4: DB 22H ;\"
;==========================================================================
TESTKEY5: MOV R7,#0FFH RET
;==========================================================================
本程序段主要作用时读取键盘的值。 程序段GETKEY分析:
将立即数20H放入地址为10H的存储空间内,将立即数00H放如地址为0EH的存储空间内。
GETKEY: MOV 10H,#20H MOV 0EH,#00H 程序段 GETKEY1分析:
将地址段0EH的值放入运算器A中,将C中存储的二进
制数每位都向左移动一位,将运算器A的值减立即数06H放入运算器A中,将立即数0E101H放入指针DOTR所指的地址空间,将地址0EH的值放入R7中,将立即数08H放如运算器A 中,将R7内容放入运算器A中,将A中的内容放入R0中,A简介寻址R0将A的值放入R7中将立即数00H放入地址OFH中。
GETKEY1: MOV A,0EH CLR C SUBB A,#06H JNC GOON2 MOV DPTR,#0E101H CLR A MOVX @DPTR,A MOV R7,0EH MOV A,#08H ADD A,R7 MOV R0,A MOV A,@R0 MOV R7,A MOV 11H,R7 MOV 0FH,#00H
程序段 GETKEY2分析:
将地址值为0FH的内容放入运算器A中,将C中的二进制数每位都向左移动一位,将A中的二进制数加上立即数08H,将地址为11H内的值放入运算器A中,判断A中的值是否不小于ACC.7如果是不下于条转到标号KLOOP如果不是则将立即数0E102放入指针DPTR所指的地址空间,将立即数01H加上运算器A中的内容,将相加的结果放运算器A中。再将运算器A中的值放入指针所指的地址空间内。
GETKEY2: MOV A,0FH CLR C SUBB A,#08H JNC GOON1
MOV A,11H JNB ACC.7,KLOOP MOV DPTR,#0E102H
MOV A,#01H MOVX @DPTR,A SJMP KLOOP1
;;==========================================
KLOOP: MOV DPTR,#0E102H CLR A MOVX @DPTR,A KLOOP1: MOV DPTR,#0E102H MOVX A,@DPTR MOV R7,A MOV A,R7 ORL A,#02H MOV R7,A MOV A,R7 MOVX @DPTR,A MOV DPTR,#0E102H MOVX A,@DPTR MOV R7,A MOV A,R7
实验心得
在电子技术应用领域中,单片机的应用愈来愈多地应用到各行各业。如:工业控制、仪器仪表、电讯技术、办公自动化和计算机外部设备、汽车与节能、商用产品、家用电器等。目前,单片机正朝着大容量片上存储器、多功能i/o接口、宽范围工作电源和低功耗方向发展。要开发单片机的应用,不但要掌握单片机硬件和软件方面的知识,而且还要深入了解各应用系统的专业知识,只有将这两方面的知识融会贯通和有机结合,才能设计出优良的应用系统。一个好的工程设计师不仅要掌握单片机的工作原理,而且还要不断了解各公司最新芯片的结
构和应用,在实际应用中找到最好的性能价格比。所以还要注意培养自己接受新知识的自学能力,掌握芯片发展动态。
参考文献
1. 胡建.单片机原理及接口技术 2. 宋浩等.单片机原理及应用
3. 王建校等.MCS-51系列单片机及C51程序设计 4. 谢宜仁.单片机实用技术问答 5. 周航慈.单片机应用程序设计技术
因篇幅问题不能全部显示,请点此查看更多更全内容