汇编实现LED循环点亮(延时子程序模板)

news2024/9/24 15:18:35

在单片机P2口外接8个发光二极管(低电平驱动)。试编写一个汇编程序,实现LED循环点亮功能:P2.0-P2.1-P2.2-P2.3-…-P2.7-P2.6-P25-…-P2.0的顺序,无限循环。要求采用软件延时方式控制闪烁时间间隔(约50ms)。

首先进行电路设计

电路原理图设计

利用 Proteus 软件的ISIS 模块绘制原理图。虑到LED低电平驱动要求,硬件电路设计时需使LED的阴极应接P2口,阳极通过限流电阻与+5V 电源相接。电路原理图如下:

在这里插入图片描述

XTAL1和XTAL2是晶振的输入和输出端口。C1和C2电容被连接到这些端口,以提供晶振所需的稳定电压和电流。这两个电容组成了一个串联谐振电路,可以帮助晶振产生稳定的振荡信号。这样,微控制器或其他设备就可以使用这个稳定的时钟信号来进行精确的计时和同步操作。

RST引脚连接C3电容器和电阻的目的是为了实现复位电路。当微控制器系统中存在异常或故障时,可以通过将RST引脚拉低来进行强制复位操作,将系统恢复到初始状态。C3和1K欧姆电阻组成了一个简单的延迟元件,在复位期间提供了一个短暂的时间延迟,并消除了可能存在的任何噪声或干扰信号,从而确保复位信号的稳定性和可靠性。

程序设计

编程思路:P2口的亮灯编码初值应能保证 P2.0 位输出低电平,其余位均为高电平。根据电路要求,这一编码初值应为 OFEH(二进制1111 1110),即D1 为亮,D2~D8 皆为暗。此后,不断将亮灯编码值进行循环左移输出,亮灯位将随之由上向下变化;循环左移7次后改为循环右移,则亮灯位将随之由下向上变化。如此反复进行便可实现题意要求的流水灯功能。

图 所示为编程思路的程序流程图。

在这里插入图片描述

汇编代码如下:

ORG     30H
CYC1    EQU  200
CYC2    EQU  125

MOV     A,#0FEH ;LED亮灯编码初值
MOV     P2,A
MOV     R2,#7 ;计数器 7次换方向

DOWN:   RL      A       ;下行方向
  ACALL   DEL50 ;延时50ms
  MOV     P2,A
  DJNZ    R2,DOWN
  MOV     R2,#7
 
UP:     RR      A       ;上行方向
  ACALL   DEL50
  MOV     P2,A
  DJNZ    R2,UP
  MOV     R2,#7
  SJMP    DOWN

DEL50:  MOV     R7,#CYC1;延时50ms
DEL1:   MOV     R6,#CYC2
  DJNZ    R6,$
  DJNZ    R7,DEL1
  RET
  END

下面进行一些解释:

  • ORG 30H:设置代码的起始地址为 30H。

  • CYC1 EQU 200:定义常数 CYC1 的值为 200,用于延时操作。

  • CYC2 EQU 125:定义常数 CYC2 的值为 125,用于延时操作。

  • MOV A,#0FEH:将二进制数 0xFE(1111 1110)存储到 A 寄存器中,这是一个控制 LED 灯亮灭的编码初值。

  • MOV P2,A:将 A 寄存器的值传送到 P2 引脚上,控制 LED 灯亮灭。

  • MOV R2,#7:初始化计数器 R2 的值为 7,用于实现循环功能。

  • DOWN: RL A;ACALL DEL50;MOV P2,A;DJNZ R2,DOWN;MOV R2,#7:这段代码实现了一个循环结构,在每次循环中逐行读取 P2 引脚的输入信号并将其输出给其他设备。具体来说,它执行以下步骤:

将 A 寄存器中的值向左循环移位一位,并将最高位的值保存在 Carry 标志位中;

将 A 寄存器的值传送到 P2 引脚上,输出给其他设备;

延时一定时间(由 DEL50 子程序控制);

将 R2 寄存器的值减去 1,并检查是否等于 0。如果不为 0,则跳转到标记为 DOWN 的代码行,继续执行下一次循环;否则,将 R2 的值重新设置为 7,结束循环。

  • UP: RR A;ACALL DEL50;MOV P2,A;DJNZ R2,UP;MOV R2,#7:这段代码与上面的 DOWN 循环结构类似,但是它是用来逆向读取 P2 引脚的输入信号并输出给其他设备。

  • SJMP DOWN:无条件跳转到标记为 DOWN 的代码行,实现无限循环。

  • DEL50: MOV R7,#CYC1;延时 50ms

  • DEL1: MOV R6,#CYC2;将常数 CYC2 存储到寄存器 R6 中,用于延时操作。

  • DJNZ R6,:将 R6 寄存器的值减去 1,并检查是否等于 0。如果 R6 不为 0,则跳转到当前代码行(:将R6寄存器的值减去1,并检查是否等于0。如果R6不为0,则跳转到当前代码行(),实现一个短暂的延时操作。

  • DJNZ R7,DEL1:将 R7 寄存器的值减去 1,并检查是否等于 0。如果 R7 不为 0,则跳转到标记为 DEL1 的代码行,继续执行延时操作。

  • RET:从子程序中返回主程序。

  • END:表示程序结束。


延时子程序

如何实现延时的:

CYC1    EQU  200    
CYC2    EQU  125
DEL50:  MOV     R7,#CYC1;延时50ms

DEL1:   MOV     R6,#CYC2
  DJNZ    R6,$
  DJNZ    R7,DEL1

首先设置CYC1 和 CYC2C 的值是 200 和125 ,类似常量

然后设置DEL50子程序: R7寄存器赋值,将CYC1的值200存储到R7寄存器中。
DEL1子程序标签也是这样,将CYC2的值125存储到R6寄存器中。

下面 DJNZ R6,$ :

将R6寄存器的值减1,如果结果不为零,则跳转到当前标签(即DEL1)所在的位置,继续执行循环。这样就可以实现循环CYC2(125)次的功能。

同样,DJNZ R7,DEL1的意思是将R7寄存器的值减一,如果结果不为零,则跳转到DEL1标签所在的位置,继续执行循环。这样就可以实现循环CYC1次的功能,从而实现50ms的延时。

有点像循环里面再嵌套一个

for
if 
 if

这样

最后计算时间延时:

在这里插入图片描述

以后汇编计算延时可以类似这样

 


仿真结果

汇编实现LED循环点亮(延时子程序模板)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/498400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

php+vue影视电影视频点播推荐avxhe系统

影视推荐系统的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、公告信息管理、电影分类管理、影视推荐管理、付费点播管理、点播信息管理、管理员管理、系统管理,用户:首页、个人中心、付费点播管理、…

数字化转型导师坚鹏:企业数字化领导力提升之道

企业数字化领导力提升之道 ——融合中西智慧,践行知行合一思想,实现知行果合一 课程背景: 很多企业存在以下问题: 不知道如何领导面临的数字化时代? 不清楚企业数字化领导力模型的内涵? 不知道如何…

开关电源基础02:基本开关电源拓扑(1)-BUCK拓扑

说在开头:关于海森堡的矩阵(1) 我们前面说了,海森堡和泡利到了哥本哈根跟着玻尔混,在哥本哈根海森堡感到了一种竞争的气氛:他在德国少年得志,是出了名的天才,现在突然发现身边的每一…

Python每日一练:圆桌争风吃醋的豚鼠韩信点兵(全一行代码解法)

文章目录 前言一、圆桌二、争风吃醋的豚鼠三、韩信点兵总结 前言 很显然,Python的受众远远大于C,其实笔者本人对Python的理解也是远强于C的,C纯粹是为了假装笔者是个职业选手才随便玩玩的,借着十多年前学的C的功底,强…

01、爬虫js逆向之-七麦数据

目标网址:aHR0cHM6Ly93d3cucWltYWkuY24vcmFuay9pbmRleC9icmFuZC9hbGwvZGV2aWNlL2lwaG9uZS9jb3VudHJ5L2NuL2dlbnJlLzM2 (需要进行ba64解码即可获取到参数) 需要逆向的加密参数:analysis 1、点击数据接口,触发请求 2、点…

2022年NOC大赛编程马拉松赛道复赛图形化低年级A卷-正式卷,包含答案

目录 选择题: 多选题: 编程题: 下载文档打印做题: 2022年NOC大赛编程马拉松赛道复赛图形化低年级A卷-正式卷 2022NOC-图形化复赛低年级A卷正式卷

天地气运流转,皆在五行生克中

在中国的传统文化里,常讲“气运”二字,把两字分开,便是气数与命运。 在现代人的观念里,气运是个复杂又抽象的概念。 天地五行之气轮流转,一切都在五行生克中。 而古人的方法,是通过五行的变化来描述气运的流…

Promise类方法

这篇主要讲一下Promise的类方法的基本使用,至于Promise的基本使用这里就不赘述了,之前也有手写过Promise、实现了Promise的核心逻辑。其实我们平时用Promise也挺多的,不过又出现了两个新的语法(ES11,ES12新增了两个&am…

Gradle使用

下载Gradle Gradle Distributions 配置环境变量 测试是否成功 cmd输入gradle -v 在.gradle目录下创建一个init.gradle allprojects { repositories { maven { url file:///D:/maven/myRepository} ## 这里是本地maven仓库地址,没有就会依次向下设置的地址寻…

wisp5学习日记1

这里写目录标题 编译工程问题一 LSD-FET430UIF仿真器排针方向与所给排针方向示意图不一致,不知怎么方向问题2 拟器或仿真器无法找到连接到计算机的USB FET 编译工程 鼠标右键选择build project 问题一 LSD-FET430UIF仿真器排针方向与所给排针方向示意图不一致&…

【Java基础 2】Java 基础语法

🍊 Java学习:社区快速通道 文章目录 1 变量与基本数据类型1.1 变量1.2 数据类型1.3 标识符1.4 类型转换1.5 关键字大全 2 二进制概述3 方法4 运算符4.1 算术运算符4.2 赋值运算符4.3 关系运算符4.4 逻辑运算符4.5 字符串连接运算符4.6 三目运算符 5 命名…

配置JDK环境变量

文章目录 查看电脑系统下载及安装JavaSE配置系统环境变量测试环境变量配置是否成功。 查看电脑系统 运行输入框中输入:control 下载及安装JavaSE 这个从网上下载就行,jdk-8u141-windows-x64.exe,不提供下载方式了。 主要讲解安装过程&a…

AI 工具合辑盘点(十二)持续更新 之 面向学生群体的 AI 工具和面向所有人的 AI 工具

面向学生群体的 AI 工具 人工智能在教育领域可以发挥多种作用。例如,它可以用于个性化课程、检测抄袭、转录讲座和促进教师与学生之间的快速沟通等等。 教育面临着许多挑战,这些人工智能工具可以帮助教师和学生。这些 AI 可以替代手动工作、降低人为错…

图解HTTP

文章目录 第一章、了解web及网络基础HTTP 的诞生网络基础 TCP/IPTCP/IP 协议族层次化的好处应用层传输层网络层链路层(又名数据链路层,网络接口层) 数据传输流举例: 与HTTP关系密切的协议:IP、TCP和DNS负责传输的 IP 协…

Simulink 自动代码生成电机控制:开发板DAC接口辅助调试的方法

目录 前言 DAC基本原理 PWM模拟DAC DAC底层代码配置 DAC调试演示 总结 前言 DAC是比较常用的数字转模拟单元,通过给定数字量,输出一个模拟信号,有比较广泛的用途,在这里只讨论DAC作为一个调式手段帮助打印出电机控制里面的一…

【大学物理实验】实验报告数据

写在前面: 1:本文章收集CAU的18个大学物理实验的实验数据,仅供参考。(因为本人很讨厌竞速实验orz) 2:实验之间的差距,不如负责老师之间的差距。以及需要考虑机考的虚拟实验你会不会做。&#…

Linux内核驱动开发(二)

LED设备驱动 LED基本硬件原理(以QT210为例) 通过配置GPIO,把相应的GPIO设置成高电平或低电平,达到点灯。 LED设备驱动的代码 leds_create_device 初始化设备 核心数据结构初始化 设备号 major>0 :指定了设备号…

nexus工作原理及项目配置注意事项

一、nexus工作原理图 私服搭建&#xff0c;可以参考下面链接&#xff1a; 搭建Maven私服Nexus3_石工记的博客-CSDN博客 二、项目配置注意事项&#xff08;两个配置&#xff09; 1.maven中settings的两个配置&#xff1a;添加<server/>&#xff08;不必需项&#xff09…

哈夫曼编码

哈夫曼编码 基本介绍 赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding)&#xff0c;又称霍夫曼编码&#xff0c;是一种编码方式, 属于一种程序算法赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%&#xff5e;90%之…

Variable used in lambda expression should be final or effectively final

场景描述 我们在使用Java8 lambda表达式的时候时不时会遇到这样的编译报错&#xff1a; 这句话的意思是&#xff0c;lambda 表达式中使用的变量应该是 final 或者有效的 final&#xff0c;为什么会有这种规定&#xff1f; 匿名类中的局部变量 其实在 Java 8 之前&#xff0…