系列文章目录
实验一 软件开发环境和简单程序设计
实验二 I_O输入输出实验
实验三 键盘扫描显示实验
实验四 中断实验
实验五 定时器实验
实验六 串行口实验
实验七 数码管动态显示实验
实验八 矩阵键盘应用实验
实验九 电子时钟
前言
微机原理实验课程,会陆续根据目录更新文章
一、实验目的
掌握LED八段码显示器的动态显示工作原理
二、实验仪器
- Keil5
- 普中A2开发板
- stc-isp
三、实验内容
单片机控制8只数码管,同时显示8个字符。例如,从左至右显示“12345678”,接着显示“23456781”,…“81234567”,“12345678”。
四、流程框图
通过找到数码管数据之间的关系实现(难,不容易理解)
通过查表法实现(简单、容易理解)
五、实验程序
逻辑法
ORG 0000H
LJMP START
ORG 0003H
LJMP EX0_ISR ;外部中断0程序入口
ORG 000BH
LJMP TM0_ISR ;定时器0中断程序入口
ORG 0030H
START: ;系统初始化
ACALL EX0_INIT ;外部中断0初始化
ACALL TM0_INIT ;定时器0初始化
MOV DPTR, #TAB1 ;指向字形码表首地址
MOV R1 , #01H ;因为显示的是1-8,所以初始化为1,如果显示是0-7,则初始化为0
SETB EA ;开启总中断
MAIN:
ACALL DTSEG ;数码管显示
AJMP MAIN ;主函数循环
EX0_INIT:
SETB EX0 ;允许外部中断0中断
SETB IT0 ;设置外部中断0下降沿触发
RET
TM0_INIT:
ANL TMOD, #0F0H ;初始化定时器0
ORL TMOD, #01H ;设置定时器0工作方式1
MOV TL0 , #00H ;设置定时器初值 50ms
MOV TH0 , #4CH ;设置定时器初值
CLR TF0 ;清除TF0标志
SETB TR0 ;定时器0开始计时
SETB ET0 ;开启T0溢出中断
RET
DTSEG: ;动态数码管显示
MOV A , R1 ;R1存储的是第1位数码管显示的值(从右到左数第一位)
ADD A , #8 ;
MOV R0 , A ;
ONE: ;第一个数码管显示
CLR P2.2 ;选择第一位数码管显示
CLR P2.3
CLR P2.4
DEC R0 ;R0减一
MOV A , R0
SUBB A , #8 ;R0 - 8
JZ JW1 ;判断R0是否为8,是则直接显示R0的值
JNC JNW1 ;判断R0是否小于8,小于8则直接显示R0的值
;大于8则显示R0-8的值
JW1:MOV A , R0 ;
JNW1:
MOVC A , @A+DPTR
MOV P0 , A
ACALL DELAY100US ;单个数码管显示时间,时间太短,人眼无法看清;但也不能太长,因为要受限于临界闪烁频率。
MOV P0 , #00H ;熄灭数码管,消影,防止下一个数码管显示上一个数码管显示的残影
TWO:
SETB P2.2
CLR P2.3
CLR P2.4
DEC R0 ;R0减一
MOV A , R0
SUBB A , #8 ;判断R0是否大于8
JZ JW2 ;
JNC JNW2
JW2:MOV A , R0 ;
JNW2:
MOVC A , @A+DPTR
MOV P0 , A
ACALL DELAY100US
MOV P0 , #00H ;
THREE:
CLR P2.2
SETB P2.3
CLR P2.4
DEC R0 ;R0减一
MOV A , R0
SUBB A , #8 ;判断R0是否大于8
JZ JW3 ;
JNC JNW3
JW3:MOV A , R0 ;
JNW3:
MOVC A , @A+DPTR
MOV P0 , A
ACALL DELAY100US
MOV P0 , #00H ;
FOUR:
SETB P2.2
SETB P2.3
CLR P2.4
DEC R0 ;R0减一
MOV A , R0
SUBB A , #8 ;判断R0是否大于8
JZ JW4 ;
JNC JNW4
JW4:MOV A , R0 ;
JNW4:
MOVC A , @A+DPTR
MOV P0 , A
ACALL DELAY100US
MOV P0 , #00H ;
FIVE:
CLR P2.2
CLR P2.3
SETB P2.4
DEC R0 ;R0减一
MOV A , R0
SUBB A , #8 ;判断R0是否大于8
JZ JW5 ;
JNC JNW5
JW5:MOV A , R0 ;
JNW5:
MOVC A , @A+DPTR
MOV P0 , A
ACALL DELAY100US
MOV P0 , #00H ;
SIX:
SETB P2.2
CLR P2.3
SETB P2.4
DEC R0 ;R0减一
MOV A , R0
SUBB A , #8 ;判断R0是否大于8
JZ JW6 ;
JNC JNW6
JW6:MOV A , R0 ;
JNW6:
MOVC A , @A+DPTR
MOV P0 , A
ACALL DELAY100US
MOV P0 , #00H ;
SEVEN:
CLR P2.2
SETB P2.3
SETB P2.4
DEC R0 ;R0减一
MOV A , R0
SUBB A , #8 ;判断R0是否大于8
JZ JW7 ;
JNC JNW7
JW7:MOV A , R0 ;
JNW7:
MOVC A , @A+DPTR
MOV P0 , A
ACALL DELAY100US
MOV P0 , #00H ;
EIGHT:
SETB P2.2
SETB P2.3
SETB P2.4
DEC R0 ;R0减一
MOV A , R0
SUBB A , #8 ;判断R0是否大于8
JZ JW8 ;
JNC JNW8
JW8:MOV A , R0 ;
JNW8:
MOVC A , @A+DPTR
MOV P0 , A
ACALL DELAY100US
MOV P0 , #00H ;
RET
EX0_ISR:
ACALL DELAY50MS ;延时50ms消抖
SETB P3.2 ;P3,2置1,准备读取端口的值
MOV C , P3.2 ;读取P3.2口的值
JC RETURN ;如果P3,2为1,则说明按键没有按下,退出中断
INC R1 ;进入中断一次,数码管显示的值+1
CJNE R1 , #9, RETURN ;如果R1的值为9,则置1
MOV R1 , #01H
RETI
TM0_ISR:
MOV TL0 , #00H ;重装定时器初值 50ms
MOV TH0 , #4CH ;重装定时器初值
INC R2 ;R2加1
CJNE R2 , #20 ,RETURN ;判断是否到达1s
MOV R2 , #00H ;R2清0
INC R1 ;显示值加1
CJNE R1 , #9, RETURN ;如果R1的值为9,则置1
MOV R1 , #01H
RETI
RETURN:
RETI
DELAY50MS: ;@11.0592MHz
PUSH 30H
PUSH 31H
MOV 30H,#90
MOV 31H,#158
NEXT50MS:
DJNZ 31H,NEXT50MS
DJNZ 30H,NEXT50MS
POP 31H
POP 30H
RET
DELAY100US: ;@11.0592MHz
PUSH 30H
MOV 30H,#41
NEXT100US:
DJNZ 30H,NEXT100US
POP 30H
RET
TAB1:
DB 03FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH; 0 - 9共阳极字形码
END
查表法
ORG 0000H
LJMP START
ORG 000BH
LJMP TM0_ISR ;定时器0中断程序入口
ORG 0030H
START:
ACALL TM0_INIT
MOV DPTR, #TAB1
MOV R1 , #01H ;用于选择显示的表
SETB EA
MAIN:
ACALL XZTAB ;选择显示的字形码表
ACALL DTSEG ;动态数码管显示
AJMP MAIN
TM0_INIT:
ANL TMOD, #0F0H ;初始化定时器0
ORL TMOD, #01H ;设置定时器0工作方式1
MOV TL0 , #00H ;设置定时器初值 50ms
MOV TH0 , #4CH ;设置定时器初值
CLR TF0 ;清除TF0标志
SETB TR0 ;定时器0开始计时
SETB ET0 ;开启T0溢出中断
RET
XZTAB:
XZTAB1:
CJNE R1 , #1 , XZTAB2 ;根据R1的值选择字形码表
MOV DPTR, #TAB1
RET
XZTAB2:
CJNE R1 , #2 , XZTAB3
MOV DPTR, #TAB2
RET
XZTAB3:
CJNE R1 , #3 , XZTAB4
MOV DPTR, #TAB3
RET
XZTAB4:
CJNE R1 , #4 , XZTAB5
MOV DPTR, #TAB4
RET
XZTAB5:
CJNE R1 , #5 , XZTAB6
MOV DPTR, #TAB5
RET
XZTAB6:
CJNE R1 , #6 , XZTAB7
MOV DPTR, #TAB6
RET
XZTAB7:
CJNE R1 , #7 , XZTAB8
MOV DPTR, #TAB7
RET
XZTAB8:
CJNE R1 , #8 , XZTAB_RET
MOV DPTR, #TAB8
XZTAB_RET:
RET
DTSEG:
MOV R2 , #0 ;R2清0
EIGHT:
ANL P2 , #0E3H ;P2.2 P2.3 P2.4置0
ORL P2 , #1CH ;选择第8位数码管显示
MOV A , R2
MOVC A , @A+DPTR
MOV P0 , A ;字形码输出到数码管
LCALL DELAY100US
MOV P0 , #00H ;消影
SEVEN:
INC R2
ANL P2 , #0E3H
ORL P2 , #18H
MOV A , R2
MOVC A , @A+DPTR
MOV P0 , A
LCALL DELAY100US
MOV P0 , #00H;
SIX:
INC R2
ANL P2 , #0E3H
ORL P2 , #14H
MOV A , R2
MOVC A , @A+DPTR
MOV P0 , A
LCALL DELAY100US
MOV P0 , #00H;
FIVE:
INC R2
ANL P2 , #0E3H
ORL P2 , #10H
MOV A , R2
MOVC A , @A+DPTR
MOV P0 , A
LCALL DELAY100US
MOV P0 , #00H;
FOUR:
INC R2
ANL P2 , #0E3H
ORL P2 , #0CH
MOV A , R2
MOVC A , @A+DPTR
MOV P0 , A
LCALL DELAY100US
MOV P0 , #00H;
THREE:
INC R2
ANL P2 , #0E3H
ORL P2 , #08H
MOV A , R2
MOVC A , @A+DPTR
MOV P0 , A
LCALL DELAY100US
MOV P0 , #00H;
TWO:
INC R2
ANL P2 , #0E3H
ORL P2 , #04H
MOV A , R2
MOVC A , @A+DPTR
MOV P0 , A
LCALL DELAY100US
MOV P0 , #00H;
ONE:
INC R2
ANL P2 , #0E3H
ORL P2 , #00H
MOV A , R2
MOVC A , @A+DPTR
MOV P0 , A
LCALL DELAY100US
MOV P0 , #00H;
RET
TM0_ISR:
MOV TL0 , #00H ;重装定时器初值 50ms
MOV TH0 , #4CH ;重装定时器初值
INC R0
CJNE R0 , #20 ,RETURN ;
MOV R0 , #0
INC R1
CJNE R1 , #9 ,RETURN ;1~8循环
MOV R1 , #1
RETURN:
RETI
DELAY100US: ;@11.0592MHz
PUSH 30H
MOV 30H,#41
NEXT100US:
DJNZ 30H,NEXT100US
POP 30H
RET
TAB1:
DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH; 12345678
TAB2:
DB 5BH,4FH,66H,6DH,7DH,07H,7FH,06H; 23456781
TAB3:
DB 4FH,66H,6DH,7DH,07H,7FH,06H,5BH; 34567812
TAB4:
DB 66H,6DH,7DH,07H,7FH,06H,5BH,4FH; 45678123
TAB5:
DB 6DH,7DH,07H,7FH,06H,5BH,4FH,66H; 56781234
TAB6:
DB 7DH,07H,7FH,06H,5BH,4FH,66H,6DH; 67812345
TAB7:
DB 07H,7FH,06H,5BH,4FH,66H,6DH,7DH; 78123456
TAB8:
DB 7FH,06H,5BH,4FH,66H,6DH,7DH,07H; 81234567
END;
六、程序分析
1.逻辑法
数码管动态显示
在某一时刻,只让某一位的位选线处于选通状态,而其他各位的位选线处于关闭状态,同时,段码线上输出相应位要显示的字符段的段码。如此循环下去,就可以使各位轮流显示出将要显示的字符。
字符移位
首先观察每个时刻8个数码管显示的值之间的联系。观察到前一个数码管显示的值总是后一个数码管显示的值减一,只有1-8字符有效,即1-1之后不显示0而显示8。根据这层关系即可编写代码。
切换方式
字符切换有两种方式,第一种为每一秒钟自动移位,第二种为按键按下移位,在定时器0中断服务函数和外部中断0服务函数中实现。
数码管位选
查看原理图可知,数码管的位选由74HC138译码器控制,即需要控制P2.2,P2.3,P2.4的值来控制数码管位选。
2.查表法
通过R1的值来切换显示的字形码表,很简单,不多做解释了,查表法这里采用了另一种数码管位选的方式,以显示第8位数码管为例
ANL P2 , #0E3H ;P2.2 P2.3 P2.4置0
ORL P2 , #1CH ;选择第8位数码管显示
通过ANL语句将P2.2 P2.3 P2.4置0,再采用ORL语句对P2.2 P2.3 P2.4置1。通过这种方式可以不影响P2其他端口的输出。
七、测试报告
—上电后,数码管按照实验要求显示。每一秒钟或按键按下字符移位。效果如下图所示
文章来源:https://www.toymoban.com/news/detail-470293.html
总结
第一次写博客,如有不足,请多多包含😊,如果对您有帮助的话记得点赞哦😍文章来源地址https://www.toymoban.com/news/detail-470293.html
到了这里,关于<微机原理>[汇编语言]-[实验七]数码管动态显示实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!