#include <Arduino.h>
#include <bitset>
#include <iostream>
constexpr auto outClk = 27;
constexpr auto outData = 13;
constexpr auto outLatch = 14;
constexpr auto inClk = 17;
constexpr auto inData = 5;
constexpr auto inLatch = 16;
constexpr auto wt = 20;
uint8_t ReadInput(void);
void WriteOutput(uint32_t);
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(inData, HIGH);
digitalWrite(outClk, LOW);
digitalWrite(outData, LOW);
digitalWrite(outLatch, LOW);
Serial.begin(115200);
digitalWrite(inLatch, HIGH);
}
uint8_t debounce(void)
{
bool debounce = false;
uint32_t wait{millis()};
while(!debounce){
uint8_t tmp = ReadInput();
delay(10);
if(tmp == ReadInput()) {
debounce = true;
return tmp;
}
if((millis() - wait) > 1000) return 255;
}
}
uint8_t ReadInput(void)
{
uint8_t data{0};
digitalWrite(inLatch, HIGH);
digitalWrite(inLatch, LOW);
digitalWrite(inLatch, HIGH);
for(uint8_t i = 0; i < 7; i++)
{
data |= digitalRead(inData);
data <<= 1;
digitalWrite(inClk, HIGH);
digitalWrite(inClk, LOW);
}
data |= digitalRead(inData);
return ~data; //inverted bits
}
void WriteOutput(uint32_t data)
{
digitalWrite(outClk, LOW);
digitalWrite(outLatch, LOW);
for(uint8_t i = 0; i < 24; i++){
(data & (1 << 23))?(digitalWrite(outData, HIGH)):(digitalWrite(outData, LOW));
digitalWrite(outClk, HIGH);
digitalWrite(outClk, LOW);
data <<= 1;
}
//Serial.println(data,BIN);
digitalWrite(outLatch, HIGH);
digitalWrite(outLatch, LOW);
}
void loop() {
union{
uint32_t val{0};
struct{
uint32_t dummy1:16;
bool Led0:1;
bool Led1:1;
bool Led2:1;
bool Led3:1;
bool Led4:1;
bool Led5:1;
bool Led6:1;
bool Led7:1;
};
}outputs;
union Inputs{
uint8_t val{0};
struct{
bool Btn0:1;
bool Btn1:1;
bool Btn2:1;
bool Btn3:1;
bool Btn4:1;
bool Btn5:1;
bool Btn6:1;
bool Btn7:1;
};
};
Inputs inputs, oldinputs;
uint8_t cnt = 0;
uint8_t to7digits[]{0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
uint8_t to7point{0x80};
uint8_t digits{0};
while(1){
digits = 0x0F & (digits << 1) + ((digits & 0x08)==true);
inputs.val = debounce();
if(inputs.val != oldinputs.val){
if(inputs.Btn0 && (cnt < 9)) cnt++;
if(inputs.Btn1 && (cnt > 0)) cnt--;
}
WriteOutput((static_cast<uint32_t>(inputs.val) << 16) | static_cast<uint32_t>(digits << 8) | static_cast<uint32_t>(to7digits[cnt]));
Serial.println(inputs.val);
oldinputs = inputs;
}
}