LEDでナナイロづくり 2

WS.LED命令を簡単に使うための、便利なサブルーチンをまとめました。
WS.LED命令の基本的なプログラミングはこちら「LEDでナナイロ」も参考にしてください。

  1. SET_WS.LED LED色の設定
  2. GET_WS.LED LED色の取得
  3. STR_WS.LED 一括色設定
  4. SHIFT_WS.LED LEDシフト設定
  5. LUMINA_WS.LED 輝度設定
  6. CLS_WS.LED 全LED消灯


1.LED色の設定
@SET_WS.LED(I,C,L)

1000 @SET_WS.LED(I,C,L)
1010 IF I>33 THEN I=33
1020 IF (L<1||L>255)&&(C%8) THEN L=20
1030 LET[I*3],C&1*L,C>>1&1*L,C>>2&1*L
1040 RETURN

・LED位置I番の配列(GRBの3か所)に、変数C(色)と変数L(明るさ)を設定します。
———————————————————————
変数 I LED点灯位置
0~33 (LEDの数は最大34個まで)
———————————————————————
変数 C 色
0■無(光らない)、1緑、2赤、3黄、4青、
シアン(青緑)、6マゼンタ(紅紫)、7
———————————————————————
変数 L 輝度
1~255(範囲外は強制的に20)
———————————————————————
※変数L=0は無効にしています。LED光らせたくないときは、変数Cに0を設定してください。
もし、変数Lの0を有効にするときは、1020行目を削除してください。

※変数Cは下位3ビット分しか使用していません。C=9は、C=1と同じ色です。マイナス値でも何かしら光ります(ABS(C%8)と同じ)。

※変数Lも下位8ビットしか使用していません。L=256はL=0と同じ明るさです(ABS(L%256)と同じ)。

サンプルプログラム1

10 L=100
20 FOR C=1 TO 7
30 FOR I=0 TO 11
40 GSB @SET_WS.LED(I,C,L)
50 WS.LED 12
60 WAIT 10
70 NEXT
80 NEXT
90 END


2.LED色の取得
@GET_WS.LED(I,C,L)

2000 @GET_WS.LED(I,C,L)
2010 IF I>33 THEN I=33
2020 C=([I*3]&&1)+([I*3+1]&&1)*2+([I*3+2]&&1)*4
2030 L=[I*3]|[I*3+1]|[I*3+2]
2040 RETURN

・LED位置I番の、色と明るさを、変数Cと変数Lに取得します。
現在WS.LED命令で光っているLEDの値を知ることができます。
・ただし、@SET_WS.LEDサブルーチンで設定したRGB値でないと正しい値を取得できません。
———————————————————————
変数 I
LED位置を指定する
0~33
———————————————————————
変数 C
変数Iで指定したLED位置の色が返る。
0■無(光らない)、1■緑、2■赤、3■黄、4■青、
5■シアン(青緑)、6■マゼンタ(紅紫)、7■白

変数 L 
変数Iで指定したLED位置の輝度が返る。
0~255

サンプルプログラム2

10 FOR I=0 TO 11
20 C=RND(8)
30 L=RND(255)
40 GSB @SET_WS.LED(I,C,L)
50 NEXT
60 WS.LED 12
70 WAIT 120
80 FOR I=0 TO 11
90 GSB @GET_WS.LED(I,C,L)
100 ? I,C,L
110 NEXT
120 END


3.一括色設定
@STR_WS.LED(S,(I,C,L))

3000 @STR_WS.LED(S,(I,C,L))
3010 FOR I=0 TO LEN(S)-1
3020 C=ASC(S+I)-48
3030 GOSUB @SET_WS.LED(I,C,L)
3040 NEXT

3050 RETURTN

・文字列を使用して、一度に色設定を行います。
———————————————————————
変数 S 色パターン
文字列で0~7をLED数分を指定します 。最大34文字。
———————————————————————
変数 L 輝度
———————————————————————
※変数 I 位置
 変数 C 色
これらの変数は文字列の文字パターンを作るために使います。
そのため、I,Cの値は、文字列最後の文字の設定値が入ります。

※@SET_WS.LEDサブルーチンを呼びますが、
つぎの行のように、直接置き換えてもよいです。
ただし、各変数の範囲チェックはしません。
3030 LET[I*3],C&1*L,(C&2&&1)*L,(C&4&&1)*L

※LEN(S)命令では、文字数を取得できます。これを利用するとWS.LEDの引数に直接使用できて便利です。
10 S=”12345″
20 GSB @STR_WS.LED(S,(I,C,L))
30 K=LEN(S):WS.LED K

サンプルプログラム3

10 S=”123456700000″
20 L=50
30 GSB @STR_WS.LED(S,(I,C,L))
40 WS.LED 12
50 END


4.LEDシフト設定
@SHIFT_WS.LED(R)

4000 @SHIFT_WS.LED(R)
4010 IF R<0 THEN GOTO @WSREV
4020 COPY #900,#800,R*6:COPY#806,#900,R*6
4030 LET[0],[(R*3],[R*3+1],[R*3+2]:RETURN
4040 @WSREV:R=-R
4050 LET[R*3],[0],[1],[2]
4060 COPY #900,#806,R*6:COPY#800,#900,R*6:R=-R:RETURN

・WS.LEDで点灯しているLED色を右または左に1つシフトします。
・ Rが正数(+)だと右、負数(-)だど左にシフトします。
———————————————————————
変数 R シフト個数
  整数(+プラス)なら右方向へ、R個分のLED色を1つずらす。
  負数(ーマイナス)なら左方向へ1つずらす。
———————————————————————

※内部処理では、配列を3個分をずらしています。
※変数Rには通常はWS.LEDの数と同じ値を設定しますが、1以下は意味をなしません。また、33はエラーになるので、最大シフトは32個までです。
※シフトして空いたLED位置には、シフト前の変数R値の値を代入します。つまりR=12のとき、右シフトとなり、12個目LEDの色が、1個目に入ります。

※IchigoJamBASICのCOPY命令は、 コピー元の領域とコピー先の領域が重なっていると正しく動作しません(c言語のmemcopyと同等)。そこで、画面表示用のメモリエリア(#900)に一旦コピーしています(c言語のmemmoveと同じ)。
画面表示がおかしくなるので、不都合であればキャラクタ用のメモリエリア(#700)に変更するとよいでしょう。
4020 COPY#700,#800,R*6:COPY#806,#700,R*6
4060 COPY#700,#806,R*6:COPY#800,#700,R*6:R=-R:RTN

サンプルプログラム4

10 CLV
20 S=”123456700000″
30 R=LEN(S)
40 L=50
50 GSB @STR_WS.LED(S,(I,C,L))
60 WS.LED 12
70 WAIT 120
80 FOR M=1 TO 24
90 GSB @SHIFT_WS.LED(R)
100 WS.LED 12
110 WAIT 30
120 NEXT
130 WAIT 180
140 R=-R
150 GOTO 80


5.輝度設定
@LUMINA_WS.LED(L,V,I)

5000 @LUMINA_WS.LED(L,V,I)
5010 IF V<1 OR V>34 OR !L THEN RETURN
5020 IF L>255 THEN L=255
5030 FOR I=0 TO V*3-1
5040 IF [I] THEN [I]=L
5050 NEXT
5060 RETURN

・WS.LEDで点灯している輝度を変更します。
———————————————————————
変数 L 変更する輝度 (1~255)
変数 V 変更するLED個数 (1~34)
いずれも範囲外の設定なら、サブルーチンは実行しない。
———————————————————————
変数 I 位置
文字列の文字パターンを作るために使います。
変数V×3-1と同じ値が入ります。

サンプルプログラム5

10 CLV
20 S=”123456700000″
30 L=75
40 GSB @SET_WS.LED(S,(I,C,L))
50 WS.LED12
60 WAIT 120
70 FOR L=100 TO 0 STEP -5
80 V=LEN(S)
90 GSB @LUMINA_WS.LED(L,V,I)
100 WS.LED12
110 WAIT 10
120 NEXT
130 END




OMAKE

WS.LED用のサブルーチンを応用して12個のLEDサークルをイルミネーションのように光らせるプログラムです。

10 @ARUN:’OTARU LED-DEMO 2020
20 CLS:CLV:R=12
30 L=50
40 S=”112233445566″
50 GSB @STR_WS.LED(S,(I,C,L))
60 WS.LED 12
70 WAIT 180
80 FOR M=1 TO 12
90 GSB @SHIFT_WS.LED(R)
100 IF R>0 WS.LED 12:WAIT 12
110 IF R<0 WS.LED 2,6:WAIT 50
120 NEXT
130 WAIT 60
140 R=-R
150 IF R>0 S=”666655554444333322221111″:R=24
160 IF R<0 S=”123456712345″:R=-12
170 GOTO 50