
以前 紹介したMulti Function Shieldで,7セグLEDデジタル時計を作ってみました。
前回のシールドはシフトレジスタ74HC595が1個,7セグLEDはカソードコモンでしたが,今回のは74HC595が2個,7セグLEDはアノードコモンです。
どう配線されているかと言うと,こんな感じ↓

桁選択用74HC595のSDOから数字表示用74HC595のSDIに配線されてますから,Shiftoutでデータを送るときは,数字表示用のデータを先に送らないといけません。
で,スケッチはこれです→ 20190908_ks0184_tokei.ino
/*
Multi_function_shield
RTC DS3231 7セグLEDデジタル時計
*/
#include <Wire.h>
#include <RtcDS3231.h>
RtcDS3231<TwoWire>
Rtc(Wire);
const int latch = 4; // Latchピン
const int clock = 7; // Clockピン
const int data = 8; // Serial Data In ピン
const byte digit[] = //7seg 点灯パターン(アノードコモン)
{
B11000000, // 数字 0
B11111001, // 1
B10100100, // 2
B10110000, // 3
B10011001, // 4
B10010010, // 5
B10000010, // 6
B11011000, // 7
B10000000, // 8
B10010000 // 9
};
const byte segment[] =
{
B00001000, //1桁め
B00000100, //2桁め
B00000010, //3桁め
B00000001 //4桁め
};
void setup() {
pinMode(latch, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(data, OUTPUT);
Rtc.Begin() ;
// DS3231の日時を「それなりの値」に設定する場合に、以下の2行をコメントアウト
// RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__) ;
// Rtc.SetDateTime(compiled) ;
}
void loop() {
RtcDateTime dt = Rtc.GetDateTime() ;
Disp(3,dt.Hour()/10%10);
Disp(2,dt.Hour()%10);
Disp(1,dt.Minute()/10%10);
Disp(0,dt.Minute()%10);
}
void Disp(byte keta,byte value){
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST,digit[value]);
if (keta == 2) {
shiftOut(data, clock, MSBFIRST, digit[value]&B01111111); //hhとmmの間に小数点をつける
}
shiftOut(data, clock, MSBFIRST, segment[keta]);
digitalWrite(latch, HIGH);
delay(4);
}
