SHIROのIchigoJam日記

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

時計シールド2025

以前にIchigoJam用の時計シールド(拡張基板)を作ったのですが、
www.ichigojaman.jp
カウンタIC・4026内蔵の7セグメントLEDが入手できなくなってしまったので、シフトレジスタ内蔵の7セグメントLEDを使ったシールドを新たに作りました。

7セグメントLED×4桁で、時:分を表示できます。
RTCモジュールを載せているので、IchigoJamの電源を切っても正確な時間を保持します。
また、ジョイスティックやボタンも載せているので、それらで設定するアラーム機能なども搭載できます。

回路図


シフトレジスタ・74595を内蔵した7セグメントLEDモジュール×4桁を、IchigoJamのポートにつないでいます。
つなぎ方は以下のとおりです。

OUT1 分データ
OUT2 分クロック
OUT3 時データ
OUT4 時クロック
OUT5 分~OE(0=表示、1=消灯)
OUT6 時~OE(0=表示、1=消灯)
OUT8(IN1) ラッチクロック
BTN ボタン(タクトスイッチ)
LED LED
IN2(ANA2) ジョイスティック垂直方向

基板データ

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

(C) 2025 Shiro Saito (https://www.ichigoaman.jp)

プログラム

時刻設定プログラム

以前に福野さんが公開した、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

時計プログラム

基本的な時計プログラムです。7セグメントLEDで時:分を表示します。
モニタでは時:分:秒を表示します。

10 @ARUN:'*CLOCK
20 CLV:VIDEO 3:CLS:CLO
30 [0]=`11111100
40 [1]=`01100000
50 [2]=`11011010
60 [3]=`11110010
70 [4]=`01100110
80 [5]=`10110110
90 [6]=`10111110
100 [7]=`11100100
110 [8]=`11111110
120 [9]=`11110110
130 @LOOP
140 GSB @TREAD
150 GSB @PRTIME
160 WAIT 6
170 GOTO @LOOP
180 @PRTIME
190 D=1:C=2:E=M
200 GSB @PRDIGIT
210 D=3:C=4:E=H
220 GSB @PRDIGIT
230 LC 0:?DEC$(H+100,2);":";DEC$(M+100,2);":";DEC$(S+100,2)
240 RTN
250 @PRDIGIT
260 F=[E/10]:GSB @PRSEG
270 F=[E%10]:GSB @PRSEG
280 OUT 8,1:OUT 8,0
290 RTN
300 @PRSEG
310 B=1:FOR I=1 TO 8
320 OUT D,(F&B)>0
330 OUT C,1:OUT C,0
340 B=B<<1
350 NEXT
360 RTN
370 @TREAD
380 POKE#700,0
390 I=I2CR(#68,#700,1,#701,7)
400 H=PEEK(#703):H=H>>4*10+H&15
410 M=PEEK(#702):M=M>>4*10+M&15
420 S=PEEK(#701):S=S>>4*10+S&15
430 RTN

300~360行が7セグメントモジュールで数字を表示する部分です。シフトレジスタ制御なので、データポートに0(消灯)/1(点灯)をセットして、クロックポートにクロックパルスを送って1ビット送信します。それを8回繰り返して、8ビット=数字1桁分のデータをバケツリレー式に送ります。2桁の数字表示データを送ったら、最後にOUT8へラッチクロックを送って(280行)点灯させます。

アラームクロック


基本的な時計プログラムに、アラーム機能を追加しました。
プログラム容量がギリギリなので、かなり圧縮したプログラムになっています。

アラーム設定方法
  • 時計表示中にボタンを押すと、アラームセットモードになります。
  • 最初に時設定になるので、ジョイスティック上下で数字を設定して、ボタンを押します。
  • 次に分設定になるので、ジョイスティック上下で数字を設定して、ボタンを押します。
  • アラームを設定すると、モニタ画面に設定したアラーム時:分が表示されます。
  • 設定した時刻になるとアラームが鳴ります。ボタンを押すと止まります。

※電源を切るとアラーム設定時刻は消えてしまいます。
※アラームを一度止めると、翌日の同じ時刻には鳴りません。

10 @ARUN:'*ALARM CLOCK
20 CLV:VIDEO3:CLS:CLO
30 [0]=`11111100
40 [1]=`01100000
50 [2]=`11011010
60 [3]=`11110010
70 [4]=`01100110
80 [5]=`10110110
90 [6]=`10111110
100 [7]=`11100100
110 [8]=`11111110
120 [9]=`11110110
130 GSB310:GSB170
140 IFBTN()GSB370
150 IFH=X&&M=Y&&AGSB480
160 WAIT6:GOTO130
170 D=1:C=2:E=M:GSB210
180 D=3:C=4:E=H:GSB210
190 LC 0:?DEC$(H+100,2);":";DEC$(M+100,2);":";DEC$(S+100,2)
200 RTN
210 F=[E/10]:GSB250
220 F=[E%10]:GSB250
230 OUT8,1:OUT8,0
240 RTN
250 B=1:FORI=1TO8
260 OUTD,(F&B)>0
270 OUTC,1:OUTC,0
280 B=B<<1
290 NEXT
300 RTN
310 POKE#700,0
320 I=I2CR(#68,#700,1,#701,7)
330 H=PEEK(#703):H=H>>4*10+H&15
340 M=PEEK(#702):M=M>>4*10+M&15
350 S=PEEK(#701):S=S>>4*10+S&15
360 RTN
370 OUT5,1:WAIT30
380 D=3:C=4:E=X:GSB210
390 J=ANA(2):X=X-(J>768)*(X>0)+(J<256)*(X<23)
400 WAIT10:IF!BTN()GOTO380
410 OUT5,0:OUT6,1:WAIT30
420 D=1:C=2:E=Y:GSB210
430 J=ANA(2):Y=Y-(J>768)*(Y>0)+(J<256)*(Y<59)
440 WAIT10:IF!BTN()GOTO420
450 OUT6,0
460 LC0,2:?X;":";Y:A=1
470 RTN
480 A=0:BEEP10,30:WAIT40:IF!BTN()CONT
490 RTN