#include <SPI.h>
class HC165_SPI {
private:
uint8_t _loadPin;
SPISettings _settings;
public:
// Standard-Takt von 4MHz, MSB First (typisch für 74er-Serie), Mode 0
HC165_SPI(uint8_t loadPin) : _loadPin(loadPin), _settings(4000000, MSBFIRST, SPI_MODE0) {}
void begin() {
pinMode(_loadPin, OUTPUT);
digitalWrite(_loadPin, HIGH);
SPI.begin();
}
uint8_t read() {
// 1. Parallel Load: Eingänge einfrieren (Latch)
// Ein kurzer Puls auf LOW lädt die Daten in das Schieberegister
digitalWrite(_loadPin, LOW);
delayMicroseconds(1); // Kurze Zeit für die Hardware (reicht bei 74HC locker)
digitalWrite(_loadPin, HIGH);
// 2. Daten über SPI einlesen
SPI.beginTransaction(_settings);
// Wir senden "0", um 8 Takte zu generieren und das Ergebnis zu empfangen
uint8_t data = SPI.transfer(0x00);
SPI.endTransaction();
return data;
}
};
// Instanz erstellen (Latch-Pin an D10)
HC165_SPI myRegister(10);
void setup() {
Serial.begin(9600);
myRegister.begin();
}
void loop() {
uint8_t value = myRegister.read();
Serial.print("Eingelesene Daten: ");
Serial.println(value, BIN);
delay(500);
}