SHIROのIchigoJam日記

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

Advent Calendar

※この記事は「IchigoJam Advent Calendar 2023」に参加しています。

クリスマスに1日ずつ近づいてドキドキする「Advent Calendar」(アドベント・カレンダー)のプログラムを作ってみました。
IchigoJamにRTCモジュール(時計基板)をつないで、日時を読み取りながらカレンダーを表示します。
(RTCモジュール無し版プログラムもあります)

RTCモジュールは、こちらのDS3231を搭載した品。amazonやAliExpressなどで入手できます。


GND、+3.3V、SCL、SDAの4本の端子を接続します。IchigoJamのCN5ソケットとはSCL・SDAの配置が逆なので、クロス配線します。


12/24までは、上の3行のカレンダーが1日ずつ進んで表示されます。


12/25になると、下の大きな「25」が表示されます。

RTCモジュール設定プログラム

福野さんのプログラムです。年月日・時分秒を入力して、RTCモジュールに設定します。

1 'TIME SET
300 P=#707
310 INPUT"Y:20",X:GOSUB400
320 INPUT"M:",X:GOSUB400
330 INPUT"D:",X:GOSUB400
340 X=0:GOSUB400
350 INPUT"H:",X:GOSUB400
360 INPUT"M:",X:GOSUB400
370 INPUT"S:",X:GOSUB400
375 POKE #700,0
380 IF I2CW(#68,#700,1,#701,7) ERR
390 END
400 X=X/10*16+X%10:POKE P,X:P=P-1:RETURN

プログラム0:PCG文字設定

カレンダー用の「1」~「24」の数字を設定します。

10 '*ADVENT CALENDAR CHR SET
20 COPY 226*8,49*8,72
30 POKE 235*8,#26,#69,#29,#29,#29,#29,#76,0
40 POKE 236*8,#22,#66,#22,#22,#22,#22,#77,0
50 POKE 237*8,#26,#69,#21,#21,#26,#28,#7F,0
60 POKE 238*8,#26,#69,#21,#26,#21,#29,#76,0
70 POKE 239*8,#23,#65,#29,#29,#2F,#21,#71,0
80 POKE 240*8,#2F,#68,#2E,#21,#21,#29,#76,0
90 POKE 241*8,#26,#68,#2E,#29,#29,#29,#76,0
100 POKE 242*8,#2F,#69,#21,#22,#22,#24,#74,0
110 POKE 243*8,#26,#69,#29,#26,#29,#29,#76,0
120 POKE 244*8,#26,#69,#29,#29,#27,#21,#76,0
130 POKE 245*8,#66,#99,#19,#19,#29,#C9,#F6,0
140 POKE 246*8,#62,#96,#12,#12,#22,#C2,#F7,0
150 POKE 247*8,#66,#99,#11,#11,#22,#CC,#FF,0
160 POKE 248*8,#66,#99,#11,#16,#21,#C9,#F6,0
170 POKE 249*8,#63,#95,#19,#19,#2F,#C1,#F1,0
180 LRUN FILE()+1

プログラム1:カレンダー表示

プログラム0とプログラム1は、ファイル0とファイル1など、連続した番号のファイルに置いてください。
ファイル0とファイル1に置いた場合は「LRUN 0」で実行します。

10 '*ADVENT CALENDAR
20 GSB @TIMEREAD
30 @LOOP
40 GSB @CAL:E=D
50 IF M=12 && D<25 LC (D-1)%8*2,(D-1)/8,1
60 GSB @TIMEREAD:IF E=D CONT
70 GOTO @LOOP
80 @CAL
90 VIDEO 3:CLS
100 FOR P=1 TO 24
110 IF M=12 && P<=D ?CHR$(225+P); ELSE ?CHR$(255);
120 ?" ";
130 NEXT
140 IF M<12 OR D<25 LC 0,4:FOR Z=1 TO 112:?CHR$(255);:NEXT:RTN
150 FOR Z=0 TO 7
160 W=PEEK(50*8+Z):N=128
170 LC 0,4+Z
180 FOR B=0 TO 6
190 IF W&N>0 ?CHR$(1); ELSE ?CHR$(0);
200 N=N>>1
210 NEXT
220 NEXT
230 FOR Z=0 TO 6
240 W=PEEK(53*8+Z):N=128
250 LC 8,4+Z
260 FOR B=0 TO 7
270 IF W&N>0 ?CHR$(1); ELSE ?CHR$(0);
280 N=N>>1
290 NEXT
300 NEXT
310 RTN
320 @TIMEREAD
330 POKE #700,0
340 IF I2CR(#68,#700,1,#701,7) ERR
350 X=PEEK(#706)
360 M=X>>4*10+X&15
370 X=PEEK(#705)
380 D=X>>4*10+X&15
390 RTN

プログラム1:RTCモジュール無し版

実行すると日付を聞かれるので、今日の日付(1~31)を入力します。今日のアドベントカレンダーが表示されます。
毎日の起動時に日付を指定してください。

10 '*ADVENT CALENDAR
20 INPUT "DAY=?",D
30 @LOOP
40 GSB @CAL:E=D
50 IF D<25 LC (D-1)%8*2,(D-1)/8,1
60 WAIT 60
70 GOTO @LOOP
80 @CAL
90 VIDEO 3:CLS
100 FOR P=1 TO 24
110 IF P<=D ?CHR$(225+P); ELSE ?CHR$(255);
120 ?" ";
130 NEXT
140 IF D<25 LC 0,4:FOR Z=1 TO 112:?CHR$(255);:NEXT:RTN
150 FOR Z=0 TO 7
160 W=PEEK(50*8+Z):M=128
170 LC 0,4+Z
180 FOR B=0 TO 6
190 IF W&M>0 ?CHR$(1); ELSE ?CHR$(0);
200 M=M>>1
210 NEXT
220 NEXT
230 FOR Z=0 TO 6
240 W=PEEK(53*8+Z):M=128
250 LC 8,4+Z
260 FOR B=0 TO 7
270 IF W&M>0 ?CHR$(1); ELSE ?CHR$(0);
280 M=M>>1
290 NEXT
300 NEXT
310 RTN