SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

LEDマトリックススキャン

IchigoJam Rの速度を活かして、8×8のマトリックスLEDをスキャン表示する基板を作りました。
動画はこちら。

www.youtube.com

f:id:shiro0922:20210707211222j:plain

f:id:shiro0922:20210629110431p:plain
配線の数は多いですが、頑張ればブレッドボードでも組める回路です。

f:id:shiro0922:20210708005119p:plain
OUT1~OUT8で1行分のドットデータを出力、OUT9~OUT11(IN2~IN4)で8行分のスキャンをしています。
※動画内の説明画像で、OUT1~OUT8のドット配置が上下逆になっていました。すみません。上の画像の配置が正しいです。
スキャン信号は3to8ラインデコーダIC・74HC138を使って、3ビット→8ビットに変換しています。
f:id:shiro0922:20210629113042p:plain
OUT9~OUT11(入力A~C)の3ビットで0~7を入力すると、出力Y0~Y7の指定した番号だけが0になります。この8ビット出力をLEDマトリックスのカソードにつないで、行方向へスキャンしています。(0を出力したLED列が吸い込み電流で点灯)

基板データ

*同じ基板を2枚配置しています。
*この基板データは、CC BYライセンスとします。どうぞご利用ください。

(C) 2021 Shiro Saito (https://www.ichigojaman.jp)

プログラム

LEDマトリックスをスキャン表示すると、ビデオ画面の表示が乱れます。
そのため以下のプログラムでは、最初に「VIDEO 0」で画面表示を止めています。
プログラムを終了した後は、F8キー(VIDEO 1)を押して画面表示を復活させてください。

1文字表示

40行で指定した1文字を、LEDマトリックスにスキャン表示します。
配列変数[0]~[7]に文字のドットデータを展開して(60~80行)、そのデータをスキャンして出力しています(90~140行)。
120行「'WAIT 10」のアポストロフィ(')を外して実行すると、スキャン表示の様子がよくわかります。

10 '*Matrix Chr
20 CLV:VIDEO 0
30 FOR P=1 TO 11:OUT P,0:NEXT
40 C=ASC("A")
50 A=C*8
60 FOR B=0 TO 7
70 [B]=PEEK(A+B)
80 NEXT
90 @LOOP
100 FOR Z=0 TO 7
110 OUT [Z]+256*Z
120 'WAIT 10
130 NEXT
140 GOTO @LOOP

文字列表示

40行で指定した文字列を、1文字0.5秒ずつ順番に表示します。

10 '*Matrix String
20 CLV:VIDEO 0
30 FOR P=1 TO 11:OUT P,0:NEXT
40 S="IchigoJam "
50 @LOOP
60 FOR X=0 TO LEN(S)-1
70 A=PEEK(S+X)*8
80 FOR B=0 TO 7
90 [B]=PEEK(A+B)
100 NEXT
110 CLT
120 @CHR
130 FOR Z=0 TO 7
140 OUT [Z]+256*Z
150 NEXT
160 IF TICK()<30 GOTO @CHR
170 OUT 0
180 NEXT
190 GOTO @LOOP

連打ゲーム

実行すると「3」「2」「1」とダウンカウントした後、64個のLEDが全て点灯します。
スペースキーを連打して、64個のドットを全部消してください。
全部消すとタイム(秒数)が1文字ずつ画面に表示されます。スペースキーを押すとリプレイします。

10 '*Renda64
20 CLV:VIDEO 0
30 FOR P=1 TO 11:OUT P,0:NEXT
40 FOR N=3 TO 1 STEP -1
50 BEEP:W=60:GSB @PRTN
60 NEXT
70 D=255
80 FOR B=0 TO 7
90 [B]=D
100 NEXT
110 CLT
120 FOR X=0 TO 7
130 D=D>>1
140 FOR Y=0 TO 7
150 GSB @PRTMAT:IF !BTN(32) CONT
160 GSB @PRTMAT:IF BTN(32) CONT
170 [Y]=D
180 NEXT
190 NEXT
200 T=TICK()/6:IF T>999 T=999
210 OUT 0
220 BEEP 10,30:WAIT 30
230 W=60:CLK
240 @TIME
250 IF T>99 N=T/100:GSB @PRTN
260 IF INKEY()=32 RUN
270 N=T%100/10:GSB @PRTN
280 IF INKEY()=32 RUN
290 N=-2:GSB @PRTN
300 IF INKEY()=32 RUN
310 N=T%10:GSB @PRTN
320 IF INKEY()=32 RUN
330 N=-16:GSB @PRTN
340 IF INKEY()=32 RUN
350 GOTO @TIME
360 @PRTN
370 A=(N+48)*8
380 FOR B=0 TO 7
390 [B]=PEEK(A+B)
400 NEXT
410 CLT
420 GSB @PRTMAT:IF TICK()<W CONT
430 RTN
440 @PRTMAT
450 FOR Z=0 TO 7
460 OUT [Z]+256*Z
470 NEXT
480 RTN

かわくだり

自分のキャラ(一番上のドット)をカーソルキーの左右で動かして、下から流れてくる岩をよけてください。
岩に当たるとゲームオーバーで、下った秒数がドットで表示されます。
スペースキーを押すとリプレイします。

10 '*KAWAKUDARI
20 CLV:VIDEO 0:CLT:W=40:X=4
30 FOR P=1 TO 11:OUT P,0:NEXT
40 @LOOP
50 X=X-BTN(29)+BTN(28)
60 X=X&7:Z=1<<X
70 COPY #800,#802,14
80 [7]=1<<RND(8)
90 IF [0]&Z GOTO @GOVER
100 [0]=Z
110 FOR I=1 TO W
120 GSB @PRT
130 NEXT
140 GOTO @LOOP
150 @GOVER
160 T=TICK()/60
170 BEEP 30,30
180 FOR I=1 TO 10*W
190 GSB @PRT
200 NEXT
210 CLK
220 FOR Y=0 TO 7
230 [Y]=0
240 FOR B=0 TO 7
250 S=S+1
260 IF T>=S [Y]=[Y]<<1+1
270 NEXT
280 NEXT
290 GSB @PRT:IF !INKEY() CONT
300 RUN
310 @PRT
320 FOR Y=0 TO 7
330 OUT [Y]+256*Y
340 NEXT
350 RTN

オリジナルのかわくだりはWAITで速さを調節していますが、このプログラムでWAITするとLEDスキャン表示が止まってしまうので、スキャン表示サブルーチンを繰り返し呼んで時間待ちしています(110~130行)。20行の「W=40」でWの値を変えると、全体のスピードが変わります。