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(7色を順に光らせる)

10 CLV
20 L=100
30 FOR C=1 TO 7
40 PRINT “—————-“
50 FOR I=0 TO 11
60 GSB @SET_WS.LED(I,C,L)
70 PRINT “I=”;I,”C=”;C,”L=”;L
80 WS.LED 12
90 WAIT 10
100 NEXT
110 ?
120 WAIT 60
130 NEXT
140 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(256)
40 GSB @SET_WS.LED(I,C,L)
50 NEXT
60 WS.LED 12
70 WAIT 120
80 ? “I C L”
90 FOR I=0 TO 11
100 GSB @GET_WS.LED(I,C,L)
110 ? I,C,L
120 BEEP
130 WAIT 60
140 NEXT
150 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

サンプルプログラム3

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


※LEN(S)命令は文字列の長さを返します。
 これをWS.LED命令の引数に直接使用すると、文字列の長さに応じて自動調整されます。
10 CLV
20 S=”123456700000″
30 L=20+RND(40)
40 GSB @STR_WS.LED(S,(I,C,L))
50 WS.LED LEN(S)
60 ?STR$(S),LEN(S),L
70 END


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

4000 @SHIFT_WS.LED(R)
4010 IF R<0 THEN GOTO @WSREV
4020 COPY #700,#800,R*6:COPY#806,#700,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 #700,#806,R*6:COPY#800,#700,R*6:R=-R:RETURN

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

※変数Rには通常はWS.LEDの数と同じ値を設定します。
 33はエラーになるので、最大シフトは32個までです。
※シフトして空いたLED位置には、シフト前の変数R値の値を代入します。
 つまりR=12のとき、右シフトとなり、12個目LEDの色が、1個目に入ります。
※ COPY命令で作業用として、PCGパターンのメモリエリアを使います。

サンプルプログラム4

20 CLV
30 S=”123456700000″
40 L=50
50 GSB @STR_WS.LED(S,(I,C,L))
60 WS.LED LEN(S)
70 WAIT 60*3
75 R=LEN(S)
80 FOR M=1 TO 24
90 GSB @SHIFT_WS.LED(R)
100 WS.LED LEN(S)
110 WAIT 30
120 NEXT
130 WAIT 60*3
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:’JPW NANAIRO-LED 2
20 CLS:CLV:R=12
30 L=50
40 S=”112233445566″
50 GSB @STR_WS.LED(S,(I,C,L))
60 WS.LED LEN(S)
70 WAIT 60*3


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=LEN(S)
160 IF R<0 S=”123456712345″:R=-LEN(S)
170 GOTO 50