目次
前
次
方向指示器(その2)
自転車、自動車のようなランプを2つしか持たない
方向指示器の他に、進行方向を指定するために複数
のランプをもつ場合もあります。
LEDを4本利用し、次のように進行方向を指示する
システムを考えてみます。
LEDは、次のように接続されているとします。
右から左に方向指示する場合のBASICコードは
次のように書けばよいでしょう。
100 ' flashing
110 OUT 1,0 : OUT 2,0 : OUT 3,0 : OUT 4,1 : WAIT D
120 OUT 1,0 : OUT 2,0 : OUT 3,1 : OUT 4,1 : WAIT D
130 OUT 1,0 : OUT 2,1 : OUT 3,1 : OUT 4,1 : WAIT D
140 OUT 1,1 : OUT 2,1 : OUT 3,1 : OUT 4,1 : WAIT D
150 OUT 1,0 : OUT 2,0 : OUT 3,0 : OUT 4,0 : WAIT D
160 RETURN
左から右に方向指示する場合のBASICコードは、以下。
300 ' flashing
310 OUT 1,1 : OUT 2,0 : OUT 3,0 : OUT 4,0 : WAIT D
320 OUT 1,1 : OUT 2,1 : OUT 3,0 : OUT 4,0 : WAIT D
330 OUT 1,1 : OUT 2,1 : OUT 3,1 : OUT 4,0 : WAIT D
340 OUT 1,1 : OUT 2,1 : OUT 3,1 : OUT 4,1 : WAIT D
350 OUT 1,0 : OUT 2,0 : OUT 3,0 : OUT 4,0 : WAIT D
360 RETURN
左、右ともに最後に全LEDを消灯させるので、これを
サブルーチンでまとめてしまいましょう。
200 ' turn off all LED
210 OUT 1,0 : OUT 2,0 : OUT 3,0 : OUT 4,0 : WAIT D
220 RETURN
全LEDを消灯させるサブルーチンがあれば、左から右
右から左の方向指示は、次のように書き直せます。
100 ' flashing
110 OUT 1,0 : OUT 2,0 : OUT 3,0 : OUT 4,1 : WAIT D
120 OUT 1,0 : OUT 2,0 : OUT 3,1 : OUT 4,1 : WAIT D
130 OUT 1,0 : OUT 2,1 : OUT 3,1 : OUT 4,1 : WAIT D
140 OUT 1,1 : OUT 2,1 : OUT 3,1 : OUT 4,1 : WAIT D
150 GOSUB 200
160 RETURN
300 ' flashing
310 OUT 1,1 : OUT 2,0 : OUT 3,0 : OUT 4,0 : WAIT D
320 OUT 1,1 : OUT 2,1 : OUT 3,0 : OUT 4,0 : WAIT D
330 OUT 1,1 : OUT 2,1 : OUT 3,1 : OUT 4,0 : WAIT D
340 OUT 1,1 : OUT 2,1 : OUT 3,1 : OUT 4,1 : WAIT D
350 GOSUB 200
360 RETURN
行番号110から140と出力論理値が同じになるように
行番号310から340の内容を書直してみます。
100 ' flashing
110 OUT 1,0 : OUT 2,0 : OUT 3,0 : OUT 4,1 : WAIT D
120 OUT 1,0 : OUT 2,0 : OUT 3,1 : OUT 4,1 : WAIT D
130 OUT 1,0 : OUT 2,1 : OUT 3,1 : OUT 4,1 : WAIT D
140 OUT 1,1 : OUT 2,1 : OUT 3,1 : OUT 4,1 : WAIT D
150 GOSUB 200
160 RETURN
300 ' flashing
310 OUT 4,0 : OUT 3,0 : OUT 2,0 : OUT 1,1 : WAIT D
320 OUT 4,0 : OUT 3,0 : OUT 2,1 : OUT 1,1 : WAIT D
330 OUT 4,0 : OUT 3,1 : OUT 2,1 : OUT 1,1 : WAIT D
340 OUT 4,1 : OUT 3,1 : OUT 2,1 : OUT 1,1 : WAIT D
350 GOSUB 200
360 RETURN
行番号110から140では、OUTで利用するピンが1から4と
増えるようになっています。行番号310から340では、ピン
の番号が4から1に減るようになっています。
ピン番号をX、Y、Z、Uとして書き換えてみると
どうなるでしょうか。
100 ' flashing
110 OUT X,0 : OUT Y,0 : OUT Z,0 : OUT U,1 : WAIT D
120 OUT X,0 : OUT Y,0 : OUT Z,1 : OUT U,1 : WAIT D
130 OUT X,0 : OUT Y,1 : OUT Z,1 : OUT U,1 : WAIT D
140 OUT X,1 : OUT Y,1 : OUT Z,1 : OUT U,1 : WAIT D
150 GOSUB 200
160 RETURN
300 ' flashing
310 OUT X,0 : OUT Y,0 : OUT Z,0 : OUT U,0 : WAIT D
320 OUT X,0 : OUT Y,1 : OUT Z,0 : OUT U,0 : WAIT D
330 OUT X,0 : OUT Y,1 : OUT Z,1 : OUT U,0 : WAIT D
340 OUT X,1 : OUT Y,1 : OUT Z,1 : OUT U,1 : WAIT D
350 GOSUB 200
360 RETURN
行番号110から140と行番号310から340は、同じカタチ
になりました。違いは、変数X、Y、Z、Uに入れる値に
なっています。
サブルーチンを呼出す側で、X、Y、Z、Uの値を予め
設定してしまえば、サブルーチンを分けて書かない
でもいけそうです。
スイッチを押したときに、変数L、Rに'1'が入ると
して、呼び出し側のプログラムを書いてみます。
40 IF L=1 LET X,1:LET Y,2:LET Z,3:LET U,4:GOSUB 100
50 IF R=1 LET X,4:LET Y,3:LET Z,2:LET U,1:GOSUB 100
変数X、Y、Z、Uを指定したなら、サブルーチンは
次のようにできます。
100 ' flashing
110 OUT X,0 : OUT Y,0 : OUT Z,0 : OUT U,1 : WAIT D
120 OUT X,0 : OUT Y,0 : OUT Z,1 : OUT U,1 : WAIT D
130 OUT X,0 : OUT Y,1 : OUT Z,1 : OUT U,1 : WAIT D
140 OUT X,1 : OUT Y,1 : OUT Z,1 : OUT U,1 : WAIT D
150 GOSUB 200
160 RETURN
200 ' turn off all LED
210 OUT 1,0 : OUT 2,0 : OUT 3,0 : OUT 4,0 : WAIT D
220 RETURN
全体をまとめます。
10 ' winker
20 LET D,60 : GOSUB 200
30 LET L,IN(1) : LET R,IN(2)
40 IF L=1 LET X,1 : LET Y,2 : LET Z,3 : LET U,4 : GOSUB 100
50 IF R=1 LET X,4 : LET Y,3 : LET Z,2 : LET U,1 : GOSUB 100
60 IF BTN() GOTO 80
70 GOTO 30
80 ? "EXIT"
90 END
100 ' flashing
110 OUT X,0 : OUT Y,0 : OUT Z,0 : OUT U,1 : WAIT D
120 OUT X,0 : OUT Y,0 : OUT Z,1 : OUT U,1 : WAIT D
130 OUT X,0 : OUT Y,1 : OUT Z,1 : OUT U,1 : WAIT D
140 OUT X,1 : OUT Y,1 : OUT Z,1 : OUT U,1 : WAIT D
150 GOSUB 200
160 RETURN
200 ' turn off all LED
210 OUT 1,0 : OUT 2,0 : OUT 3,0 : OUT 4,0 : WAIT D
220 RETURN
スイッチは、次の回路を利用します。
行番号200からのサブルーチンは、ピン番号が
1から4に変化しているだけなので、FOR...NEXT
を使って書き換えられます。
200 ' turn off all LED
210 FOR I=1 TO 4 : OUT I,0 : NEXT
220 WAIT D
220 RETURN
IchigoJamのBASICには、変数AからZの他に配列が
用意されているので、LEDが接続されているピン
番号を、配列に入れて使うこともできます。
100 ' flashing
110 OUT [1],0 : OUT [2],0 : OUT [3],0 : OUT [4],1 : WAIT D
120 OUT [1],0 : OUT [2],0 : OUT [3],1 : OUT [4],1 : WAIT D
130 OUT [1],0 : OUT [2],1 : OUT [3],1 : OUT [4],1 : WAIT D
140 OUT [1],1 : OUT [2],1 : OUT [3],1 : OUT [4],1 : WAIT D
150 GOSUB 200
160 RETURN
呼び出す側では、配列にピン番号を入れるように
書けばよいでしょう。
40 IF L=1 LET [1],1,2,3,4 : GOSUB 100
50 IF R=1 LET [1],4,3,2,1 : GOSUB 100
全部のLEDを消灯するサブルーチンも
配列を使うと、綺麗にかけます。
200 ' turn off all LED
210 FOR I=1 TO 4 : OUT [I],0 : NEXT
220 WAIT D
220 RETURN
全体を見えるようにしてみます。
10 ' winker
20 LET D,60 : GOSUB 200
30 LET L,IN(1) : LET R,IN(2)
40 IF L=1 LET [1],1,2,3,4 : GOSUB 100
50 IF R=1 LET [1],4,3,2,1 : GOSUB 100
60 IF BTN() GOTO 80
70 GOTO 30
80 ? "EXIT"
90 END
100 ' flashing
110 OUT [1],0 : OUT [2],0 : OUT [3],0 : OUT [4],1 : WAIT D
120 OUT [1],0 : OUT [2],0 : OUT [3],1 : OUT [4],1 : WAIT D
130 OUT [1],0 : OUT [2],1 : OUT [3],1 : OUT [4],1 : WAIT D
140 OUT [1],1 : OUT [2],1 : OUT [3],1 : OUT [4],1 : WAIT D
150 GOSUB 200
160 RETURN
200 ' turn off all LED
210 FOR I=1 TO 4 : OUT [I],0 : NEXT
220 WAIT D
220 RETURN
ラベルを利用すると、もっと見やすくなります。
10 ' winker
20 LET D,60 : GSB @LOFF
30 @LOOP
35 LET L,IN(1) : LET R,IN(2)
40 IF L=1 LET [1],1,2,3,4 : GSB @FLASH
50 IF R=1 LET [1],4,3,2,1 : GSB @FLASH
60 IF BTN() @EXIT
70 GOTO @LOOP
80 @EXIT
85 ? "EXIT"
90 END
100 @FLASH
110 OUT [1],0 : OUT [2],0 : OUT [3],0 : OUT [4],1 : WAIT D
120 OUT [1],0 : OUT [2],0 : OUT [3],1 : OUT [4],1 : WAIT D
130 OUT [1],0 : OUT [2],1 : OUT [3],1 : OUT [4],1 : WAIT D
140 OUT [1],1 : OUT [2],1 : OUT [3],1 : OUT [4],1 : WAIT D
150 GSB @LOFF
160 RTN
200 @LOFF
210 FOR I=1 TO 4 : OUT [I],0 : NEXT
220 WAIT D
220 RTN
OUT命令をBUS仕様で使うと、次のようにも書けます。
10 ' winker
20 LET D,60 : GSB @LOFF
30 @LOOP
35 LET L,IN(1) : LET R,IN(2)
40 IF L=1 LET [1],1,2,3,4 : GSB @FLASHL
50 IF R=1 LET [1],4,3,2,1 : GSB @FLASHR
60 IF BTN() @EXIT
70 GOTO @LOOP
80 @EXIT
85 ? "EXIT"
90 END
100 @FLASHL
110 OUT 8 : WAIT D
120 OUT 12 : WAIT D
130 OUT 14 : WAIT D
140 OUT 15 : WAIT D
150 GSB @LOFF
160 RTN
200 @FLASHR
210 OUT 15 : WAIT D
220 OUT 14 : WAIT D
230 OUT 12 : WAIT D
240 OUT 8 : WAIT D
250 GSB @LOFF
260 RETURN
300 @LOFF
310 OUT 0
320 WAIT D
320 RTN
目次
前
次