SHIROのIchigoJam日記

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

IchigoJam時計

秋月電子のシフトレジスタ(74HC595)付き7セグメントLEDモジュールを使って、IchigoJam時計を作ってみました。


【IchigoJam】IchigoJam時計

7セグメント4個に配線するのは大変なので、オリジナルシールド基板を作りました。

f:id:shiro0922:20190514100544p:plain

IchigoJamからは3本の出力でシリアル制御します。

  • OUT1:Serial(シリアル信号、1=LEDオン、0=LEDオフ)
  • OUT2:Clock(信号を1段階転送)
  • OUT3:Latch(ラッチ。7セグメントLEDへ出力して、その状態を保持)
  • OUT6:中央のコロン「:」

各モジュールのSDO→SDIをつなぐことで、1桁目→2桁目→3桁目→4桁目へバケツリレー式に信号が送られるので、IchigoJamからは1桁目のSDIへひたすら信号を送ればOKです。
最後にラッチ信号を送れば、シフトレジスタのラッチ回路で保持されて出力されるので、IchigoJam側はダイナミック動作などをやらなくて済みます。


基板データ

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

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

材料

プログラム

簡単プログラム

30行で初期時刻(時、分)を変数にセットして、TICK()で時間をカウント。
これでも10分で1秒くらいのずれなので、プログラミング教室で簡単に作るには充分です。

10 '*CLOCK
20 CLV:VIDEO 0
30 H=12:M=34
40 [0]=`0111111
50 [1]=`0000110
60 [2]=`1011011
70 [3]=`1001111
80 [4]=`1100110
90 [5]=`1101101
100 [6]=`1111101
110 [7]=`0100111
120 [8]=`1111111
130 [9]=`1101111
140 @LOOP
150 GSB @PRT
160 CLT
170 @COLON
180 T=TICK()
190 OUT 6,T%60<30
200 IF T<3600 GOTO @COLON
210 M=M+1
220 IF M>59 M=0:H=H+1
230 IF H>23 H=0
240 GOTO @LOOP
250 @PRT
260 N=H/10:GSB @SENDN
270 N=H%10:GSB @SENDN
280 N=M/10:GSB @SENDN
290 N=M%10:GSB @SENDN
300 OUT 3,1:OUT 3,0
310 RTN
320 @SENDN
330 F=[N]
340 FOR I=0 TO 7
350 OUT 1,F&#80
360 OUT 2,1:OUT 2,0
370 F=F*2
380 NEXT
390 RTN

7セグメントLEDモジュールへの出力は、数字フォントの7ビット(上位)→0ビット(下位)の順で、1ビットずつシリアル転送します。
(40~130行のフォントデータでは7ビット目を設定していませんが、7セグメントLEDでは小数点なので「0」でオフ)

※フォントデータは、2進数で「`gfedcba」の順。1=ON、0=OFF。

OUT1(Serial)にビットをセットして、OUT2(Clock)へパルスを送ると、1ビット転送されます(350~360行)。
以上を8ビット分くりかえし(340~380行)。
以上を時2桁、分2桁の4桁分くりかえし(260~290行)。
最後にOUT3(Latch)へパルスを送って(300行)、7セグメントLEDへ表示します。
ラッチ回路で出力状態が保持されるので、IchigoJam側は他の処理ができます。

RTCモジュールを使用


IchigoJamのCN5ソケットにRTCモジュールをつないで、現在時刻を読み取り。
正確に時刻をカウントできて、電源を切っても時刻が消えません。

10 '*CLOCK RTC
20 CLV:VIDEO 0
30 GSB @TIMEREAD
40 [0]=`0111111
50 [1]=`0000110
60 [2]=`1011011
70 [3]=`1001111
80 [4]=`1100110
90 [5]=`1101101
100 [6]=`1111101
110 [7]=`0100111
120 [8]=`1111111
130 [9]=`1101111
140 @LOOP
150 GSB @PRT
160 CLT
170 @COLON
180 T=TICK()
190 OUT 6,T%60<30
200 J=M
210 GSB @TIMEREAD
220 IF J=M GOTO @COLON
230 GOTO @LOOP
240 @PRT
250 N=H/10:GSB @SENDN
260 N=H%10:GSB @SENDN
270 N=M/10:GSB @SENDN
280 N=M%10:GSB @SENDN
290 OUT 3,1:OUT 3,0
300 RTN
310 @SENDN
320 F=[N]
330 FOR I=0 TO 7
340 OUT 1,F&#80
350 OUT 2,1:OUT 2,0
360 F=F*2
370 NEXT
380 RTN
390 @TIMEREAD
400 POKE #700,0
410 IF I2CR(#68,#700,1,#701,7) ERR
420 X=PEEK(#703)
430 H=X>>4*10+X&15
440 X=PEEK(#702)
450 M=X>>4*10+X&15
460 RTN
RTCモジュール時刻設定

福野さんのプログラムをそのまま使わせていただきました。
CN5への接続方法もそちらに書かれています。

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