#include <SPI.h>
#include <Streaming.h>
#include <digitalWriteFast.h>
Print &cout {Serial};
using Segments_t = byte[11];
// 0 1 2 3 4 5 6 7 8 9 Dot
constexpr Segments_t segments {0x5F,0x06,0x3B,0x2F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80};
constexpr byte latchPin {10};
void writeShiftRegister(byte value) {
digitalWriteFast (latchPin, LOW);
SPI.transfer( value );
digitalWriteFast (latchPin, HIGH);
}
//
// Gebe den Index eines gefundenen Wertes im Array zurück.
// Wurde der Wert nicht gefunden, wird 0xFF zurück gegeben.
//
byte checkSegment(const Segments_t &segmentArray, byte segment) {
byte i = 0;
for (const byte seg : segmentArray) {
if (seg == segment) { return i; }
++i;
}
return 0xFF;
}
void setup() {
Serial.begin(115200);
SPI.begin();
cout << F("Start...\n");
pinMode(latchPin, OUTPUT);
//
// Gehe das Array mit den Bitmustern durch und
// vergleiche die Werte mit sich selbst (Demo -> Position = Ziffer)
//
for (const byte seg : segments) {
cout << F("0x");
if (seg < 0x10) cout << F("0");
cout << _HEX(seg) << F(" entpricht Ziffer: ");
byte number = checkSegment(segments, seg);
number == 10 ? cout << "Dot" : cout << number;
cout << endl;
}
}
void loop() {
static byte digit {0};
writeShiftRegister(segments[digit]);
digit = (digit+1) % sizeof(Segments_t);
delay(1000);
}