第20课 · 把一排灯整体挪一格(数据移位)

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

流水灯为什么是流动的?靠的就是移位。这节课把算术移、逻辑移、循环移、字移四类一次讲清,看完你就知道该用哪一条。

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

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

1/6

算术左移:按一下,整排往左挪一格

0:37

算术左移:整排往左挪一格

  • 整排挪一格D0 里的那个一挪到左边,空出来的补零
  • 一二四八每按一次翻一倍:二、四、八
  • 挪几格看 K第二格那个 K 就是移动位数
  • 一个沿挪一次手册标的是边沿触发,按住不放不会连挪
把一排灯整体挪一格(数据移位) · 算术左移:按一下,整排往左挪一格 梯形图 算术左移:按一下挪一格

算术左移:按一下挪一格

前面几节都在搬数据,这一节换个玩法:把数据本身挪位置。看最基础的这条,D0 里先放个一,也就是二进制最右边那位亮着。按一下 X0,整排往左挪一格,空出来的最右边补零,D0 变成二。再按一下变四,第三下变八。挪几格写在第二格那个 K 里。手册把这类指令的执行条件标成边沿触发,所以实际写程序要给它串一个上升沿触点,按住不放也只挪一次。这条叫算术左移,指令是 SHL。

2/6

两条右移:补一还是补零,差在最高位那一位

0:37

两条右移:补一还是补零

  • 一章两条右移SHR 叫算术、LSR 叫逻辑,名字不同活儿不同
  • 补原最高位SHR 空出来的高位补的是移位前那个一
  • 一律补零LSR 不管符号,上位统统补零
  • 只差一个符号同一串二进制,一个得负、一个得正
把一排灯整体挪一格(数据移位) · 两条右移:补一还是补零,差在最高位那一位 梯形图 两条右移:补一还是补零

两条右移:补一还是补零

往右挪就有两条指令了,这是这一章最容易混的地方。图上一上一下两条,D0 和 D2 里装的二进制都是最左边一位是一、其余全是零,也就是负数。上面那条 SHR,算术右移,右移四位补进来的是原来那个最高位,补四个一,结果是负的二千零四十八。下面那条 LSR,逻辑右移,一律补零,结果是正的二千零四十八。手册原话:LSR 与 SHR 有所区别,前者上位补零,后者上位也参与移位。

3/6

循环移位:挪出去的那一位从另一头转回来

0:31

循环移位:转出去的从另一头回来

  • 不是丢掉最左边那个一,从最右边转了回来
  • 对照算术移位同样的数,SHL 移完是零,那个一真没了
  • ROR 往右转右循环道理一样,方向整个反过来
  • 跑马灯用得上做流水灯、显示扫描都靠这两条
把一排灯整体挪一格(数据移位) · 循环移位:挪出去的那一位从另一头转回来 梯形图 循环左移:转出去的转回来

循环左移:转出去的转回来

再看循环移位。D0 里还是只有最左边那位是一。按一下 X0,ROL 循环左移,最左边那个一不是溢出丢掉,而是从最右边转了回来,D0 变成一。再按变二,第三下变四。对照一下刚才那条算术左移:同样这个数,SHL 移完是零,那个一就真的没了。ROR 是往右转,道理一样。做跑马灯、做显示扫描,用的就是循环这两条。

4/6

位左移 SFTL:四个操作数,流水灯的主角

0:32

位左移:四个操作数

  • 四个操作数源、目标、这一排多长、一次挪几位
  • n2 挪几位写 K1 挪一位,写 K4 一次挪四位
  • 源通着就一直进M100 恒为 1,每按一次推进一个新的一
  • 逐个累加点亮Y0 亮完 Y1 亮,一盏一盏往上加
把一排灯整体挪一格(数据移位) · 位左移 SFTL:四个操作数,流水灯的主角 梯形图 位左移:源通着,一盏盏加上去

位左移:源通着,一盏盏加上去

前面几条挪的都是寄存器里的数,真正做流水灯的是位左移 SFTL。它后面跟着四个操作数:第一个是源,也就是要送进来的那一位;第二个是目标,这一排灯从哪开始;第三个是这一排有多长;第四个是一次挪几位,写 K1 就挪一位。图上源 M100 一直是通着的,所以每按一次就往里推进一个一:Y0 先亮,再按一次 Y0、Y1 一起亮,一盏一盏往上加。

5/6

位右移 SFTR 与字移位:方向反过来,粒度换成字

0:36

位右移 + 字左移

  • 方向反过来SFTR 的源从这一排最顶上进,与 SFTL 相反
  • 先亮最边上那盏按一下先亮 Y7,再按 Y7、Y6 一起亮
  • 把位换成字WSFL / WSFR 四个操作数一个不差
  • 每次挪几个字n2 写 K2 就是一次挪两个字
把一排灯整体挪一格(数据移位) · 位右移 SFTR 与字移位:方向反过来,粒度换成字 梯形图 位右移 + 字左移:换方向换粒度

位右移 + 字左移:换方向换粒度

位右移 SFTR 跟它是一对,方向整个反过来:源不是从最低位进,而是从这一排的最顶上进。图上按一下,先亮的是最靠边那盏 Y7,再按一次 Y7、Y6 一起亮。字移位就是把位换成字,四个操作数一个不差:源、目标、这一排几个字、每次挪几个字。图上下面那条 WSFL,把 D0、D1 两个格子整体灌进 D10 开头那一片,每次挪两个字,第二拍就能在 D12、D13 上看到原来那组数被顶到后面去了。

6/6

压轴:跑马灯——接上时钟,它自己跑起来

0:37

压轴:跑马灯自己转起来

  • 诀窍在源源写 Y7,接的是这一排最头上那盏
  • 挤出去的回收被顶出去的那一位,又送回最低位当新源
  • 不用手按了接机子里的时钟脉冲,它自己一格一格走
  • 示例库有现成的三条流水灯,打开就能跑
把一排灯整体挪一格(数据移位) · 压轴:跑马灯——接上时钟,它自己跑起来 梯形图 跑马灯:时钟推着走,首尾相接

跑马灯:时钟推着走,首尾相接

最后做一个真能跑起来的跑马灯。诀窍还是那一条:源不接开关,接最头上那盏 Y7,被挤出去的那一位又当成新源送回最低位。前面几段都得手按,这回换机子里的时钟脉冲推着走,它自己一格一格往前挪。第一步先给它一个一,用上电头一拍那个脉冲点亮 Y0,往后这一个就在八盏灯里转圈,走到最头上再挤出来,又绕回 Y0,永远不停。想看现场一秒一拍的做法,示例库里有三条现成的流水灯,打开就能跑。

想亲手试一下?

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