目次

方向指示器(その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


目次

inserted by FC2 system