#include <Arduino.h>
// Output shift register pins
constexpr uint8_t outClk = 27;
constexpr uint8_t outData = 13;
constexpr uint8_t outLatch = 14;
// Input shift register pins
constexpr uint8_t inClk = 17;
constexpr uint8_t inData = 5;
constexpr uint8_t inLatch = 16;
// Delay constant
constexpr uint8_t wt = 20;
// Forward declarations
uint8_t ReadInput();
void WriteOutput(uint32_t);
uint8_t debounce();
void setup() {
pinMode(outClk, OUTPUT);
pinMode(outData, OUTPUT);
pinMode(outLatch, OUTPUT);
pinMode(inClk, OUTPUT);
pinMode(inData, INPUT);
pinMode(inLatch, OUTPUT);
digitalWrite(inLatch, HIGH);
digitalWrite(inClk, LOW);
digitalWrite(outClk, LOW);
digitalWrite(outData, LOW);
digitalWrite(outLatch, LOW);
Serial.begin(115200);
}
// Button debouncing: returns 255 on timeout
uint8_t debounce() {
uint32_t startTime = millis();
uint8_t first = ReadInput();
delay(10);
if (first == ReadInput()) return first;
while (millis() - startTime < 1000) {
first = ReadInput();
delay(10);
if (first == ReadInput()) return first;
}
return 255; // Timeout
}
void loop() {
union {
uint32_t val = 0;
struct {
uint32_t dummy : 16;
bool Led[8];
};
} outputs;
union {
uint8_t val = 0;
struct {
bool Btn[8];
};
} inputs, oldInputs;
uint8_t cnt = 0;
const uint8_t to7digits[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
uint8_t digits = 0;
while (true) {
// Rotate 4-bit digit pattern
digits = ((digits << 1) | ((digits & 0x08) ? 1 : 0)) & 0x0F;
inputs.val = debounce();
if (inputs.val != oldInputs.val) {
if (inputs.Btn[0] && cnt < 9) cnt++;
if (inputs.Btn[1] && cnt > 0) cnt--;
Serial.print("Inputs: "); Serial.print(inputs.val);
Serial.print(" | Old: "); Serial.print(oldInputs.val);
Serial.print(" | Cnt: "); Serial.println(cnt);
}
uint32_t outputVal =
(static_cast<uint32_t>(inputs.val) << 16) |
(static_cast<uint32_t>(digits) << 8) |
static_cast<uint32_t>(to7digits[cnt]);
WriteOutput(outputVal);
oldInputs = inputs;
}
}
uint8_t ReadInput() {
uint8_t data = 0;
digitalWrite(inLatch, HIGH);
digitalWrite(inLatch, LOW);
digitalWrite(inLatch, HIGH);
for (uint8_t i = 0; i < 8; ++i) {
data <<= 1;
data |= digitalRead(inData);
digitalWrite(inClk, HIGH);
digitalWrite(inClk, LOW);
}
return ~data;
}
void WriteOutput(uint32_t data) {
digitalWrite(outLatch, LOW);
for (int8_t i = 23; i >= 0; --i) {
digitalWrite(outData, (data >> i) & 0x01);
digitalWrite(outClk, HIGH);
digitalWrite(outClk, LOW);
}
digitalWrite(outLatch, HIGH);
}