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

实验八 矩阵键盘应用实验

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

一、实验目的

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

二、实验主要仪器和环境

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

三、实验内容

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

<微机原理>[汇编语言]-[实验八]矩阵键盘应用实验_第1张图片

四、流程框图

<微机原理>[汇编语言]-[实验八]矩阵键盘应用实验_第2张图片

五、实验程序

KEY_VALUE   EQU     R0          ;R0 存储键值
    ORG     0000H
    AJMP    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   ,   #4
    ADD     A   ,   KEY_VALUE   ;
    MOV     KEY_VALUE   ,   A   ;第二行按键按下
LOOP2:
    MOV     C   ,   P1.6        ;
    JNC     LOOP2               ;检测按键松开
    LJMP    RETURN
HANG3:
    MOV     C   ,   P1.5        ;
    JC      HANG4
    MOV     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      RETURN
    MOV     A   ,   #12         ;
    ADD     A   ,   KEY_VALUE   ;
    MOV     KEY_VALUE   ,   A   ;第四行按键按下
LOOP4:
    MOV     C   ,   P1.4        ;
    JNC     LOOP4               ;检测按键松开
RETURN:
    RET
DELAY10MS:			;@11.0592MHz
	PUSH 30H
	PUSH 31H
	MOV 30H,#18
	MOV 31H,#230
NEXT:
	DJNZ 31H,NEXT
	DJNZ 30H,NEXT
	POP 31H
	POP 30H
	RET

TAB1:;0 - F共阴极字形码
    DB      03FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0-9
    DB      77H,7CH,39H,5EH,79H,71H;A-F
        
    END

六、程序分析

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

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

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

七、体会

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

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

八、测试报告

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

你可能感兴趣的:(微机原理单片机实验,矩阵,单片机)