【SCL】移位和循环指令的应用(音乐喷泉改进)

移位指令:右移(SHR)左移(SHL)和循环左移/右移(ROR/ROL)指令的应用


前言

这一章我们对音乐喷泉试验进行优化和改进,并一起来学习我们移位指令在这里的应用。


一、移位和循环移位指令

1.左移右移

 在我们前面实现音乐喷泉控制时,是使用的case of  语句来完成的,那么有没有其它的更加简便的方法方式呢!有的,移位指令就是!我们再来看一下控制要求:

7467bceaa06a4d67a52b0987c587a5b7.png

 L1到L8这8个灯以0.5s的间隔依次来闪亮,时间间隔相同,一共要用8个Q点;

左移(SHL):

 这一个是信息系统中的释义:30d1ddffe0c1478b9bc5bbcb8f2bdd17.png

d4174601da6548cbac93ed3ad2697578.png

这一个是scl中的左移指令,其中IN是要移位的一个值,上面音乐喷泉的8个灯是一个字节byte,8个位,这里IN我们填上QB0就可以了(Q0.0---Q0.7) ,N是对IN每次移位的位数(例:1,就是对QB0一次移动1位) 

1fae414d9d634fc897f19c3b821af136.png

 911a4586efc747458b91ff2fd681ffbb.png

左移就是从左边Q0.0开始,进行移位; 

右移(SHR):

和左移相反,从右边Q0.7开始进行移位;

2.使用左移和脉冲实现音乐喷泉

这里启动按钮按下后,用中继接通定时器来产生脉冲,并给qb赋值一个1(相当于初始值),用脉冲来触发左移指令,当最后一位也移完之后,qb就=0,这是再给它一个1,就可以循环往复一直运行,按下停止后,将标志1和qb清零就可以啦! 

较与case of 语句,这个会更加简便一些。 

IF #OFF THEN
    #标志1 := 0;
    #qb := 0;
END_IF;
IF #ON THEN
    #标志1 := 1;
    #qb := 1;
END_IF;
#T(IN := #标志1 & NOT #输出,
   PT := T#500ms,
   Q => #输出);
#P(CLK := #输出);
IF #标志1 & #P.Q THEN
    #qb := SHL(IN := #qb, N := 1);
    IF #qb = 0 THEN
        #qb := 1;
    END_IF;
END_IF;

3.循环移位指令

循环左移指令会在移位完之后,再次循环移位,在上中会比左移更加方便一些! 




二、优化的其它方法

1.使用脉冲和数组

这一个实现的原理就是给数组赋值2进制的数值,然后再将数组依次赋值给qb,来实现效果! 

IF #OFF THEN
    #qb := 0;
    #ZJ1 := 0;
    "数据块_1".变量 := 0;
END_IF;
IF #ON THEN
    #ZJ1 := 1;
END_IF;
#T[0](IN := #ZJ1 & NOT #输出1,
      PT := T#500ms,
      Q => #输出1);
#P[0](CLK := #输出1);
IF #P[0].Q THEN
    "数据块_1".变量 :="数据块_1".变量+1;
    IF "数据块_1".变量 = 8 THEN
        "数据块_1".变量 := 0;
    END_IF;
END_IF;
IF #ZJ1 THEN
    #qb := "数据块_1".数组["数据块_1".变量];
END_IF;

2.随机移位

 这里是用一个脉冲对变量w进行加加,另一个脉冲来抓取,然后来确定移动的位数。

//停止
IF #OFF THEN
    #中继1 := 0;
    #W := 0;
    #qb := 0;
END_IF;

//启动
IF #ON  THEN
    #中继1 := 1;
    //#中继2 := 1;
    #qb := 1;
END_IF;
//获取脉冲上升沿
IF #中继1 THEN
    #P(CLK := "Clock_2.5Hz");
END_IF;
//对变量w一直进行加1
IF #P.Q THEN
    #W := #W + 1;
    IF #W = 8 THEN
        #W := 1;
    END_IF;
END_IF;

//在0.5s内抓取变量w的数值,然后进行移位操作,实现每次移动的数不同。
#T(IN := #中继1 & NOT #时间到,
   PT := T#0.5s,
   Q => #时间到);
#P1(CLK := #时间到);
IF #P1.Q & #中继1  THEN
    //#中继1 := 0;
    #qb := SHL(IN := #qb, N := #W);
END_IF;
IF #qb = 0 & #中继1  THEN
    #qb := 1;
END_IF;

总结

以上就是对音乐喷泉这个案例的几个优化。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值