第17课 · 跳过去、叫过来、绕几圈(程序流程)

信捷指令讲堂 · 6 段 · 共 3:23 · 正文 1040 字 · 完全免费

好的程序不是"全写出来",而是"不该跑的别跑"。这节课讲跳转、调用、循环三种省时间的手法——顺带把冒泡排序那个经典例子跑一遍。

完整课程 · 智慧屏 + 数字人讲师加载较慢?先看下面的图文
正在加载数字人讲师 …
首次打开约需 30~60 秒(3D 模型较大,只在电脑上加载)
加载期间可以先往下看图文讲解
这台设备暂时跑不了完整课程需要支持 WebGL 的浏览器(多数电脑浏览器都支持)
下面是同一节课的图文讲解 + 音频,内容完全一样

📱 手机上看不到完整课程(数字人讲师需要电脑浏览器的 3D 支持)。下面是这节课的图文讲解 + 音频,内容完全一样,手机上也能完整学完。想体验完整课程,用电脑打开这一页即可。
仍然在手机上试试完整课程

1/6

跳转:不想跑的那段,一步跨过去

0:33

跳转:不想跑的那段,一步跨过去

  • 两句都在数X0 没合上时,D0 和 D1 一起往上走
  • 一步跨过去读到 CJ 就跳到标号 P1,中间的 INC D0 被整段跨过
  • 停在原地D0 不再变,标号后面那句照跑不误
  • 全看标号跳到哪、跳过什么,就看 P1 落在哪一行
跳过去、叫过来、绕几圈(程序流程) · 跳转:不想跑的那段,一步跨过去 梯形图 条件跳转:合上 X0,中间那句被跨过

条件跳转:合上 X0,中间那句被跨过

程序写长了,总有些段落平时不想跑,这时候用条件跳转。X0 没合上的时候,两句 INC 都执行,D0 和 D1 一起往上走。把 X0 合上,程序读到 CJ 就一步跨到 P1 那个标号,中间的 INC D0 整段被跳过去,D0 停在原地不动,标号后面的 INC D1 照跑不误。松开 X0,D0 又接着往上走。跳到哪、跳过什么,全看标号 P1 落在哪一行。

2/6

双线圈:同一个输出写两句,靠跳转挑一句

0:34

双线圈:靠跳转挑一句生效

  • 写了两句同一个 Y0 出现两次,平时算双线圈
  • X0 没合上第二个 CJ 跨过最后那句,Y0 听 X1
  • 把 X0 合上第一句被跨过,Y0 改听 X2
  • 缩短运算周期手册对跳转这种用法的原话
跳过去、叫过来、绕几圈(程序流程) · 双线圈:同一个输出写两句,靠跳转挑一句 梯形图 双线圈:Y0 归谁管,看 X0

双线圈:Y0 归谁管,看 X0

再看一个实战用法。同一个 Y0 在程序里写了两句,平时这叫双线圈,是不允许的,配上跳转就合法了。X0 没合上的时候,第二个 CJ 跳到 P7,把最后那句跨过去,Y0 听 X1 的,灯是亮的。把 X0 合上,程序开头就跳到 P6,第一句被跨过,Y0 改听 X2;X2 没接通,灯就灭了。把 X2 接上,灯又亮起来。手册上管这叫用跳转缩短运算周期。

3/6

子程序:搭在主程序后面,叫一次跑一次

0:35

子程序:搭在主程序后面,叫一次跑一次

  • 喊一声CALL P10 就是叫子程序来干活
  • FEND 是结束线主程序跑到这儿就停,不会滑进子程序区
  • 冻着X0 不接通,子程序里那句就一动不动
  • SRET 返回子程序干完,从哪叫的就回哪去
跳过去、叫过来、绕几圈(程序流程) · 子程序:搭在主程序后面,叫一次跑一次 梯形图 CALL 叫一声,SRET 再回来

CALL 叫一声,SRET 再回来

程序长了,有些活儿好几个地方都要用,就把它单独写成一段子程序,用的时候喊一声。图上 CALL P10 就是喊这一声:X0 接通才喊。子程序挂在 FEND 后面,FEND 是主程序的结束线,跑到那儿就停住,不会顺着滑进子程序区。所以 X0 不接通时 D1 一直冻着;X0 一接通,每扫描一次调一次,D1 就跟着 D0 一起涨。子程序最后那句 SRET,负责返回主程序。

4/6

循环:门里那句,一次扫描连跑五遍

0:32

循环:门里那句一次扫描连跑五遍

  • 一对门FOR 和 NEXT 之间的程序被重复执行
  • 按一下加五INC D0 一次扫描连跑 5 遍
  • 门外只加一同一次扫描里 INC D1 只执行一次
  • 不省时间次数写大了,扫描周期跟着变长
跳过去、叫过来、绕几圈(程序流程) · 循环:门里那句,一次扫描连跑五遍 梯形图 门里加五,门外加一

门里加五,门外加一

接下来是循环。FOR 和 NEXT 是一对门,写在门里的程序,一次扫描会连着跑好几遍。图上 FOR K5 就是跑五遍,门里那句 INC D0 一次扫描加五:按一下 X0,D0 从零跳到五,再按一下跳到十。门外那句 INC D1 就不一样,每扫描只加一。所以循环省的是程序长度,不省时间,次数写大了扫描周期跟着变长,手册专门提醒过。

5/6

嵌套:门里再开一道门,五次乘六次

0:36

嵌套:门里再开一道门

  • 门里再开一道门外层 FOR K5,里层分 FOR K6 / FOR K7 两路
  • 五乘六X1 通 → 外层 5 轮 × 内层 6 次,D0 涨 30
  • 五乘七换成 X2 通 → 5×7,D1 涨 35
  • 就近配对哪条 NEXT 配哪个 FOR,一条都不能错
跳过去、叫过来、绕几圈(程序流程) · 嵌套:门里再开一道门,五次乘六次 梯形图 手册 p115 原例:5×6 与 5×7

手册 p115 原例:5×6 与 5×7

门里再开一道门,这就是嵌套。手册上这个例子,外面一层 FOR K5,里面分两路:X1 接通走的是 FOR K6,X2 接通走的是 FOR K7。按一下 X0,X1 通着,D0 涨三十,是五乘六。现在把 X1 断开、X2 接通,再按一下 X0,D1 涨三十五,是五乘七。门里再套门,总次数就是两层相乘。哪条 NEXT 配哪个 FOR,看的是就近配对,一条都不能错。

6/6

压轴:一个真用得上的循环——给一排数排队

0:33

压轴:给一排数排队

  • 游标 D21从 0 开始,挨着比、换、再往右挪
  • 前面大就换LD> 比较加 XCH 交换,两个数换个位置
  • 走四轮外层循环四轮,每轮把最大的顶到最后
  • 按一下就排好D1~D5 变成 1、2、3、4、5
跳过去、叫过来、绕几圈(程序流程) · 压轴:一个真用得上的循环——给一排数排队 梯形图 手册 p116 原例:双层循环 + 变址排序

手册 p116 原例:双层循环 + 变址排序

最后看一个真用得上的例子,手册拿它给一排数从小到大排队。五个数是倒着放的:五、四、三、二、一。程序用 D21 当游标,从零开始,把挨着的两个数比一下,前面比后面大就换个个儿,游标加一往右挪。外面那层循环走四轮,每一轮把当前最大的数顶到后面去。按一下 X0,五个数就变成一、二、三、四、五。循环次数别写太大,扫描周期会跟着变长。

想亲手试一下?

这门课的电路,已经给你摆好了。不用装软件,点开就能按按钮、看线圈亮。