简介:
本文详细介绍如何使用51汇编的Proteus仿真去实现数码管2,4,6依次循环显示0-9。此教程只做操作过程,不具体解释每一步具体含义,以极简的方式,通过操作让你实现相关功能。
前提条件:
①新建好相关的仿真工程,绘制好相关原理图
②学会了IO口的基本控制
如果不具备以上条件,可以往回看相关教程,往期内容有较详细的讲解!
1、整体原理图如下
2、数码管原理图
这里使用的是蓝色的6位,数码管的名称SEG-MPX6-CA-BLUE。将数码管的a、b、c、d、e、f、g、dp的段选连接到P0口,将数码管1到6位选连接到P3口。通过先选通段选,在再选位选,实现数码管的显示。
3、数码管循环显示0-9子程序
;=========================
; 数码管显示0-9子程序
; 名称:SEG_0_9
; 输入:空
; 输出:空
; 功能:数码管2,4,6位循环显示0-9
;=========================
SEG_0_9:
CLR SEG_1 ; 关闭数码管1
CLR SEG_3 ; 关闭数码管3
CLR SEG_5 ; 关闭数码管5
MOV R3,#10 ; 0-9循环次数10
MOV R4,#0 ; 查表偏移量
SEG_0_9_1:
MOV DPTR,#TAB ; 将数组首地址传给DPTR
MOV A,R4 ; 将数组偏移量赋值给A
MOVC A,@A+DPTR ; 将数组TAB中的第A+1个值赋给A
MOV SEG_DUAN, A ; 使用A的值选通数码管的段选
LCALL DELAY ; 调用延时子程序
INC R4 ; 查表偏移量值加1
DJNZ R3,SEG_0_9_1 ; 循环次数自减1,并跳转到SEG_0_9_1
RET
;=========================
4、具体效果展示
5、完整程序
;=========================
; 文件名称:main.asm
; 文件描述:汇编基本程序教程:数码管
; 创建人:lsh
; 创建日期: 2023.10.01
; 程序版本:1.0
; 完成日期:2023.10.01
;=修改记录====
; 修改人:
; 修改内容:
; 修改时间:
;=========================
$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 DELAY ; 调用延时子程序
LCALL SEG_0_9
LCALL DELAY ; 调用延时子程序
AJMP Loop ; 跳转到程序主循环开头
;=========================
;子程序
;=========================
;==码表
TAB: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 98H
;=========================
; 延时子程序
; 名称:DELAY
; 输入:空
; 输出:空
; 功能:占用cpu,实现延时一段时间
;=========================
DELAY:
MOV R0,#228
DELAY1:
MOV R1,#20
DELAY2:
MOV R2,#20
DJNZ R2,$
DJNZ R1,DELAY2
DJNZ R0,DELAY1
RET
;=========================
;=========================
; 数码管显示0-9子程序
; 名称:SEG_0_9
; 输入:空
; 输出:空
; 功能:数码管2,4,6位循环显示0-9
;=========================
SEG_0_9:
CLR SEG_1 ; 关闭数码管1
CLR SEG_3 ; 关闭数码管3
CLR SEG_5 ; 关闭数码管5
MOV R3,#10 ; 0-9循环次数10
MOV R4,#0 ; 查表偏移量
SEG_0_9_1:
MOV DPTR,#TAB ; 将数组首地址传给DPTR
MOV A,R4 ; 将数组偏移量赋值给A
MOVC A,@A+DPTR ; 将数组TAB中的第A+1个值赋给A
MOV SEG_DUAN, A ; 使用A的值选通数码管的段选
LCALL DELAY ; 调用延时子程序
INC R4 ; 查表偏移量值加1
DJNZ R3,SEG_0_9_1 ; 循环次数自减1,并跳转到SEG_0_9_1
RET
;=========================
;=========================
END ; 程序结束
;=========================