简介:
本文详细介绍如何使用51汇编的Proteus仿真去实现数码管静态显示1-6。此教程只做操作过程,不具体解释每一步具体含义,以极简的方式,通过操作让你实现相关功能。
前提条件:
①新建好相关的仿真工程,绘制好相关原理图
②学会了IO口的基本控制
如果不具备以上条件,可以往回看相关教程,往期内容有较详细的讲解!
1、整体原理图如下
2、数码管原理图
这里使用的是蓝色的6位,数码管的名称SEG-MPX6-CA-BLUE。将数码管的a、b、c、d、e、f、g、dp的段选连接到P0口,将数码管1到6位选连接到P3口。通过先选通段选,在再选位选,实现数码管的显示。
3、数码管显示1-6子程序
;=========================
; 数码管显示1-6子程序
; 名称:SEG_1_6
; 输入:空
; 输出:空
; 功能:数码管2,4,6位循环显示0-9
;=========================
SEG_1_6:
CLR SEG_1 ; 关闭数码管1
CLR SEG_2 ; 关闭数码管2
CLR SEG_3 ; 关闭数码管3
CLR SEG_4 ; 关闭数码管4
CLR SEG_5 ; 关闭数码管5
CLR SEG_6 ; 关闭数码管6
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
SETB SEG_1 ; 打开数码管1
MOV SEG_DUAN, #0F9H ; 点亮段选
LCALL DELAY ; 调用延时20个机器周期函数
CLR SEG_1 ; 关闭数码管1
MOV SEG_DUAN, #0FFH ; 灭亮段选
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
SETB SEG_2 ; 打开数码管2
MOV SEG_DUAN, #0A4H ; 点亮段选
LCALL DELAY ; 调用延时20个机器周期函数
CLR SEG_2 ; 关闭数码管2
MOV SEG_DUAN, #0FFH ; 灭亮段选
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
SETB SEG_3 ; 打开数码管3
MOV SEG_DUAN, #0B0H ; 点亮段选
LCALL DELAY ; 调用延时20个机器周期函数
CLR SEG_3 ; 关闭数码管3
MOV SEG_DUAN, #0FFH ; 灭亮段选
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
SETB SEG_4 ; 打开数码管4
MOV SEG_DUAN, #099H ; 点亮段选
LCALL DELAY ; 调用延时20个机器周期函数
CLR SEG_4 ; 关闭数码管4
MOV SEG_DUAN, #0FFH ; 灭亮段选
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
SETB SEG_5 ; 打开数码管5
MOV SEG_DUAN, #92H ; 点亮段选
LCALL DELAY ; 调用延时20个机器周期函数
CLR SEG_5 ; 关闭数码管5
MOV SEG_DUAN, #0FFH ; 灭亮段选
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
SETB SEG_6 ; 打开数码管6
MOV SEG_DUAN, #82H ; 点亮段选
LCALL DELAY ; 调用延时20个机器周期函数
CLR SEG_6 ; 关闭数码管6
MOV SEG_DUAN, #0FFH ; 灭亮段选
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
RET
4、具体效果展示
5、完整程序
;=========================
; 文件名称:main.asm
; 文件描述:汇编基本程序教程:数码管
; 创建人:lsh
; 创建日期: 2023.9.21
; 程序版本:1.0
; 完成日期:2023.9.21
;=修改记录====
; 修改人:
; 修改内容:
; 修改时间:
;=========================
$NOMOD51
$INCLUDE (80C52.MCU)
; IO引脚定义
;=========================
SEG_1 EQU P3.0 ; 定义P3.0口为SEG_1
SEG_2 EQU P3.1 ; 定义P3.1口为SEG_2
SEG_3 EQU P3.2 ; 定义P3.2口为SEG_3
SEG_4 EQU P3.3 ; 定义P3.3口为SEG_4
SEG_5 EQU P3.4 ; 定义P3.4口为SEG_5
SEG_6 EQU P3.5 ; 定义P3.5口为SEG_6
SEG_DUAN EQU P0 ;定义P0口为SEG_DUAN
;=========================
;=========================
org 0000h
jmp Start ; 跳转到程序开始入口
;=========================
; 主程序
;=========================
org 0100h
Start:
;=========================
; 主程序的主循环
;=========================
Loop: ; 程序主循环
LCALL SEG_1_6
AJMP Loop ; 跳转到程序主循环开头
;=========================
;子程序
;=========================
;=========================
; 延时子程序
; 名称:DELAY
; 输入:空
; 输出:空
; 功能:占用cpu,实现延时一段时间
;=========================
DELAY:
MOV R0,#10
DELAY1:
MOV R1,#20
DELAY2:
MOV R2,#20
DJNZ R2,$
DJNZ R1,DELAY2
DJNZ R0,DELAY1
RET
;=========================
;=========================
;=========================
; 延时20机器指令子程序
; 名称:DELAY20_NOP:
; 输入:空
; 输出:空
; 功能:占用cpu,实现延时20机器指令
;=========================
DELAY20_NOP:
MOV R0,#20
DELAY20_NOP1:
NOP
DJNZ R0,DELAY20_NOP1
RET
; 数码管显示1-6子程序
; 名称:SEG_1_6
; 输入:空
; 输出:空
; 功能:数码管2,4,6位循环显示0-9
;=========================
SEG_1_6:
CLR SEG_1 ; 关闭数码管1
CLR SEG_2 ; 关闭数码管2
CLR SEG_3 ; 关闭数码管3
CLR SEG_4 ; 关闭数码管4
CLR SEG_5 ; 关闭数码管5
CLR SEG_6 ; 关闭数码管6
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
SETB SEG_1 ; 打开数码管1
MOV SEG_DUAN, #0F9H ; 点亮段选
LCALL DELAY ; 调用延时20个机器周期函数
CLR SEG_1 ; 关闭数码管1
MOV SEG_DUAN, #0FFH ; 灭亮段选
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
SETB SEG_2 ; 打开数码管2
MOV SEG_DUAN, #0A4H ; 点亮段选
LCALL DELAY ; 调用延时20个机器周期函数
CLR SEG_2 ; 关闭数码管2
MOV SEG_DUAN, #0FFH ; 灭亮段选
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
SETB SEG_3 ; 打开数码管3
MOV SEG_DUAN, #0B0H ; 点亮段选
LCALL DELAY ; 调用延时20个机器周期函数
CLR SEG_3 ; 关闭数码管3
MOV SEG_DUAN, #0FFH ; 灭亮段选
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
SETB SEG_4 ; 打开数码管4
MOV SEG_DUAN, #099H ; 点亮段选
LCALL DELAY ; 调用延时20个机器周期函数
CLR SEG_4 ; 关闭数码管4
MOV SEG_DUAN, #0FFH ; 灭亮段选
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
SETB SEG_5 ; 打开数码管5
MOV SEG_DUAN, #92H ; 点亮段选
LCALL DELAY ; 调用延时20个机器周期函数
CLR SEG_5 ; 关闭数码管5
MOV SEG_DUAN, #0FFH ; 灭亮段选
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
SETB SEG_6 ; 打开数码管6
MOV SEG_DUAN, #82H ; 点亮段选
LCALL DELAY ; 调用延时20个机器周期函数
CLR SEG_6 ; 关闭数码管6
MOV SEG_DUAN, #0FFH ; 灭亮段选
LCALL DELAY20_NOP ; 调用延时20个机器周期函数
RET
;=========================
;=========================
END ; 程序结束
;=========================
点赞、收藏加关注,下期不迷路!
更多精彩内容,请看往期!
一起学起来,让我们成为更优秀的自己!我们下期不见不散!