#include <SPI.h>
#define btndebounce 100
#define load 25 // 74HC165 PL
#define clock 26 // Ortak clock pini
#define dataIn 27 // 74HC165 Q7
#define latch 32 // 74HC595 ST_CP
#define dataOut 33 // 74HC595 DS
uint32_t lastSwitchPress = 0;
uint32_t CurrentSwitchPress = 0;
uint8_t outputsUpdate = 0; // Artık sadece 8-bit yeterli
void setup() {
Serial.begin(115200);
pinMode(load, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(dataIn, INPUT);
pinMode(latch, OUTPUT);
pinMode(dataOut, OUTPUT);
}
void loop() {
SN74165Control();
}
void SN74165Control() {
CurrentSwitchPress = millis();
if (CurrentSwitchPress - lastSwitchPress > btndebounce) {
digitalWrite(load, LOW);
delayMicroseconds(5);
digitalWrite(load, HIGH);
uint8_t incoming = shift8In(dataIn, clock, MSBFIRST);
if (incoming > 0) {
outputsUpdate ^= incoming; // Toggle mantığı
digitalWrite(latch, LOW);
shift8Out(dataOut, clock, MSBFIRST, outputsUpdate);
digitalWrite(latch, HIGH);
Serial.print("Button States (binary): ");
Serial.println(outputsUpdate, BIN);
}
lastSwitchPress = CurrentSwitchPress;
}
}
uint8_t shift8In(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
uint8_t value = 0;
for (int i = 0; i < 8; i++) {
if (bitOrder == LSBFIRST)
value |= (digitalRead(dataPin) << i);
else
value |= (digitalRead(dataPin) << (7 - i));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
return value;
}
void shift8Out(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) {
for (int i = 0; i < 8; i++) {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (7 - i))));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}