※この記事は「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