以下のように LED の光り方を変えて回っているようにしたいと思います。
各パターンの色を指定して人の目に映るよう少し止まればいいので、 おそらくこんな感じのプログラムになるかと思います。
START: leda 7 0 0 ledb 0 7 0 ledc 0 0 7 ledd 0 0 0 wait 25 leda 0 7 0 ledb 0 0 7 ledc 0 0 0 ledd 7 0 0 wait 25 leda 0 0 7 ledb 0 0 0 ledc 7 0 0 ledd 0 7 0 wait 25 leda 0 0 0 ledb 7 0 0 ledc 0 7 0 ledd 0 0 7 wait 25 jmp START |
とはいえ、これは少し書くのが面倒臭いですね。 もっとシンプルに書きたいものです。そんな時便利なのが ledchg という命令です。 ledchg は四つの引数を持ちます。各引数は a,b,c,d という文字で指定でき
という意味を持ちます。なので
という命令は時計回りで回転
という命令は半時計回りで回転
という命令は上下反転
という命令で左右反転
ledchg を使うと先ほどと同じ動きをするプログラムは以下のように短く簡単に書くことができます。
leda 7 0 0 ledb 0 7 0 ledc 0 0 7 ledd 0 0 0 MAIN: wait 25 ledchg b c d a jmp MAIN |
上のプログラムの動きを追いかけると
左上の LED を赤くする
左下の LED を緑にする
右下の LED を青くする
右上の LED を黒くする
この位置を 'MAIN' という名前にする
0.02 x 25 = 0.5 秒停止する
光を時計回りに入れ替える
'MAIN' と名付けた行、すなわち 6 行目に飛ぶ
さてここで、例えば 5 回時計周りに回転したら、今度は逆に 5 回回転するといったことをさせようとしたらどうでしょうか。 6〜8 行の中には「今何回回っている」という情報が無いので実現が難しそうです。
そういう時に役立つのが loop という命令です。loop という命令は引数で指定された回数だけ lend までの間をぐるぐる繰り返します。 光が 1 回転するのに ledchg は 4 回必要ですから、5 回転なら 20 回の ledchg が必要です。そこで
leda 7 0 0 ledb 0 7 0 ledc 0 0 7 ledd 0 0 0 MAIN: loop 20 wait 25 ledchg b c d a lend loop 20 wait 25 ledchg d a b c lend jmp MAIN |
と書くと 5 回転ずつ時計回りと半時計周りを繰り返すようになります。
ledinc や leddec を使うと、特定の LED の特定の色の輝度を一段階上げたり下げたりすることができます。LED の指定は a (左上)、b (左下)、c (右下)、d (右上)、 色の指定は r (赤)、g (緑)、b (青)、a (全色) です。 早速サンプルを見てみましょう。
leda 7 0 0 ledb 0 7 0 ledc 0 0 7 ledd 0 0 0 MAIN: loop 7 wait 5 ledinc a g ledinc b b ledinc c r ledinc d a lend loop 7 wait 5 leddec a r leddec b g leddec c b leddec d a lend ledchg c a b d jmp MAIN |
左上の LED (A) は最初 7 0 0 と赤ですが最初のループで 7 1 0, 7 2 0 と緑成分が増えていき最終的に 7 7 0 という黄色になります。 そして二つ目のループで 6 7 0, 5 7 0 と赤成分が減っていき最終的には 0 7 0 と緑になります。同様に左下の LED (B) は緑からはじまって水色になり青に、 右下の LED (B) は青からはじまって紫になって赤へと色が変化します。 最後の ledchg で色を元に戻しています。
ledinc や leddec は輝度を今のものから一段階上げたり下げたりするものでしたが、 ledset を使うと今の状態に関わらず任意の値にすることができます。 ledset を使ったサンプルを以下に示します。 言葉での説明の代わりに C 言語的に書いた等価コードを併記しますので解読の参考にしてください。
ledz 0 0 0 MAIN: loop 8 loop 8 loop 8 wait 10 ledchg a a b c ledinc a r lend ledset a r 0 ledinc a g lend ledset a g 0 ledinc a b lend ledset a b 0 jmp MAIN |
A.r=A.g=A.b=B.r=B.g=B.b=C.r=C.g=C.b=D.r=D.g=D.b=0; for(;;){ for (i=0;i<=8;i++){ for (j=0;j<=8;j++){ for (k=0;k<=8;k++){ Sleep(10); D=C; C=B; B=A; A.r++; } A.r=0; A.g++; } A.g=0; A.b++; } A.b=0 } |