实验02_Proteus仿真数码管显示代码
一、原理总结
- 利用两个寄存器R4和R5来存储两个数码管的显示效果,R4是前一个数码管显示所需,而R5是后一个数码管显示所需,利用左移操作RLC来使之每一位被依次输入到C中,然后将C输入到LED中(当LED每位都有数据时,数码管才会显示),利用停顿函数使数码管上数字停留一段时间。
二、程序分析
- 以下为全部代码,之后会进行具体分析
总体代码
;====================================================================
; Main.asm file generated by New Project wizard
;
; Created: 周一 九月 19 2022
; Processor: AT89C51
; Compiler: ASEM-51 (Proteus)
;====================================================================
$NOMOD51
$INCLUDE (8051.MCU)
;====================================================================
; DEFINITIONS
;====================================================================
;====================================================================
; VARIABLES
;====================================================================
;====================================================================
; RESET and INTERRUPT VECTORS
;====================================================================
; Reset Vector
org 0000h
jmp Start
;====================================================================
; CODE SEGMENT
;====================================================================
org 0100h
TAB : DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
PAUSE: ;停顿函数
MOV R1,#255 ;R1是第一层嵌套循环
D1: MOV R2,#255 ;R2是第二层嵌套循环
D2: DJNZ R2,D2 ;当R2不为0时跳转,为0时不跳转,执行DJNZ R1,D1使得R1- -
DJNZ R1,D1 ;当R1不为0时跳转,为0时不跳转
RET
LED:
MOV R0,#8 ;将8赋值给R0,8位左移
MOV A,R5 ;R5代表右边的LED的数
MOVC A,@A+DPTR ;A是偏移地址,是从DPTR中寻址
LOOP1:
RLC A ;A左移
CLR P1.4
MOV P1.5,C
SETB P1.4
DJNZ R0,LOOP1
MOV R0,#8
MOV A,R4
MOVC A,@A+DPTR
LOOP2:
RLC A
CLR P1.4
MOV P1.5,C
SETB P1.4
DJNZ R0,LOOP2
MOV R6,#0
S1: LCALL PAUSE
INC R6
CJNE R6,#10,S1
RET
START: MOV A,#00H
MOV p0,A
MOV DPTR,#TAB
MOV R4,#0
MOV R5,#0
A1: MOV C,P1.0
JC XUNHUAN
MOV C,9
JC FUWEI
INC R5
CJNE R5,#15,XUNHUAN
MOV R5,#0
INC R4
CJNE R4,#15,XUNHUAN
JMP FUWEI
XUNHUAN:
LCALL LED
JMP A1
FUWEI:
MOV R4,#0
MOV R5,#0
JMP A1
JMP START
;====================================================================
END
数组存值:
- TAB 是用来存储0-15这16个数据,之后使用A来寻址
TAB : DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
停顿函数:
- R1是第一层嵌套循环,R2是第二层嵌套循环,当R2不为0时跳转,为0时不跳转,执行DJNZ R1,D1使得R1- -,当R1不为0时跳转,为0时不跳转。
PAUSE: ;停顿函数
MOV R1,#255 ;R1是第一层嵌套循环
D1: MOV R2,#255 ;R2是第二层嵌套循环
D2: DJNZ R2,D2 ;当R2不为0时跳转,为0时不跳转,执行DJNZ R1,D1使得R1- -
DJNZ R1,D1 ;当R1不为0时跳转,为0时不跳转
RET
数码管亮灯函数
- LED中的内容:
- 将8赋值给R0,使用R0来实现8位右移
- 将R5赋值给A,而R5代表的是右边的数码管,R5共八位,使用R0来使之每位被传输到数码管中。
- MOVC A,@A+DPTR 是将A在DPTR中寻址,之后回赋值给A。
LED:
MOV R0,#8 ;将8赋值给R0,8位右移
MOV A,R5 ;R5代表右边的LED的数
MOVC A,@A+DPTR ;A是偏移地址,是从DPTR中寻址
- LOOP1中的内容:
- RLC 是带进位的循环左移,RLC A 即将A的内容左移一位,将进位位C中的值移到累加器A的最低位,A的最高位移到C里。若有A=01000001,C=1,则执行 RLC的话:A=10000011,C=0(A的最高位移到C,C原值移到A最低位)。
- RL 是带进位的循环左移,RL A 即将A的内容左移一位,将进位位C中的值移到累加器A的最低位,A的最高位不移到C里,若有A=01000001,C=1,则执行RL的话:A=10000010,C=1(A所有位左移一位,最低位补零,C不参加移位操作,保持原值不变)
- RLC之后三行是将数据放入数码管中的操作,不过多赘述
- DJNZ R0,LOOP0 是将 R0-- 过后看是否为0,若不为零则跳转,若为0则执行下面的操作
C=1,A=55H,RLC A后则为:C=0 A=ABH,即:1 01010101变为:0 10101011
LOOP1:
RLC A ;A左移
CLR P1.4 ;下面三行是对LED进行输入
MOV P1.5,C
SETB P1.4
DJNZ R0,LOOP1
MOV R0,#8
MOV A,R4
MOVC A,@A+DPTR
LED:
MOV R0,#8 ;将8赋值给R0,8位右移
MOV A,R5 ;R5代表右边的LED的数
MOVC A,@A+DPTR ;A是偏移地址,是从DPTR中寻址
LOOP1:
RLC A ;A左移
CLR P1.4 ;下面三行是对LED进行输入
MOV P1.5,C
SETB P1.4
DJNZ R0,LOOP1
MOV R0,#8
MOV A,R4
MOVC A,@A+DPTR
LOOP2:
RLC A
CLR P1.4
MOV P1.5,C
SETB P1.4
DJNZ R0,LOOP2
MOV R6,#0
S1: LCALL PAUSE
INC R6
CJNE R6,#10,S1
RET
START 部分:
- 首先对图中上面的数码管进行归0处理,然后 MOV DPTR,#TAB 将TAB这个数组的首地址给予DPTR,后续寻址使用,将R4 与 R5 进行初始化,赋值为0,
- C中一开始存储的是 p1.0 (其中存储的是开关数值,为1的话进行累加,为0的话保持不变)如C为1则直接执MOV C,9,若C为0的话跳转XUNHUAN,保持当前数字
- 之后C中存储的是9号端口传入的数据,9号段口控制复位(9号端口为1时执行之后指令,为0时执行FUWEI)
- 之后正式执行,R5从0开始累加,累加够16使R4加一,当R5小于等于15时执行数码管显示函数,大于15时执行R4++
START:
MOV A,#00H
MOV p0,A
MOV DPTR,#TAB
MOV R4,#0
MOV R5,#0
A1:
MOV C,P1.0
JC XUNHUAN
MOV C,9
JC FUWEI
INC R5
CJNE R5,#15,XUNHUAN
MOV R5,#0
INC R4
CJNE R4,#15,XUNHUAN
JMP FUWEI
XUNHUAN 和 FUWEI 部分:
- XUNHUAN 使用LED函数,亮数码管,之后跳转A1中。
- FUWEI 给与R4与R5赋值为0,之后跳转到A1中
XUNHUAN:
LCALL LED
JMP A1
FUWEI:
MOV R4,#0
MOV R5,#0
JMP A1
实验02_Proteus仿真数码管显示代码的更多相关文章
- 实验02_Proteus仿真数码管显示报告
一.原理总结 利用两个寄存器 R4 和 R5 来存储两个数码管的显示数字,R4 用来存储前一个数码管显示数字,而 R5 用来存储后一个数码管显示数字,利用左移操作 RLC 取 A 中首位放入 C ...
- verilog实验1:基于FPGA蜂鸣器演奏乐曲并数码管显示
一.实验任务 利用FPGA进行代码开发,使蜂鸣器演奏出乐曲<生日快乐>,将音调显示在数码管.原理为蜂鸣器为交流源蜂鸣器,在引脚上加一定频率的方波就可以发声,而且发声的频率由所加方波决定.这 ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验六:数码管模块
实验六:数码管模块 有关数码管的驱动,想必读者已经学烂了 ... 不过,作为学习的新仪式,再烂的东西也要温故知新,不然学习就会不健全.黑金开发板上的数码管资源,由始至终都没有改变过,笔者因此由身怀念. ...
- AVR单片机8位数码管显示的程序实现
AVR单片机8位数码管显示的程序实现 转载:http://www.sohu.com/a/117255149_119709 2016-10-26 16:30 我们接着来完成 数码管的显示实验.现在我 ...
- Verilog HDL那些事_建模篇笔记(实验七:数码管电路驱动)
1.同步动态扫描 多个数码管的显示采用的是同步动态扫描方法,同步动态扫描指的是:行信号和列信号同步扫描,是一种并行操作. 2.数码管驱动电路实现思路 如果要求数码管显示我们想要的数字,首先需 ...
- 源文件移动后gdb不显示代码的原因
源文件移动后gdb不显示代码的原因 问题 我们从一个最简单的C语言程序开始.源文件main.c在 用户目录gdb文件夹下. florian@florian-pc:~/gdb$ cat main.c ...
- 基于小脚丫的ADC081S101 电压采集595数码管显示
RTL结构图 采集模块运用SPI 通讯 MISO方式收集数据 module ad_collect(input sddata,input rst_n,output reg cs,output reg s ...
- eclipse怎么显示代码行数
熟悉java开发的朋友们肯定有这样的经验,那就是在用eclipse进行java开发的时候,没有显示代码的行数,这并不利于我们进行程序的调试.今天,小编就来教大家eclipse怎么显示代码行数 ...
- html+css显示代码书写版式
由于要显示行数,所以需选用html的列表标签ol,以下代码可以显示代码书写版式的效果: <style> .code-part { background: yellow; } .code-p ...
随机推荐
- Java通过反射注解赋值
前段时间,领导分配一个统计销售区域汇总的数据,解决方案使用到了反射获取注解,通过注解获取属性或者设置字段属性. 问题描述 查询公司列表,分别是公司id.区域id.区域名称: 公司id 区域id 区域名 ...
- Collection集合和Collection的常用功能
boolean add(E e); 向集合里添加元素 boolean remove(E e); 删除集合中的某个元素 void clear(); 清空集合的所有元素 boolean contains( ...
- 使用node命令提示: ‘node‘ 不是内部或外部命令,也不是可运行的程序
使用node命令提示: 'node' 不是内部或外部命令,也不是可运行的程序 该删的都删了,一切没有任何问题,还nvm use 报错乱码的,只要打开命令提示符 ,以管理员身份运行,就一些正常了 (就 ...
- Vue3 computed && watch(watchEffect)
1 # Vue3 计算属性与监视 2 # 1.computed函数:与Vue2.x中的computed配置功能一致 3 inport {ref,computed,watch} from 'vue'; ...
- RocketMQ 详解系列
什么是RocketMQ RocketMQ作为一款纯java.分布式.队列模型的开源消息中间件,支持事务消息.顺序消息.批量消息.定时消息.消息回溯等.主要功能是异步解耦和流量削峰:. 常见的MQ主要有 ...
- 【喜讯】Apache DolphinScheduler 荣获 “2020 年度十大开源新锐项目”
经 10000+ 开发者公开票选,20+专家评审. 10+ 主编团打分,历经数月打磨,11 月 19 日,由InfoQ 发起并组织的[2020中国技术力量年度榜单评选]结果正式揭晓. 2020 年度十 ...
- Three---面向对象与面向过程/属性和变量/关于self/一些魔法方法的使用/继承/super方法/多态
python的面向对象 面向对象与面向过程 面向过程 面向过程思想:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为,需要自己编写代码(自己来做) 面向对象 面向对象的三 ...
- MyBatis ognl.NoSuchPropertyException 或者 Invalid bound statement (not found)
描述 SpringBoot + Mybatis-plus 项目,运行时出现如下错误: ognl.NoSuchPropertyException:没有对应属性异常 Invalid bound state ...
- Warning Please make sure the network configuration is correct!( iaas-install-mysql.sh 脚本)
解读先电2.4版 iaas-install-mysql.sh 脚本 基础服务的操作命令已经编写成shell脚本,通过脚本进行一键安装.如下: # Controller节点 安装 执行脚本iaas-in ...
- Word 脚注和尾注是什么?怎么设置?
描述 脚注一般位于页面的底部,作为文档某处内容的注释.尾注一般位于文档的末尾,列出引文的出处等. 设置脚注和尾注 将光标移动到要插入脚注或尾注的地方,然后点击"引用"选项卡. 左边 ...