SHIROのIchigoJam日記

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

LEDマトリックススキャン

IchigoJamに差して、8×8のLEDマトリックスをスキャン表示する拡張基板を作りました。
IchigoJam Rを想定して作りましたが、IchigoJam Sでも表示できます。
動画はこちら。

www.youtube.com

※2021/9/19 IchigoDakeにも対応して横型の基板に変更

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

f:id:shiro0922:20210919164940p: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列が吸い込み電流で点灯)

※2021/9/19追記
IchigoJam Sのファームウェア1.4.3だと、OUT11(IN4)の動作がおかしく、LEDマトリックスをちゃんとスキャンできません。ファームウェア1.4.2ではちゃんと動きます。
→この問題を修正したファームウェア1.4β29が公開されました。こちらに更新することをお勧めします。

基板データ

※2021/9/19 横型基板に変更
f:id:shiro0922:20210919165056p:plain

*同じ基板を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

文字列フロー表示(※2021/9/19追加)


www.youtube.com
40行で指定した文字列を、右から左へ流して表示します。

10 '*Matrix String Flow
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 F=0 TO 7
90 M=128>>F
100 FOR B=0 TO 7
110 D=PEEK(A+B)
120 [B]=([B]<<1)+((D&M)>0)
130 [B]=[B]&255
140 NEXT
150 FOR T=1 TO 10
160 FOR Z=0 TO 7
170 OUT [Z]+256*Z
180 NEXT
190 NEXT
200 NEXT
210 NEXT
220 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の値を変えると、全体のスピードが変わります。IchigoJam Sで動かす時は、Wの値を小さくしてください。