移位指令:右移(SHR)左移(SHL)和循环左移/右移(ROR/ROL)指令的应用
文章目录
目录
一、移位和循环移位指令
1.左移右移
2.使用左移和脉冲实现音乐喷泉
3.循环移位指令
二、优化的其它方法
1.使用脉冲和数组
2.随机移位
总结
前言
这一章我们对音乐喷泉试验进行优化和改进,并一起来学习我们移位指令在这里的应用。
一、移位和循环移位指令
1.左移右移
在我们前面实现音乐喷泉控制时,是使用的case of 语句来完成的,那么有没有其它的更加简便的方法方式呢!有的,移位指令就是!我们再来看一下控制要求:
L1到L8这8个灯以0.5s的间隔依次来闪亮,时间间隔相同,一共要用8个Q点;
左移(SHL):
这一个是信息系统中的释义:
这一个是scl中的左移指令,其中IN是要移位的一个值,上面音乐喷泉的8个灯是一个字节byte,8个位,这里IN我们填上QB0就可以了(Q0.0---Q0.7) ,N是对IN每次移位的位数(例:1,就是对QB0一次移动1位)
左移就是从左边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;
总结
以上就是对音乐喷泉这个案例的几个优化。