汇编语言与接口技术——矩阵按键

一、 实验要求

实验目的:

(1)掌握数码.管显示方法

(2)掌握.软件延时方法

(3)掌握键盘扫描及.去抖动方法

实验内容:

(1)利用单片机.开发板的矩阵键盘实现个人学号后 8 位的输入和显示。

(2)利用.矩阵键盘S1~S10 输入数字 1~0。

(3)利用数码管 LED8~LED1 从左到.右显示8位学号

二、 实验设计

1.整体思路

通过按键扫描,判断按.下的按键所在行和列,然后根据按下的行和列来控制LED点阵的亮灭。首先进行初始化,将各个寄存器和IO口设置初始状态,并将A寄存器初始化为0AH。然后进入主循环,依次.扫描各个按键,如果检测到按键按下,则根据按下的行.和列来点亮对应的LED。如果按键释放,则熄灭对应的LED。同时,程序还加入了去抖动和延时等功能,以提高程序的可靠.性和稳定性。

2.流程图

汇编语言与接口技术——矩阵按键_第1张图片

图 1 算法设计流程图

  1. 主要模块设计思路及分析

初始化模块:将各个寄存器和IO口设置初始状态,并将A寄存器初始化为0AH。

LED控制模块:根据按键扫.描的结果来控制LED点阵的亮灭。每次按键按下后,程序会根据按下的行和列来点亮对应的LED。

按键扫描模块:程序会先清空所有的按键标志位,然后依次将各个按键电平设置为低电平,检测是否有按键.按下。如果有按键按下,那么程序会根据按下的按键所在行和列来点亮对应的LED。

去抖动模块:在检测.按键按下时,程序会加入去抖动功能,以避免由于按键的机械性振动而产生的误判。

延时模块:在点亮LED时,程序会加入延时功.能,以避免由于LED的响应速度过快而产生的闪烁现象。

主循环模块:程序会不断循环执行.按键扫描和LED控制模块,以实现实时控制LED点阵的亮灭。

三、 实现效果

汇编语言与接口技术——矩阵按键_第2张图片

图 2 学号显示效果图

 汇编语言与接口技术——矩阵按键_第3张图片

图 3删除前效果图

汇编语言与接口技术——矩阵按键_第4张图片

图 4 删除后效果图

  • 总结

总结来说,该段代码实现了通过按键扫描来控制LED点阵的亮灭的功能。在具体实现上,程序采用了循环结构,依次扫描各个按键,根据按下的行和列来点亮对应的LED。同时,为了提高程序的可靠性和稳定性,程序还加入了去抖动和延时等功能。以提高程序的可靠性和稳定性。在具体实现上,程序采用了循环结构,依次扫描各个按键,根据按下的行和列来点亮对应的LED。

附录:

       ORG 0000H

MOV A, #0AH

MO.V R0,A         ;LED0

MOV R1,A         ;LED1

MOV R2,A         ;LED2

MOV R3,A         ;LED3

MOV R4,A         ;LED4

MOV R5,A         ;LED5

MOV R6,A         ;LED6

MOV R7.,A         ;LED7

MOV P1,#11110000B;设置各.按键的电平

MOV DPTR,#TABLE  ;查表

CLR F0           ;移位.标志位

SRC DATA 60H     ;定义SRC数据指针存放R0值

LED:

MOV P1,#11110000B;每次.初始化一次各按键的电平

MOV P0, #0; 清空上一位

MOV  A, R0

MOVC A, @A+DPTR

MOV P2, #00000000B ;LED0

MOV P0, A

LCALL D2ms

MOV P0, #0; 清空上一位

MOV  A, R1

MOVC. A, @A+DPTR

MOV P2, #00000100B  ;LED1

MOV P0, A

LCALL D2ms

MOV P0, #0; 清空上一位

MOV  A, R2

MO.VC A, @A+DPTR

MOV P2, #00001000B ;LED2

MOV P0, A

LCALL D2ms

MOV P0, #0; 清空上一位

MOV  A, R3

MOVC A, @A+.DPTR

M.OV P2, #00001100B ;LED3

MOV P0, A

LCALL D2ms

MOV P0, #0; 清空上一位

MOV . A, R4

MOVC A, @A+DPTR

MOV P2, #00010000B ;LED4

MOV P0, A

LCALL D2ms

MOV P0, #0; 清空上一位

MOV  A, R5

MOVC A, @A+DPTR

MOV P2, #00010.100B ;LED5

MOV P0, A

LCALL D2ms

MOV P0, #0; 清空上一位

MOV  A, R6

MOVC A, @A+DPTR

MOV .P2, #00011000B ;LED6

MOV P0, A

LCALL D2ms

MOV P0, #0; 清空上一位

MOV  A, R7

MOVC A, @.A+DPTR

MOV P2, #00011100B ;LED7

MOV P0, A

LCALL D2ms

MOV A, P1

CJNE A., #11110000.B, WAIT  ;判断是否真的按下?

LJMP LED

   WAIT: ACALL D2ms   ;去抖动

         AJMP  Judge

Judge:                   ;判断按下的是哪一行哪一列?

JNB P1.7, .row1   ;第一行

JNB. P1.6, row2   ;第二行

JNB P1.5, row3   ;第三行

LJMP L.ED   ;其他行直接略过

row1:    

S.ETB  P1.3   

JB    P1.7, R1L1  ;第一行第一列

S.ETB  P1.2.

JB    P1.7, R1L2  ;第一行第二列

SETB  P.1.1

JB    P1.7, R1L3  ;第一行第三列

SETB.  P1.0

JB    P1.7, R1L4  ;第一行第四列

LJMP LED.

row2:    

SETB  P1.3   

JB    P1..6, R2L1  ;第二行第一列

SETB  .P1.2

JB    P1.6, R2L2  ;第二行第二列

SETB  P1.1

JB    P1.6, .R2L3  ;第二行第三列

SETB  .P1.0

JB    P.1.6, R2L4  ;第二行第四列

LJMP LE.D

row3:   

SET.B  P1.3   

JB   . P1.5, R3L1  ;第三行第一列

SETB . P1.2

JB    P.1.5, R3L2  ;第三行第二列

SETB  P1.1

JB    P1..5, R3L3  ;第三行第三列

LJMP L.ED          ;无第四列

R1L1:CLR P1.3

     J.NB P1.7,R1L1

     M.O.V R0, #0

     AJMP Shift   ;跳转至移位函数

R1L2:CLR P1.2

     .JNB. P1.7,R1L2

     MOV R0, #1

     AJMP. Shift   ;跳转至移位函数

R1L3:CLR P1.1

     JNB P.1.7,R1L3

     MOV. R0, #2

     AJ.M.P Shift   ;跳转至移位函数

R1L4:CLR P1.0

     JNB P1.7,R1L4

     MOV .R0, #3

     AJ.MP Shift   ;跳转至移位函数

R2L1:CL.R P1.3

     JNB P1.6,R2L1

     MO.V .R0, #4

     AJMP .Sh.ift   ;跳转至移位函数

R2L2:CLR P1.2

     JNB P1.6,R2L2

     MOV .R0, #5

     AJMP Shift   ;跳转至移位函数

R2L3:CL.R P...1.1

     JNB P1.6,R2L3

     MOV R0, #6

     AJMP. Shift   ;跳转至移位函数

R2L4:CLR P1.0

     JNB .P1.6,R2L4

     MOV R0, #7

     AJMP Shift   ;跳转至移位函数

R3L1:CLR P1.3

     JNB P1.5,R3L1

     MOV R0, #8

     AJMP Shift   ;跳转至移位函数

R3L2:CLR P1.2

     JNB P.1.5,R3L2

     MOV R0, #9

     AJM.P Shift   ;跳转至移位函数

R3L3:CLR P1.1

     JNB P1.5,R3L3

     AJMP delete   ;跳转至删除函数

Shift:     ;移.位.函.数

JNB. F0, Reset    

MO.V B, R0

MOV R0,#SRC

MOV A, @R0

MOV R0, B

.

MOV B, R1;LED0 -> LED1

MOV R1, A

MOV A, R2;LED1 -> LED2

.MO.V. R2, B

MOV B, R3;LED2 -> LED3

MOV. R3, A

.MOV A, R4;LED3 -> LED4

MOV R4, B

MOV B, R5;LED4 -> LED5

MOV R5, A

MOV A, R6;LED5 -> LED6

MO.V R6, B

MOV B, R7;LED6 -> LED7

MOV R7, A

MOV A, R0

MO.V B, R0

MO.V R.,#SRC

MOV @R0, A

MOV R0,  B

LJMP LED

   Reset: ;第一次移位初始化

   MOV A, R0

   MOV B, R0

   MOV R0,#SRC

   MOV. @R0,A

   MOV R0, B

   SETB F0

   LJ.MP LED

delete:         ;删除函数

MOV A, R1 ;LED1 -> LED0

MO.V R0, A

MOV A, R2 ;LED2 -> LED1

MOV R1, A

MOV .A, R3 ;LED3 -> LED2

MOV R2, A

MOV A, R4 ;LED4 -> LED3

MOV R3, A

MOV A, R5 ;LED5 -> LED4

MOV R4, A

MOV .A, R6 ;LED6 -> LED5

MO.V R5, A

MOV A, R7 ;LED7 -> LED6

MOV R6, A

MOV .A, #0AH ;头位清空

MOV R7, A

MO.V A, R0

MOV R0, #SRC ;清空寨

MO.V @R0, A

MOV R0,  A

LJMP LED

                             

D2ms:MOV A, R7   ;指令执行时间1us

     MOV B., R6        ;指令执行时间1us

     MO.V R7,#6       ;指令执行时间1us

D2:  MOV R6,#200 ;指令执行时间1us

     DJNZ R6,$         ;指令执行时间2us, 200x2=400us

     DJNZ .R7,D2       ;指令执行时间2us, 循环体执行6次

     MOV R7, A        ;指令执行时间1us

     MOV R6, B        ;指令执行时间1us

     RET                    ;指令执行时间2us

;总延时=1+1+1+(1+200x2+2)x6+1+1+2=2.425ms

TABLE:

DB .3FH, 06H, 5BH, 4FH, 66H

DB 6DH, 7DH, 07.H, 7FH, 6FH, 00H

END

你可能感兴趣的:(矩阵,线性代数,51单片机)