<微机原理>[汇编语言]-[实验八]矩阵键盘应用实验

实验八 矩阵键盘应用实验

实验八 矩阵键盘应用实验.doc

一、实验目的

  1. 掌握矩阵式键盘识别技术
  2. 进一步掌握数码管显示原理

二、实验主要仪器和环境

  1. Keil5
  2. 普中A2开发板
  3. stc-isp

三、实验内容

用单片机的并行口P1接矩阵键盘,在数码管上显示每个按键的“0—F”序号。对应的按键的序号排列如图所示:

在这里插入图片描述

四、流程框图

在这里插入图片描述

五、实验程序

KEY_VALUE   EQU     R0          ;R0 存储键值ORG     0000HAJMP    INIT
INIT:                           ;系统初始化MOV     DPTR,   #TAB1       ;指向字形码表首地址
LOOP:                           ;循环ACALL   KEYSCAN             ;ACALL   DTSEG               ;AJMP    LOOP                ;
DTSEG:                          ;数码管显示MOV     A   ,   KEY_VALUE   ;MOVC    A   ,   @A+DPTR     ;MOV     P0  ,   A           ;RET
KEYSCAN:                        ;矩阵按键扫描MOV     P1  ,   #0FH        ;进行列检测MOV     A   ,   P1          ;读取P1的值CJNE    A   ,   #0FH    ,XD     ;判断按键是否按下RET
XD: ACALL   DELAY10MS           ;延时10ms进行消抖MOV     A   ,   P1          ;再次读取按键的值CJNE    A   ,   #0FH    ,CSLIE ;再次检测键盘是否按下RET
CSLIE:                          ;测试列MOV     P1  ,   #0FH        ;MOV     A   ,   P1          ;
LIE1:                           ;第一列MOV     C   ,   P1.3        ;JC      LIE2                ;MOV     KEY_VALUE   ,   #0  ;第一列按键按下LJMP    CEHANG              ;跳转到测试行
LIE2:MOV     C   ,   P1.2        ;JC      LIE3                ;MOV     KEY_VALUE   ,   #1  ;第二列按键按下LJMP    CEHANG              ;
LIE3:MOV     C   ,   P1.1        ;JC      LIE4                ;MOV     KEY_VALUE   ,   #2  ;第三列按键按下LJMP    CEHANG              ;
LIE4:MOV     C   ,   P1.0        ;JC      CEHANG              ;MOV     KEY_VALUE   ,   #3  ;第四列按键按下LJMP    CEHANG              ;
CEHANG:                         ;测试行MOV     P1  ,   #0F0H       ;MOV     A   ,   P1          ;
HANG1:MOV     C   ,   P1.7        ;第一行JC      HANG2      MOV     A   ,   #0          ;ADD     A   ,   KEY_VALUE   ;第一行按键按下MOV     KEY_VALUE   ,   A   ;
LOOP1: MOV     C   ,   P1.7        ;JNC     LOOP1               ;检测按键松开LJMP    RETURN  
HANG2:MOV     C   ,   P1.6        ;JC      HANG3               ;MOV     A   ,   #4ADD     A   ,   KEY_VALUE   ;MOV     KEY_VALUE   ,   A   ;第二行按键按下
LOOP2:MOV     C   ,   P1.6        ;JNC     LOOP2               ;检测按键松开LJMP    RETURN
HANG3:MOV     C   ,   P1.5        ;JC      HANG4MOV     A   ,   #8 ADD     A   ,   KEY_VALUE   ;MOV     KEY_VALUE   ,   A   ;第三行按键按下
LOOP3:MOV     C   ,   P1.5        ;JNC     LOOP3               ;检测按键松开LJMP    RETURN
HANG4:MOV     C   ,   P1.4        ;JC      RETURNMOV     A   ,   #12         ;ADD     A   ,   KEY_VALUE   ;MOV     KEY_VALUE   ,   A   ;第四行按键按下
LOOP4:MOV     C   ,   P1.4        ;JNC     LOOP4               ;检测按键松开
RETURN:RET
DELAY10MS:			;@11.0592MHzPUSH 30HPUSH 31HMOV 30H,#18MOV 31H,#230
NEXT:DJNZ 31H,NEXTDJNZ 30H,NEXTPOP 31HPOP 30HRETTAB1:;0 - F共阴极字形码DB      03FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0-9DB      77H,7CH,39H,5EH,79H,71H;A-FEND

六、程序分析

使用EQU伪指令重新命名R0为KEY_VALUE方便代码后续的理解。

本文使用行列扫描的方法进行矩阵按键的扫描。需要注意的是,在行扫描结束后,会有一个LOOP循环,该段程序的作用是检测按键是否松开,只有按键松开才算作一次按下。

其他部分都较为简单,不多做解释。

七、体会

遇到的问题:矩阵按下时,蜂鸣器会异响,观察原理图可知是因为控制蜂鸣器的是P1.5端口与矩阵按键扫描时有冲突。

解决的办法:只需要添加一个检测按键松开的LOOP循环即可解决,这样就不会反复扫描,反复拉高拉低P1.5导致蜂鸣器发出异响

八、测试报告

数码管显示对应按下的矩阵按键的键值

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部