跳转指令 循环指令 跑马灯为例使用

合集下载

单片机的跑马灯简单汇编程序

单片机的跑马灯简单汇编程序

单片机的跑马灯简单汇编程序使用取反(CPL)实现跑马灯的闪烁,随后给P0 口赋值实现移动。

注;使用的是12MHZ 频率,ORG 0000H LJMP LOOP1 ORG 0030H LOOP1: MOV A,#11111111B clr p1.4 ;打开使能MOV R1,#5 ;闪烁5 次LOOP: CPL A ;取反MOV P0 , A ;输出ACALL DEL CPL A MOV P0 , A ACALL DEL DJNZ R1 , LOOP ;减一非零判断MOV P0,#11100111B ACALL DEL MOV P0,#11011011B ACALL DEL MOV P0,#10111101B ACALL DEL MOV P0,#01111110B ACALL DEL LJMP LOOP1 LOOP3: ACALL DEL SJMP LOOP1 DEL: MOV R5,#6H ;延时子程序部分F3: MOV R6,#0FFH ;BCD 码为255 F2: MOV R7,#0FFH ;总延时为0.7803s F1: DJNZ R7,F1 DJNZ R6,F2 DJNZ R5,F3 RET END 带C 循环做移动,使用一条跳转转移指令就可实现一直循环下去,延时为1.3s!ORG 0000H SJMP BEGAIN ORG 0030H BEGAIN: MOV P0, #0FFH ;初始状态clr p1.4 ;打开led 使能mov P2, #00110101B ; 锁存2 个74hc573,防止数码管点阵干扰.MAIN : CLR A MOV A ,#11111110B ; 0FEH LOOP: RLC A MOV P0 , A ACALL DEL LJMP LOOP DEL: MOV R5,#10H F3: MOV R6,#0FFH F2: MOV R7,#0FFH F1: DJNZ R7,F1 DJNZ R6,F2 DJNZ R5,F3 RET ENDtips:感谢大家的阅读,本文由我司收集整编。

实训六、循环指令、跳转指令、顺控继电器(SCR)指令应用

实训六、循环指令、跳转指令、顺控继电器(SCR)指令应用

课题实训六、循环指令、跳转指令、顺控继电器(SCR)指令应用6课时教学要求知识目标能力目标情感目标教材分析重点难点教具与设备教法教授法、演示法、实验法板书设计教学内容复习:定时器有哪些?增减计数器指令的应用?字、字节、双数、实数是什么?新课教学:(一)循环指令基本知识1.循环指令格式及功能西门子S7-200 PLC循环制指令用于控制一段程序的重复执行。

它是由FOR和NEXT两部分指令构成循环体系。

FOR/NEXT必须成对使用。

循环其格式及功能如下表。

梯形图参数功能 指令功能EN 使能位 当EN 使能有效时,自动将各参数复位,循环体开始执行,执行到NEXT 指令时返回。

每执行一次循环体,当前计数器INDX 增1,达到终值FINAL ,循环结束。

INDX 当前循环次数 INIT 初始值 FINAL 终止值 ENO 电流输出循环返回,循环体结束指令FOR 和NEXT 指令可以描述需重复进行一定次数的循环体。

每条FOR 指令必须对应一条NEXT 指令。

FOR 和NEXT 指令执行FOR 指令和NEXT 指令之间的指令。

必须指定计数值或者当前循环次数INDX 、初始值(INIT )和终止值(FINAL )。

如果允许FOR/NEXT 循环,除非在循环内部修改了终值,循环体就一直循环执行直到循环结束。

当FOR/NEXT 循环执行的过程中可以修改这些值。

当循环再次允许时,它把初始值拷贝到INDX 中(当前循环次数)。

如果初值大于终值,那么循环体不被执行。

每执行一次循环体,当前计数值增加1,并且将其结果同终值作比较,如果大于终值,那么终止循环2. FOR-NEXT 指令的有效操作数输入/输出 数据类型 操作数INDXINTIW 、QW 、VW 、MW 、SMW 、SW 、T 、C 、LW 、AC 、*VD 、*LD 、*AC INIT 、FINAL INTVW 、IW 、QW 、MW 、SMW 、SW 、T 、C 、LW 、AC 、AIW 、*VD 、*AC 、常数3. 循环指令应用示例网络1当输入I0.0为“1”时执行循环,INDX 从1开始计数。

汇编语言实现led灯的跑马灯

汇编语言实现led灯的跑马灯

汇编语⾔实现led灯的跑马灯led实验1.看原理图看设备⼯作的原理(可能需要阅读芯⽚⼿册),看设备与cpu的连接关系GPIO具有输⼊输出功能。

输⼊:cpu想知道io引脚是⾼电平还是低电平那么就是输⼊⽅式输出:cpu想控制io引脚为⾼电平还是低电平那么就是输出⽅式跟电流的⽅向没有任何关系2. cpu的相关章节GPJ2CON control是配置这个引脚是什么功能GPJ2有8个引脚,每个引脚由con寄存器中的4个位进⾏配置GPJ2DAT 如果cpu要输出⾼电平或者低电平,就需要设置该寄存器,只有8位有效When the port is configured as input port, the correspondingbit is the pin state. When the port is configured as outputport, the pin state is the same as the corresponding bit.When the port is configured as functional pin, the undefinedvalue will be read.当配置为输⼊模式的时候,dat寄存器中的某⼀位的值由引脚设置,引脚是⾼电平是,对应的位为1,引脚为低电平时,对应的位为0当配置为输出模式的时候,dat寄存器中的某⼀位控制引脚的电平,对应的位为1时,对应的引脚输出⾼电平,对应的位为0时,对应的引脚输出为低电平其他功能模式时,读到的值是未定义的。

@gec210 light first led.globl _start_start:ldr r0,=0xe0200280mov r1,#1<<4str r1,[r0] @config pin0 output modemov r1,#0str r1,[r0,#4] @output low levelb . @same as while(1);arm-linux-gcc -c led.S -o led.o //编译不链接arm-linux-ld -Ttext 0x30008000 led.o -o led.elf //链接指定代码段起始位置arm-linux-objcopy -O binary led.elf led.bin //⽣成⼆进制执⾏⽂件arm-linux-objdump -D led.elf > led.dis //⽣成反汇编代码uboot的⼏个常⽤命令printenv 打印显⽰环境变量ipaddr=192.168.1.4 //开发板的ipserverip=192.168.1.2 //tftp服务器的ip设置为各⾃的ip,只是设置到内存,掉电就没有setenv ipaddr 192.168.1.xsetenv serverip 192.168.1.xsaveenv //保存到flash中,再次启动后为刚刚设置的值ping //单向的,只能从开发板ping电脑alive表⽰⽹络是通的,not alive表⽰⽹络不通tftp 30008000 led.bin //下载⼆进制⽂件到内存0x30008000地址go 30008000 //跳转到0x30008000运⾏程序@gec210 light first led.globl _start_start:ldr r0,=0xe0200280ldr r1,=(1<<0 | 1<<4 | 1<<8 | 1<<12)str r1,[r0] @config pin0-pin3 output modemov r1,#0str r1,[r0,#4] @output low levelb . @same as while(1);简单的makefileAPP=led$(APP).bin:$(APP).oarm-linux-ld -Ttext 0x30008000 $^ -o $(APP).elf arm-linux-objcopy -O binary $(APP).elf $@ arm-linux-objdump -D $(APP).elf > $(APP).dis cp $@ /home/gec/tftp/%.o:%.sarm-linux-gcc $^ -c -o $@%.o:%.Sarm-linux-gcc $^ -c -o $@%.o:%.carm-linux-gcc $^ -c -o $@clean:@rm -f $(APP).bin $(APP).elf $(APP).dis *.o四个灯同时点亮或者同时熄灭循环闪烁@gec210 light first led.globl _start_start:ldr r0,=0xe0200280ldr r1,=(1<<0 | 1<<4 | 1<<8 | 1<<12)str r1,[r0] @config pin0-pin3 output mode loop:mov r1,#0str r1,[r0,#4] @output low levelbl delaymov r1,#0xfstr r1,[r0,#4]bl delayb loopb . @same as while(1);delay:mov r4,#0xff00000delay1:subs r4,r4,#1bne delay1mov pc,lr#define GPJ2CON (unsigned long *)0xe0200280unsigned long *p = (unsigned long *)0xe0200280;p练习:第1个灯到第4个灯依次点亮,第4个灯到第1个灯依次熄灭,循环。

单片机汇编语言跑马灯

单片机汇编语言跑马灯

实验一跑马灯-亮灯左移右移循环黄天佑 20132301155一、实验目的1、进一步熟悉keil C仿真软件及单片机实验板的使用。

2、了解并熟悉单片机I/O口和LED灯的电路结构,学会构建简单的流水灯电路。

3、掌握应用KEIL软件编辑、编译源汇编程序的操作方法。

4、了解单片机汇编语言程序的设计和调试方法。

二、实验原理1、实验板硬件电路图2、单片机流水灯程序设计(1)流水灯程序设计思路及程序流程。

实现流水灯的方法有很多,这里介绍一种。

(2)产生流水灯效果程序(逐条程序加注释)start:mov R0,#8 ;设置左移8次mov A,#0FEH;存入开始亮灯的位置LOOP: mov P0,A;传送P0并输出ACALL DELAY;调用延时程序RL A;左移1位DJNZ R0,LOOP;判断移送次数mov R1,#8;设置右移8次LOOP1:RR A;右移1位mov P0,A;传送到P0口并输出ACALL DELAY;调用延时程序DJNZ R1,LOOP1;判断右移次数JMP start;重新设定显示DELAY: mov R5,#10;延时0.1s子程序D1: mov R6,#100;D2:mov R7,#100;DJNZ R7,$;DJNZ R6,D2;DJNZ R5,D1;RET;子程序返回END;程序结束三、实验步骤及调试过程1、汇编语言程序的编写与调试(1)新建一个工程(2)保存文件,设一个文件名(3)找到对应单片机的芯片,这里我们选AT89C51即可接着我们新建一个文本写程序(1)(2)保存文件名,注意文件名的后缀应该为.asm(汇编语言程序的格式)接着把我们的文本导入到工程里面去:(1)(2)点击Add,再Close即可2.汇编语言程序编译及下载(1)这里要设置一个输出.hex文件(2)点击生成工程相应的文件同时可以观察下面的结果:0 Error(s),即可。

3.程序下载考入单片机(1)打开STC-ISP软件,选择对应的单片机型号,(2)点击打开程序,选择写好的.hex文件,(3)选择对应的端口COM3,再点击“Download下载”,同时按下单片机开关,即可。

循环跳转及子程序应用指令

循环跳转及子程序应用指令

循环跳转及子程序应用指令循环跳转及子程序应用指令是计算机程序设计中的重要概念,主要用于实现程序的流程控制和模块化设计。

在下面的回答中,我将详细介绍循环跳转及子程序应用指令的定义、用途、实现方式和一些示例。

一、循环跳转的定义及用途循环跳转指的是在程序执行过程中,根据一定的条件或需要,跳转到指定的程序段或语句位置,实现程序的循环执行。

其主要用途有以下几个方面:1. 实现循环结构:循环跳转可以使程序段重复执行,实现循环结构,提高代码的复用性和效率。

通过循环跳转可以解决一些需要多次执行的问题,如计算1到100的累加和、打印乘法口诀表等。

2. 控制程序流程:通过循环跳转可以控制程序的流程,根据特定的条件来选择是否跳转和跳转到哪里。

在具体的应用中,可以根据业务需求来自定义循环判断条件,实现程序的灵活控制。

3. 处理异常情况:循环跳转还可以用于处理程序中的异常情况,当程序出现错误或异常时,可以通过循环跳转来进行错误处理,提高程序的稳定性。

二、循环跳转的实现方式及示例循环跳转可以通过不同的方式来实现,主要包括条件循环和计数循环两种方式。

1. 条件循环:条件循环是根据一定的条件来判断是否跳转的方式。

常见的条件循环控制指令有“IF-THEN”和“WHILE”等。

示例1:使用IF-THEN语句实现条件循环i = 1IF i <= 10 THENPRINT ii = i + 1GOTO 2END IF以上代码段通过设定条件变量i的初始值为1,并根据条件i小于等于10来判断是否跳转。

若满足条件,则输出i的值并将i自增1后再跳转到语句2,否则结束程序。

2. 计数循环:计数循环是通过指定循环次数来实现的方式。

常见的计数循环控制指令有“FOR”和“DO-WHILE”等。

示例2:使用FOR循环语句实现计数循环FOR i = 1 TO 10PRINT iNEXT i以上代码段通过设定循环计数变量i的初始值为1,循环次数为10,通过FOR 循环语句来实现循环。

单片机指令的循环和跳转控制

单片机指令的循环和跳转控制

单片机指令的循环和跳转控制循环和跳转控制是单片机编程中非常重要的概念和技巧。

通过合理使用循环结构和跳转指令,我们可以实现程序的流程控制和条件判断,从而使单片机能够按照我们的设计完成各种任务。

本文将介绍单片机指令中循环和跳转控制的相关知识和应用。

一、循环控制在编写单片机程序时,经常需要重复执行某段代码,这就用到了循环控制。

循环控制的实现依赖于"循环指令",常见的循环指令有"循环"、"重复"、"计数循环"等。

这些指令的作用是使程序在满足条件的情况下重复执行一段代码块,直到条件不满足时退出循环。

例如,我们想实现一个程序,让LED灯循环闪烁5次。

可以使用如下的代码:```MOV R0, #0 ;将寄存器R0清零,用于计数LOOP:SETB P1.0 ;点亮LED灯ACALL DELAY ;延时一段时间CLR P1.0 ;熄灭LED灯ACALL DELAY ;延时一段时间INC R0 ;计数器自增CJNE R0, #5, LOOP ;如果R0不等于5,则跳转到LOOP标记处;循环结束,执行其他代码```上述代码使用循环指令实现了重复执行LED灯点亮和熄灭的动作。

通过计数器R0的判断,当R0不等于5时跳转到LOOP标记处继续执行循环。

二、跳转控制跳转控制是单片机指令中另一个重要的概念,它指的是在程序执行过程中,根据条件或者需要,跳转到程序的其他位置执行。

跳转指令包括"无条件跳转"和"有条件跳转"两种形式。

1. 无条件跳转无条件跳转指令如"跳转"、"返回"等,它们的作用是直接跳转到指定的程序地址。

无条件跳转通常用于程序间的跳转、循环控制、子程序的调用和返回等。

例如,下面的代码实现了一个简单的函数调用:```MAIN:ACALL FUNC ;调用FUNC函数;执行其他代码FUNC:;函数体代码RET ;返回到调用FUNC函数的程序地址```在上述示例中,程序从MAIN标记处调用FUNC函数,然后执行FUNC函数的代码,最后通过RET指令返回到调用FUNC函数的程序地址继续执行。

51单片机8个跑马灯程序汇编设计思路

51单片机8个跑马灯程序汇编设计思路

【51单片机8个跑马灯程序汇编设计思路】1. 引言在嵌入式系统中,跑马灯程序是一个非常常见且基础的程序设计。

通过控制LED灯的亮灭顺序,实现灯光在一组灯中顺序轮流亮起的效果。

其中,51单片机是一种常用的嵌入式系统开发评台,本文将探讨如何通过汇编语言设计实现8个跑马灯程序的思路和方法。

2. 分析题目我们需要对题目进行细致的分析。

51单片机8个跑马灯程序要求我们设计并实现一个程序,能够控制8个LED灯依次轮流亮起的效果。

这意味着我们需要对LED灯进行控制,并且需要考虑如何实现循环、延时等功能。

3. LED灯控制在实现跑马灯程序时,首先需要考虑如何控制LED灯的亮灭。

一种常见的方法是通过I/O口控制LED灯的高低电平,从而实现灯的亮灭。

我们需要了解51单片机的I/O口控制方式,并结合LED灯的连接方式进行设计。

4. 循环控制跑马灯程序的核心在于实现LED灯的依次轮流亮起。

这就需要我们设计循环控制的程序结构。

在汇编语言中,可以通过跳转指令和计数器来实现循环效果,我们需要考虑如何设计循环的次数和顺序。

5. 延时控制为了让人眼能够观察到LED灯的亮灭效果,我们需要在程序中添加延时控制。

这需要我们了解51单片机的定时器控制和时钟频率,并根据LED灯的亮度要求设计合适的延时程序。

6. 汇编设计思路在进行汇编设计时,可以按照以下步骤进行:1)设置I/O口控制LED灯的引脚,确定LED的连接方式;2)设计循环控制结构,确定LED灯的顺序和次数;3)添加延时程序,控制LED灯亮灭的时间间隔;4)编写中断程序,处理定时器中断等事件;5)调试程序,验证跑马灯效果是否符合要求。

7. 个人观点和理解通过设计这个跑马灯程序,我深切体会到了汇编语言的精妙之处。

通过对硬件的直接控制和对程序结构的精心设计,我感受到了嵌入式系统开发中的乐趣和挑战。

而对于初学者来说,设计跑马灯程序也是一个很好的学习过程,可以加深对于51单片机结构和编程思想的理解。

西门子S7-200SMARTPLC循环走马灯如何编写

西门子S7-200SMARTPLC循环走马灯如何编写

西门子S7-200SMARTPLC循环走马灯如何编写
不知道大家有没有看过这样的一个场景,当我们夜晚走在大街上时看到的一幕幕万家灯火,灯红酒绿,灯火辉煌的霓虹灯,顿时心想:我什么时候能通过自己所学的PLC来使用灯光闪烁控制呢?
是的,本人也有感同身受,我第一次学习PLC,看到老师测试PLC 8位灯是否完好的时候,就用的循环走马灯,当时觉得哇塞!好神奇呀!很想搞明白这是什么原理,程序复杂嘛?等!各位大佬稍安勿躁,下面就为大家来详细介绍一下循环走马灯。

1
准备设备
1. 一台ST40 CPU
2. 一根网线
3. 若干导线及电源线
4. 一台电脑(台式笔记本)任意一台
5. 8个指示灯
2
编写程序
第一步:(在桌面点击STEP 7-MicroWIN SMART编程软件快捷方式并打开它)
第二步:(编写程序)
1.上电第一个扫描周期置位第一个位Q0.0(SM0.1+置位指令)
2.使用SM0.5(每0.5秒触发一次)+沿脉冲(上升沿P)+循环左移字节指令(ROL_B)QB0—QB0左移一位。

友情提醒:这里如果指令块或程序块不是很懂的话,可以鼠标点击要查看的指令块,按一下键盘上的F1键即可打开帮助查看详细信息。

3
演示效果
第一步:(把程序下载到PLC CPU中)
第二步:(监控程序,看实际设备是否在运行,这边只有照片没有视频,可能看不到实际的效果,不过PLC确实是在执行移位了)。

各位小伙伴们你们在实验的过程中可以在PLC 输出Q点接8个指示灯,这样看起来效果非常棒哦!
当你实验成果看到实际效果的时候,那感觉真的是非常棒的,感觉特别有成就感,瞬间兴趣就来了。

来源:PLC发烧友,作者:徐陈爽。

汇编语言跳转指令

汇编语言跳转指令

汇编语言跳转指令在计算机编程中,汇编语言是与机器语言最接近的一种编程语言,它使用助记符来表示指令和数据,通过编写汇编语言程序可以直接操控计算机的底层硬件。

在汇编语言中,跳转指令是非常重要的一种指令,它用于修改程序的执行流程,实现程序的控制和逻辑跳转。

本文将介绍汇编语言中常见的跳转指令及其使用方法。

一、无条件跳转指令1. JMP(跳转)指令JMP指令用于无条件地跳转到指定的目标地址。

它可以直接跳转到一个标签或者给出一个绝对地址作为跳转目标。

下面是JMP指令的语法格式:JMP 目标地址例如,要跳转到标签"LOOP"所在的位置,可以使用以下指令:JMP LOOP2. JC(进位跳转)指令JC指令用于判断运算结果是否产生了进位,并根据判断结果进行跳转。

如果进位标志位CF被设置为1,则跳转到指定的目标地址;否则,继续顺序执行下一条指令。

下面是JC指令的语法格式:JC 目标地址例如,要在进位发生时跳转到标签"OVERFLOW"所在的位置,可以使用以下指令:JC OVERFLOW二、条件跳转指令条件跳转指令用于根据特定条件是否满足来进行跳转。

常用的条件跳转指令有以下几种:1. JE/JZ(等于/零)指令JE/JZ指令用于判断两个数是否相等或某个操作数是否为零,并根据判断结果进行跳转。

如果条件满足,则跳转到指定的目标地址;否则,继续顺序执行下一条指令。

下面是JE/JZ指令的语法格式:JE/JZ 目标地址例如,要在相等时跳转到标签"EQUAL"所在的位置,可以使用以下指令:JE EQUAL2. JNE/JNZ(不等于/非零)指令JNE/JNZ指令用于判断两个数是否不相等或某个操作数是否非零,并根据判断结果进行跳转。

如果条件满足,则跳转到指定的目标地址;否则,继续顺序执行下一条指令。

下面是JNE/JNZ指令的语法格式:JNE/JNZ 目标地址例如,要在不相等时跳转到标签"UNEQUAL"所在的位置,可以使用以下指令:JNZ UNEQUAL3. JA/JNBE(大于/不低于)指令JA/JNBE指令用于比较两个数的大小关系,并根据判断结果进行跳转。

花式跑马灯汇编语言

花式跑马灯汇编语言

花式跑马灯汇编语言一、引言花式跑马灯是一种以灯光为媒介,通过不同的变化方式展示出各种图案和文字的装饰性效果。

在汇编语言中,我们可以使用特定的指令和技巧来实现花式跑马灯效果,从而给人一种炫目的视觉体验。

二、实现思路为了实现花式跑马灯效果,我们需要控制灯光的亮灭和变化,以展示出不同的图案和文字。

在汇编语言中,我们可以通过操作特定的寄存器和端口来控制灯光的状态。

我们需要定义一个存储灯光状态的变量,用来保存当前灯光的亮灭情况。

然后,我们可以使用循环结构来不断改变灯光的状态,从而实现灯光的闪烁效果。

三、具体实现1. 定义变量我们可以使用汇编语言中的数据段来定义一个变量,用来保存灯光的状态。

例如,我们可以定义一个字节变量“light”,用来表示灯光的亮灭状态,其中1表示亮,0表示灭。

2. 控制灯光为了控制灯光的状态,我们可以使用汇编语言中的端口操作指令来向特定的端口发送信号。

例如,我们可以使用OUT指令将灯光状态写入到特定的端口,从而控制灯光的亮灭。

3. 循环控制为了实现花式跑马灯效果,我们需要使用循环结构来不断改变灯光的状态。

例如,我们可以使用汇编语言中的循环指令来控制灯光的闪烁次数和速度,从而实现不同的效果。

四、示例代码下面是一个简单的示例代码,用来实现一个基本的花式跑马灯效果:```assembly.datalight db 1.codemain:mov ah, 0x0E ; 设置光标位置mov al, 'A' ; 设置要显示的字符int 0x10 ; 调用BIOS中断显示字符mov al, lightout 0x80, al ; 控制灯光状态xor al, 1 ; 取反灯光状态mov light, aljmp main ; 循环控制end main```五、总结通过使用汇编语言的指令和技巧,我们可以实现各种花式跑马灯效果。

通过控制灯光的亮灭和变化,我们可以展示出不同的图案和文字,从而给人一种炫目的视觉体验。

任务9 用自制的跑马灯电路实现8只LED循环点亮

任务9  用自制的跑马灯电路实现8只LED循环点亮

• 出栈指令格式为:POP direct ;(direct)←(SP) • • ;SP←SP-1 该指令执行时先将SP所指单元数据弹出至direct所指的地址单元, 然后SP减1指向新的栈顶单元地址。
• •
4)子程序调用指令 ) 子程序调用指令的功能调用子程序,执行时先将断点地址(调用 指令的下一条指令的首地址)压入堆栈区,然后将子程序的首地址送 PC,执行子程序。 (1)长调用指令LCALL addr16 ;PC←PC+3 ;SP←SP+1 ;(SP)←PC7-0 ;SP←SP+1 ;(SP)←PC15-8 ; PC←addr16
执行该指令时,先将PC+2得到下一条指令的16位首地址,并将其压入堆栈, 最后子程序标号所在的子程序入口地址送给PC,CPU转入子程序执行。由于短 调用指令中的PC高5位地址不变,所以其转移的范围为2KB。
任务9 用自制的跑马灯电路实现8只 任务 用自制的跑马灯电路实现 只LED循环点亮 循环点亮 程序分析讲解
任务9 用自制的跑马灯电路实现8只 任务 用自制的跑马灯电路实现 只LED循环点亮 循环点亮
9.1.3 跟我学 1)减1不为零循环转移指令 ) 不为零循环转移指令DJNZ 不为零循环转移指令 DJNZ Rn,rel ;PC←PC+2,Rn←(Rn)-1,若(Rn)≠0,则PC←PC+rel DJNZ direct,rel ;PC←PC+2, direct←(direct)-1,若(direct)≠0,则 PC←PC+rel; 每执行一次循环转移指令,第一操作数(Rn或direct中的数)减1,并 保存,若减1后结果不为零,则转移至目的地(标号处);若减1后结果为零, 则程序按顺序执行下一条指令。

跑马灯C语言程序

跑马灯C语言程序

跑马灯C语言程序在C语言中,跑马灯(Marquee)是一种在控制台或者命令行界面上实现文本滚动的效果。

跑马灯的实现可以使用循环迭代输出字符串的方案,每次输出完一个字符串后,将其从尾部剪切一个字符,然后再将其插入到字符串的首部。

这样不断循环,就能实现字符的滚动效果。

下面是一个简单的跑马灯程序的示例:```c#include <stdio.h>#include <string.h>#include <ctype.h>#include <unistd.h>#define WIDTH 40 // 控制台窗口宽度#define DELAY 200000 // 滚动速度(微秒)for (i = 0; ; i++) {// 输出字符串的截取部分for (j = i % len; j < WIDTH && j < i % len + len; j++) {putchar(pstr[j % len]);}// 输出空格使得字符串在窗口中滚动for ( ; j < WIDTH; j++) {putchar(' ');}putchar('\r');fflush(stdout); // 刷新输出缓存usleep(DELAY); // 暂停一段时间}return 0;}```程序中使用的usleep(DELAY)函数可以让程序在滚动过程中暂停一段时间,以控制滚动速度。

该函数接受一个以微秒为单位的参数,表示暂停的时间长度,其中1秒=1000000微秒。

在while循环内部,程序首先输出跑马灯字符串的一部分,然后输出一些空格,使得字符串向前滚动。

这里注意,当字符串的尾部超出了窗口的宽度时,需要从字符串的起始位置继续输出,因此要对输出字符的下标取模运算。

另外,程序中使用了Windows控制台的回车(CR)特性,即使用putchar('\r')输出CR字符可以让光标回到本行的开头,然后再输出下一次循环迭代的字符。

11.2 跑马灯控制程序设计

11.2 跑马灯控制程序设计
厦电气门控大制学实物践理训与练M机O电OC工课程程学团院队
二、跑马灯控制程序设计 结合顺序控制设计法来设计跑马灯控制程序。
首先来看一下该任务的控制要求: 要求通过启动按钮SB1使得8盏灯按照L0、L1~L7的 顺序亮,每隔1S亮一盏灯;再按L7、L6~L1、L0的 顺序灭,每隔1S灭一盏灯;如此循环,直至按下停 止按钮SB2,全部灯熄灭,停止工作。
下面我们按步来看一下程序的编写: (2)S1步:S1步是起始步,表示程序开始运行,满足 转换条件SB1可以进入S2步。SB1为启动按钮I0.0,按 下后程序开始运行,S2步激活。我们使用M0.0来指示 启停状态,M0.0为1表示启动,M0.0为0表示停止。这 段程序比较简单,使用置位线圈指令,当I0.0按下, 使M0.0置位为1。
厦电气门控大制学实物践理训与练M机O电OC工课程程学团院队
(4)S3步和S4步
S3步负责控制左移,S4步负责控制右移,这两步 是密切相关的。由于操作对象是MW20,是一个字的存 储空间,所以我们要选择字的移位指令。如图蓝色圈 中所示,使用移位脉冲T1,T1每1S产生一个下降沿, 检测这个下降沿使移位指令产生移位。如图红色圈中 所示,在写入初值后,一次移一位,先左移,就会看 到MB20的各个位,从M20.0至M20.7依次变1;等M20.7 变1了,再右移,一次移一位,就会看到MB20的各个 位,从M20.7至M20.0依次变0。
厦电气门控大制学实物践理训与练M机O电OC工课程程学团院队
第二项工作是为移位对象写入初值,有的同学要 问了,移位对象不是输出Q0.0至Q0.7吗?应该这么说 ,控制Q0.0至Q0.7是我们的目的,怎么来达到这个目 的呢?为了避免直接控制输出所带来的误操作,我们 要使用一个中间存储空间MW20来作为移位对象,将移 位后的结果通过MB20来传送到QB0。我们来看看这个 MW20的空间,MW20包含MB20和MB21两个字节,给这个 空间填入初值W#16#FF,这时MB20的各个位为0,MB21 的各个位为1。

单片机指令的循环控制与跳转指令

单片机指令的循环控制与跳转指令

单片机指令的循环控制与跳转指令单片机指令的循环控制与跳转指令是在单片机程序设计中非常重要的一部分。

通过使用循环控制指令,可以实现程序的循环执行,从而提高程序的效率和灵活性。

而跳转指令则可以改变程序的执行顺序,实现条件判断和跳转至指定位置的功能。

本文将详细介绍单片机指令的循环控制与跳转指令的分类及使用方法。

一、循环控制指令循环控制指令主要通过设置计数器或判断条件是否满足来实现程序的循环执行。

常用的循环控制指令有:循环计数指令、循环条件判断指令和循环控制指令。

1. 循环计数指令循环计数指令是通过设置计数器来实现循环执行的,其中最常用的指令是“循环次数”指令。

这种指令会将一个寄存器初始化为一个初始值,并在每次循环执行时,自动将该寄存器的值减1,直到该寄存器的值为0时,跳出循环。

例如,在8051单片机中,循环计数指令可以使用“DJNZ”(Decrement and Jump if Not Zero)指令来实现。

具体语法为:DJNZ A, label其中,A为一个寄存器,初始值为循环次数。

label是跳转的目标地址,即循环体的开始地址。

每次循环执行时,A的值会自动减1,并判断是否为0,如果不为0,则跳转至label位置继续执行,否则跳出循环。

2. 循环条件判断指令循环条件判断指令是通过判断一个条件是否成立来控制循环执行的。

常见的循环条件判断指令有“JZ”(Jump if Zero)和“JNZ”(Jump if Not Zero)指令。

“JZ”指令用于判断一个寄存器或内存单元的值是否为0,如果为0,则跳转至指定地址继续执行;如果不为0,则程序继续顺序执行。

“JNZ”指令则与之相反,用于判断一个寄存器或内存单元的值是否不为0,如果不为0,则跳转至指定地址继续执行;如果为0,则程序继续顺序执行。

3. 循环控制指令除了通过计数和条件判断来控制循环执行外,还可以使用循环控制指令来实现循环执行的控制。

8051单片机中常用的循环控制指令有“CJNE”(Compare and Jump if Not Equal)指令和“JC”(Jump if Carry)指令。

跑马灯代码大全

跑马灯代码大全

跑马灯代码大全实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入“<marquee>滚动的文字</marquee>”语句,它的效果如下所示:适当的运用<marquee>标签的参数,可以表现出不同的效果,请看下面的几个例子:1、左右弹来弹去的跑马灯实现的方法就是在IE的标签上稍微多加了几个参数产生了更加丰富的变化。

设置behavior=alternate表示双向移动,direction= left 表示运动方向向左。

marquee的宽度可以使用绝对象素值,例如width=200等这个值限定了跑马灯滚动的范围。

需要说明的是该效果在 Netscape下是看不到的。

源码粘贴框:<marquee width=400 behavior=alternate direction=left align=middle>弹来弹去跑马灯!</marquee>2、跑的很快的跑马灯只要在<marquee>标签后面加上“scrollamount=15”即可,修改=后边的数字参数即可限制文字移动的速度。

3、带有超级链接的跑马灯实现的方法很简单,把整个<marquee></marquee>语句包含在超链接中就行,你看看下面的代码就清楚了。

当然你也可以把包含在<marquee></marquee>中的各条内容分别加上不同的链接,这样的跑马灯就可用来发布滚动新闻或是做站点导航了。

如果你想给跑马灯的文字加上颜色,换用不同的字体(默认是宋体,换体就要加代码),只要在文字前加上<FONT face=楷体_GB2312 color=#ff0000 size=3>就行了,你可在“face=”后边换上你喜欢的字体,在“color=”后边换上你喜欢的字颜色,在“size=”后边换上适合的字号,如果想让字体加粗,就再加上<STRONG>。

PLC控制——跑马灯

PLC控制——跑马灯

实验题目:跑马灯1、实验目的及要求实验目的:用PLC构成跑马灯系统控制要求:要求通过启动按钮SB1使得8盏灯按照L0、L1~L7的顺序亮,每隔1S亮一盏灯;再按L7、L6~L1、L0的顺序灭,每隔1S灭一盏灯;如此循环,直至按下停止按钮SB2,全部灯熄灭,停止工作。

I/O分配表:输入输出启动按钮I0.0L0Q0.0停止按钮I0.1L1Q0.1L2Q0.2L3Q0.3L4Q0.4L5Q0.5L6Q0.6L7Q0.72、实验环境(使用的软硬件)PC机,博图软件3、实验原理(1)移位指令移位指令包括无符号数移位和有符号数移位。

其中无符号数移位包含字左移指令、字右移指令、双字左移指令和双字右移指令;有符号数移位包含整数右移指令和双整数右移指令。

*无符号数移位指令。

1字左移指令当允许输入EN位为高电平“1”时,将执行字左移指令,将IN端指定的内容送入累加器1低字中,并左移N端指定的位数,然后写入OUT端指定的地址中。

②字右移指令当允许输入EN的状态为“1”时,将执行字右移指令。

(2)顺序控制设计法所谓顺序控制,就是按照生产工艺预先规定的顺序,在各个输入信号作用下根据内部状态和时间的顺序,在生产过程中各个执行机构自动地有秩序的进行操作。

一般使用顺序控制设计法,都要画出顺序功能图,顺序功能图的结构有单序列、选择序列和并行序列。

单序列没有分支与合并,选择序列的分支不能同时激活,而并行序列的分支可以同时激活。

顺序功能图的组成元素:4、方案设计(程序流程图)5、程序代码6、实验结果(PLCSIM仿真结果)1、按下起动按钮,跑马灯按照顺序点亮;……………………………………………………经过一段时间全部点亮然后跑马灯按照顺序熄灭……………………………………………………经过一段时间全部熄灭然后又重新按照顺序循环点亮:2、按下停止按钮,系统停止运行:7、实验总结1.通过使用顺序功能图可以找出程序的主体流程,实现主体功能,并利用一些程序来帮助完成所有功能;2.通过本次实验,我熟练使用移位功能。

微信小程序实现走马灯效果实例

微信小程序实现走马灯效果实例

微信⼩程序实现⾛马灯效果实例前⾔⽇常开发中,我们经常会遇到⽂字横向循环滚动的效果,俗称⾛马灯,也是项⽬中经常会使⽤的⼀个功能。

在⽹页web前端很常见,今天就介绍下⼩程序的实现⽅式,⼀种是⽤的css样式实现,另⼀种是运⽤⼩程序的动画功能实现。

@keyframes 实现利⽤@keyframes的规则来实现,⾮常⽅便,只需要css样式就可以满⾜,使⽤⽅法跟web上⼀样。

<view class="marquee"><text>这是⼀段滚动的⽂字</text></view>样式类,from to 来定义动画的开始结束,这⾥是从屏幕最右端向左滑,触及到最左侧后重新开始新⼀轮动画。

@keyframes translation {from {margin-left: 750rpx; //从屏幕最右端开始}to {margin-left: 0px;}}.marquee{white-space: nowrap;animation-name: translation; //定义动画的名称animation-duration: 3s;animation-iteration-count: infinite;animation-timing-function: linear;}如果想要的效果是滑动到左侧之后,⽂字继续左滑,直到全部消失,再从最右开始动画的,那么就需要再加上⽂字的长度,这⾥需要去计算⽂字的长度,使⽤SelectorQuery 对象实例来拿到⽂字节点的宽度。

在页⾯⾸次渲染完毕onReady时执⾏,查询到对应⽂字节点信息的对象,得到⽂字的长度。

这⾥定义的是上⾯的marquee类名。

onReady: function () {let query = wx.createSelectorQuery();query.select('.marquee').boundingClientRect();query.exec((res) => {if (res[0]) {this.setData({marqueeWidth: res[0].width})}})}然后使⽤css var() 函数插⼊定义的属性值,到结束的位置处,让它⾛完整个屏幕以及⾃⾝⽂字的长度。

单片机跑马灯程序

单片机跑马灯程序

单片机跑马灯程序*******************************************************************;此程序是用单片机的p1 口接八个led 灯作跑马灯试验,八个led 依次亮了又熄灭,形成漂亮;的跑马灯。

本人已经试验成功。

;单片机教程网51hei 原创;该8 路单片机跑马灯程序代码简单,电路也容易搭建,只需把led 接在p1 口上就可以了,希望大家能试验成功顺利的完成跑马灯报告;****************************************** *************************org 0000hajmp start;跳转到程序开始org 0030h;定义起始汇编地址start:mova,#0ffh ;clr c ;mov r2,#08h ;循环八次。

loop: rlc a ;带进位左移。

mov p1,a ;此时led 灯开始有反映了。

call delay ;延时djnz r2,loop ;循环(djnz 条件判断)movr2,#07h ;loop1: rrc a ;带进位右移mov p1,a ;此时led 灯开始有反映了。

call delay ;延时djnz r2,loop1 ;反复循环jmp start ;回到程序的开头delay: mov r3,#20 ;延时子程序d1: mov r4,#20d2: mov r5,#248djnz r5,$djnzr4,d2 单片机论坛51hei/bbs/ 有更多的跑马灯流水灯试验---------3 路单片机跑马灯程序---------------------------------------ORG 0000HLJMPMAINORG 030HMAIN: MOV P1,#0DBH ;化为2 进制为11011011--0 状态时led灯亮ACALL DELay MOV P1,#06DH ;化为2 进制为01101101ACALL DELay;MOV P1,#0B6H ;化为2 进制为10110110ACALL DELayAJMP MAINdelay: movr7,#255d1: mov r6,#255d2: djnz r6,d2djnz r7,d1retendtips:感谢大家的阅读,本文由我司收集整编。

12行代码简单实现跑马灯文字匀速滚动

12行代码简单实现跑马灯文字匀速滚动

12⾏代码简单实现跑马灯⽂字匀速滚动jq实现跑马灯练⼿⼩demo你要的⽂字匀速滚动*{margin:0;padding:0;}.main{width: 400px;height:100px;margin:100px auto;position: relative;overflow: scroll;}.main ul{height:100px;position: absolute;left:0;top:0;white-space:nowrap; /*强制不换⾏*/display: inline-block;/*强制不换⾏,必须设为⾏内块*/background-color: blueviolet; overflow:hidden;}.main ul li{list-style:none;border: 1px solid ;box-sizing: border-box;margin: 10px;display: inline-block;/*强制不换⾏,必须设为⾏内块*/}<div class="main"><ul><li>我是内容我是内容我是内容我是内容1</li><li>我是内容我是内容我是内容我是内容2</li><li>我是内容我是内容我是内容我是内容3</li><li>我是内容我是内容我是内容我是内容4</li><li>我是内容我是内容我是内容我是内容55555</li></ul></div>//初始化定时器和滚动条if (timer) {$(".main")[0].scrollLeft = 0;clearInterval(timer)}$(".main ul").append($(".main ul").html());var ul_W = $(".main ul").outerWidth(true);var timer = setInterval(function(){if(ul_W/2 <= $(".main")[0].scrollLeft){ //如果滚动条离左边的距离到达 ul中间说明此时在视觉上,内容和最开始滚动时显⽰的内容⼀样 $(".main")[0].scrollLeft = 0; //所以将滚动条回归到最初始位置以此循环}$(".main")[0].scrollLeft++ ; //⽆论滚动到什么地⽅,滚动始终是不停的,所以是不停的加},20);拓展思考css部分:*{margin:0;padding:0;}.main{width: 400px;height:100px;margin:100px auto;position: relative;overflow: hidden;}.main ul{height:100px;position: absolute;left:0;top:0;}.main ul li{list-style:none;float: left;border: 1px solid ;box-sizing: border-box;}html部分:<div class="main"><ul><li>1</li><li>2</li><li class="tree"><div>3</div></li><li class="four">4</li><li>5</li></ul></div>js部分:jq左滚动://左滚动$(function(){$(".main ul").append($(".main ul").html());var ul_W = 0,left=0;$(".main ul li").each((i,dom)=>{ul_W += $(dom).outerWidth();})$(".main ul").width(ul_W);console.log(ul_W)setInterval(my_left,1);function my_left(){left -= 1;if(left <= -$(".main ul").outerWidth()/2){left = 0;}// $('.main ul').css('left',left+'px')$('.main ul').animate({'left':left},1);//使⽤animate 在setInterval的基础上再次延缓动画}});jq右滚动:$(function(){$(".main ul").append($(".main ul").html());var ul_W = 0;$(".main ul li").each((i,dom)=>{ul_W += $(dom).outerWidth();})left=-ul_W/2;$(".main ul").width(ul_W);$(".main ul").css({'left':left})setInterval(my_left,1);function my_left(){left += 1;if(left >= 0){left = -$(".main ul").outerWidth()/2;}$('.main ul').animate({'left':left},1);}});考虑如果可能存在拖拽跑马灯情况, 使⽤absolute 进⾏定位不太友好 , 也可使⽤scroll , ⽅便后续调试代码//左滚动$(function(){if (timer) {$(".main")[0].scrollLeft = 0;clearInterval(timer)}$(".main ul").append($(".main ul").html());var ul_W = 0;$(".main ul li").each((i,dom)=>{ul_W += $(dom).outerWidth();})$(".main ul").width(ul_W);console.log($(".main")[0].scrollLeft)var timer = setInterval(my_left,1);function my_left(){if($(".main ul").outerWidth()/2 - $(".main")[0].scrollLeft<= 0){$(".main")[0].scrollLeft -= $(".main ul").outerWidth()/2;}else {$(".main")[0].scrollLeft++}}});超级简单实现⽂字滚动css.wj-lunbo .ul-father{width: 10rem;height: 1rem;margin: 0 auto;overflow: hidden;}.wj-lunbo ul {padding: 0 .4rem; overflow:hidden; }.wj-lunbo ul li{height: .9rem;line-height: .9rem;display: block;margin-bottom: .4rem;color: #cb1124;font-size: .7rem;text-align: center;overflow: hidden;}html<div class="wj-lunbo"><div class="ul-father"><ul ><li>3500元裸钻抵⽤券</li><li>800元对戒抵⽤券</li><li>2990元定制西服第⼆套0元</li><li>免租伴娘服、妈妈装</li></ul></div></div>js// ⽂字滚动setInterval(() => {$('.ul-father').find("ul").animate({marginTop: "-1.3rem"}, 500, function () {// ⼀⾏滚动查找1⾏, 多⾏滚动查找多⾏$(this).css({ marginTop: "0" }).find("li:nth-child(1)").appendTo(this);})}, 2000);匀速上下滚动$('.gundong_father ul').append($('.gundong_father ul').html());setInterval(() => {var scrollTop = parseFloat($('.gundong_father')[0].scrollTop);if (scrollTop >= $('.gundong_father ul').outerHeight()/2+6) { //加6 是为了消除滚动条带来的顿挫感 , ⽤marginTop可以解决顿挫感 , 但考虑可能出现⽤户滑动操作 ,所以⽤scrollTop // $('.gundong_father ul').append($('.gundong_father ul li').slice(0, 3));scrollTop = 0}scrollTop++;$('.gundong_father')[0].scrollTop= scrollTop;}, 30);封装函数封装将其结合,函数html结构为 .main 宽⾼固定 overflow:scroll ul 宽⾼不定 , 但需要使⼦元素垂直或⽔平⽅向将其撑开 overflow:hidden li$(function(){function rollHandle(fatherCls,speed=20,delay=2000,direction,row){var timer=timer2=null,$child_Ul = $(fatherCls+' ul'),$container = $(fatherCls);$container.css({'overflow': 'scroll'})$child_Ul.css({'overflow': 'hidden'})var scrolldirection = direction=='top'? 'scrollTop' : 'scrollLeft';$child_Ul.append($child_Ul.html());var ul_W = direction=='top'?$child_Ul.outerHeight(true):$child_Ul.outerWidth(true);if( ul_W/2 < $container.innerHeight()) return ; //ul⾼度或宽度不够则不滚动function move(){timer = setInterval(function(){if(row && direction =='top'){$container.animate({scrollTop: $child_Ul.children('li').outerHeight(true)*row},500,function(){$(this).css({ scrollTop: "0" }).find("li:lt("+row+")").appendTo($child_Ul);})}else{$container[0][scrolldirection]++ ; //⽆论滚动条在什么地⽅,滚动始终是不停的}},speed);$container.scroll(function(){if( $container[0][scrolldirection] > ul_W/2){//滚动条离左边的距离到达 ul中间此时在视觉上,内容和最开始滚动时显⽰的内容⼀样$container[0][scrolldirection] = '0'; //将滚动条回归到最初始位置以此循环}})}move();$child_Ul.on("touchstart", function(e) {clearInterval(timer)clearInterval(timer2) //防抖});$child_Ul.on("touchend", function(e) {timer2 = setTimeout(move,delay)});}rollHandle(".main",10,2000,'top') //⽗级class 运动速率拖拽后延迟的时间是否垂直每次滚动的⾏数 rollHandle(".text_left",10,2000) //⽗级class 运动速率拖拽后延迟的时间是否垂直})封装为插件/**** @param {el} ⽗级节点选择器* @param {speed} 滚动速率默认20* @param {delay} 拖拽后的延时默认2000* @param {direction} 滚动⽅向默认横向滚动* @param {arollRow} 每次滚动的⾏数* @param {duration} 每次滚动的动画执⾏时间默认500* @param {drag} 是否禁⽌拖拽*/$(function () {$.fn.rollHandle = function (options) {let _obj = {speed: 20,delay: 2000,duration: 500,drag: false}let _options = Object.assign({}, _obj, options);const {speed,delay,direction,rollRow,duration} = _optionsvar timer = null,timer2 = null,$child_Ul = $(this).children('ul'),$container = $(this);$container.css({'overflow': 'scroll'})$child_Ul.css({'overflow': 'hidden'})var scrollDirection = direction == 'top' ? 'scrollTop' : 'scrollLeft';var ul_W = direction == 'top' ? $child_Ul.outerHeight(true) : $child_Ul.outerWidth(true);if (ul_W < $container.innerHeight()) return; //ul⾼度或宽度不够则不滚动$child_Ul.append($child_Ul.html());ul_W = direction == 'top' ? $child_Ul.outerHeight(true) : $child_Ul.outerWidth(true);function move() {timer = setInterval(function () {if (rollRow) {if (direction == 'top') {var roll_height = $container.find("li:nth-child(" + (rollRow + 1) + ")").offset().top - $container.find("li:nth-child(1)").offset().top; $container.animate({scrollTop: roll_height}, duration, function () {$(this).css({scrollTop: "0"}).find("li:lt(" + rollRow + ")").appendTo($child_Ul);})} else {var roll_w = $container.find("li:nth-child(" + (rollRow + 1) + ")").offset().left - $container.find("li:nth-child(1)").offset().left;$container.animate({scrollLeft: roll_w}, duration, function () {$container[0][scrollDirection] = '0';$container.find("li:lt(" + rollRow + ")").appendTo($child_Ul);})}} else {$container[0][scrollDirection]++;}}, speed);$container.scroll(function () {if ($container[0][scrollDirection] > ul_W / 2) {//滚动条离左边的距离到达 ul中间此时在视觉上,内容和最开始滚动时显⽰的内容⼀样$container[0][scrollDirection] = '0'; //将滚动条回归到最初始位置以此循环}})}move();if (drag) {$child_Ul.on('mousemove', function (e) {e.preventDefault();return false;});$child_Ul.on('touchmove', function (e) {e.preventDefault();return false;})} else {$child_Ul.on("touchstart", function (e) {clearInterval(timer)clearInterval(timer2) //防抖});$child_Ul.on("touchend", function (e) {timer2 = setTimeout(move, delay)});}}})注意点:- 横向滚动或者纵向滚动必须将⼦级`ul`宽⾼撑开**- ⼦元素需要隔开时使⽤padding,使⽤margin, 滚动到第⼀个字元素时会有闪动- main需要宽⾼...。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/club/bbs/post.aspx?a_id=881946&b_id=4
前段时间看到几个坛友问传说中跑马灯的故事!今晚刚好闲暇无事,也等于锻炼锻炼脑子,不至于生锈!就用绝对地址写了段代码,仿真测试通过!不知能否
满足楼主的要求。望大家多指正,有兴趣的朋友可以将其写成一个 FC,还是比较好玩的,呵呵.......
>R
JP OVER
OVER: L 1.000000e+002
跳转指令的正确使用
T #shuru_te
JU COMM
LESS: L 0.000000e+000
T #shuru_te
JU COMM
COMM: L #shuru_te
L 1.000000e+002
/R
L 2.764800e+004
*R
RND
L1
+I
L -1
+I
T #shuchu
A M 6.1 //跑马灯的启动标志位 M6.1=1 启动,M6.1=0 停止
L S5T#5S //★时间改小一点,跑马速度会快一点。
SE T 1 //跑马灯开始,启动定时器。
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
此贴从西门子论坛转 出 /club/bbs/post.aspx?a_id=881946&b_id=4 非本人所写
FN M 6.4
R Q [AR1,P#0.0] //T1 下降沿到来时,复位当前的 Q 点
JC M003
JU M004
M003: L MD 7
+ L#1
T MD 7 //跑马灯地址往前逐步推进
//╬╬╬╬╬╬╬╬╬╬╬T1 相当于 5S 的高电平,一个扫描周期的低电平╬╬╬╬╬╬╬╬╬╬╬╬
M004: AN T 1 //产生一个 5s 的“同步”脉冲源
此段跑马灯程序 Q 点输出范围定义成 Q0.5 到 Q13.0 共 100 个 Q 点,按照楼主的要求,跑了 100 个马灯!可以按照自己的需要修改!也可以在连续 Q 区段
(Q0.0-Q4095.0)内跑马灯!如果 PLC 光跑马灯的话,估计跑三万两千多匹马应该没有问题!兄弟们让你去指挥这千军万马哈......
T MD 7
LAR1 MD 7 //初始化一下地址寄存器 1
L 100
//★★跑马灯区域 Q 点个数(105-5=100)
NEXT: T LW 20 //(Q 点的结束地址减去起始地址)
SET
R Q [AR1,P#0.0] //将跑马灯区域 Q 点全部复位
+AR1 P#0.1
L LW 20
LOOP NEXT
FN M 6.2 //如果跑马灯停止时
JC M001
//跳转到初始化地址寄存器 1 和指定的 Q 区
L MD 7
L L#105 //★定义 Q 点的结束(返回)地址(105/8=Q13.0)
>=D
JC M001
//返回跑马灯的起始地址
JU M002
M001: L L#5
//★定义 Q 点的起始地址(5/8=Q0.5)
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬跑马灯的过程╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
A M 6.1 //跑马灯的启动标志位 M6.1=1 启动,M6.1=0 停止
FP M 6.2 //如果跑马灯启动时
JC M001
//跳转到初始化地址寄存器 1 和指定的 Q 区
A M 6.1 //跑马灯的启动标志位 M6.1=1 启动,M6.1=0 停止
模拟量输出量化程序 块
A(
L #shuru
L 0.000000e+000
>=R
)
A(
L #shuru
L 1.000000e+002
<=R
)
L #shuru
T #shuru_te
JC COMM
L #shuru
L 0.000000e+000
<R
JM LESS
L #shuru
L 1.000000e+002
L L#5
//★定义 Q 点的起始地址(5/8=Q0.5)
T MD 7
M002: LAR1 MD 7 //再初始化一下地址寄存器 1
AT 1
A M 6.1 //跑马灯的启动标志位
FP M 6.3
S Q [AR1,P#0.0] //T1 上升沿到启动标志位
相关文档
最新文档