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

这篇具有很好参考价值的文章主要介绍了汇编实现LED循环点亮(延时子程序模板)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在单片机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 电源相接。电路原理图如下:

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

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

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

程序设计

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

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

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

汇编代码如下:

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循环点亮(延时子程序模板)

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

 


仿真结果

汇编实现LED循环点亮(延时子程序模板)文章来源地址https://www.toymoban.com/news/detail-435616.html

到了这里,关于汇编实现LED循环点亮(延时子程序模板)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式_常见延时方式的差异与选择(for循环延时、定时器延时、汇编延时....)

    这里整理几种常见的延时方式,并做简单测试供大家参考,如果有什么不对的地方,欢迎指正,共同探讨。 测试基于GD32F103CBT6硬件平台,标准的72MHz系统时钟, 使用标准库GD32F10x_Firmware_Library_V1.0.0 提示:(提示:此库坑多、慎用!) 测试方法为: 1:在Debug模式下延时开始于

    2024年02月02日
    浏览(84)
  • 单片机汇编延时程序算法详解

    在单片机编程中,延时程序是一项常见的任务。它用于控制程序在执行期间暂停一段时间,以实现特定的时间延迟。延时程序在许多应用中都非常有用,例如控制LED的闪烁频率、定时器的计时等。本文将详细介绍单片机汇编语言中延时程序的算法,并提供相应的源代码。 延时

    2024年02月04日
    浏览(55)
  • 基于platform驱动模型实现LED灯点亮

    2024年02月06日
    浏览(45)
  • 汇编语言实现C51单片机点亮流水灯

    P0作输出口,接8只发光二极管,编写程序实现二极管循环点亮 二极管为共阳极连接时,即二极管正极已接通电源,单片机输出接阴极,所以单片机输出为低电平有效。 所以为实现二极管轮流点亮,单片机的输出应为:0FEH,0FDH,0FBH,....0FEH,每输出一种状态,需要延时0.1us. 最后在

    2024年02月06日
    浏览(56)
  • 51单片机点亮LED灯以及实现2盏LED灯的交替闪烁

    点亮LED灯,根据单片机原理图 将LED灯1和LED灯2介入单片机的口设为低电平即可 代码如下: #include “reg52.h” sbit led1= P3^7; void main() { led1 = 0;//给led1一个低电平,点亮 } 结果图: 图中有一盏LED灯为我这个51单片机自带的电源接通灯,被代码点亮的只有一盏 实现2盏LED灯的交替闪烁

    2024年02月07日
    浏览(38)
  • STM32——led灯的点亮+闪烁+流水灯的实现

    1.原理 其方式有两种一种是寄存器方式一种是库函数方式,但其原理都是一样的。如原理图所示,与LED相连接的IO口置低电平即可点亮led灯 2.寄存器方式–代码 3.库函数–代码 (1)led.c:函数led_config() (2)main.c调用led_config 4.结果展示 原理:让连接的IO口先置零再置1可以使其先亮

    2024年02月08日
    浏览(52)
  • 嵌入式-stm32-用PWM点亮LED实现呼吸灯

    答:LED需要低电平才能亮,高电平是灯灭。 答:这是用到不同占空比来实现的,控制LED实现呼吸灯,就是通过占空比的高低电平和其持续时间来实现。 ①例如,要定时500ms,则:PSC=7199,ARR=4999,Tclk=72Mhz。 ②假如频率为 2kHz ,则:PSC=71,ARR=499, 频率和周期是描述波形的两个基

    2024年02月03日
    浏览(94)
  • 【蓝桥杯嵌入式】点亮LED灯,流水灯的原理图解析与代码实现——STM32

    🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 -  蓝桥杯嵌入式_勾栏听曲_0的博客 🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️ 📌个人主

    2024年02月03日
    浏览(48)
  • 学习笔记|LED点亮原理|STC32G单片机视频开发教程(冲哥)|第四集-下:点亮LED

    新建工程时待选择的Device:如 STC32G12K128 Seies,需要先在下拉菜单中选择“STC MCU Database”,然后可以选择STC32G12K128 Seies了。 当前以上节课的代码为基础,经过精简后的代码(裸板未添加任何头文件): 需手工下载至开发板(屠龙刀三.1版)。 当前已实现功能:点亮P2^1端口的板

    2024年02月13日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包