一、 实验要求
实验目的:
(1)掌握数码.管显示方法
(2)掌握.软件延时方法
(3)掌握键盘扫描及.去抖动方法
实验内容:
(1)利用单片机.开发板的矩阵键盘实现个人学号后 8 位的输入和显示。
(2)利用.矩阵键盘S1~S10 输入数字 1~0。
(3)利用数码管 LED8~LED1 从左到.右显示8位学号
二、 实验设计
1.整体思路
通过按键扫描,判断按.下的按键所在行和列,然后根据按下的行和列来控制LED点阵的亮灭。首先进行初始化,将各个寄存器和IO口设置初始状态,并将A寄存器初始化为0AH。然后进入主循环,依次.扫描各个按键,如果检测到按键按下,则根据按下的行.和列来点亮对应的LED。如果按键释放,则熄灭对应的LED。同时,程序还加入了去抖动和延时等功能,以提高程序的可靠.性和稳定性。
2.流程图
图 1 算法设计流程图
初始化模块:将各个寄存器和IO口设置初始状态,并将A寄存器初始化为0AH。
LED控制模块:根据按键扫.描的结果来控制LED点阵的亮灭。每次按键按下后,程序会根据按下的行和列来点亮对应的LED。
按键扫描模块:程序会先清空所有的按键标志位,然后依次将各个按键电平设置为低电平,检测是否有按键.按下。如果有按键按下,那么程序会根据按下的按键所在行和列来点亮对应的LED。
去抖动模块:在检测.按键按下时,程序会加入去抖动功能,以避免由于按键的机械性振动而产生的误判。
延时模块:在点亮LED时,程序会加入延时功.能,以避免由于LED的响应速度过快而产生的闪烁现象。
主循环模块:程序会不断循环执行.按键扫描和LED控制模块,以实现实时控制LED点阵的亮灭。
三、 实现效果
图 2 学号显示效果图
图 3删除前效果图
图 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