#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;
uint32_t outputsUpdate = 0; // 24-bitlik çıkış durumu
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);
uint32_t incoming = shift24In(dataIn, clock, MSBFIRST);
if (incoming > 0) {
outputsUpdate ^= incoming; // Toggle mantığı
digitalWrite(latch, LOW);
shift24Out(dataOut, clock, MSBFIRST, outputsUpdate);
digitalWrite(latch, HIGH);
Serial.print("Button States (binary): ");
Serial.println(outputsUpdate, BIN);
}
lastSwitchPress = CurrentSwitchPress;
}
}
uint32_t shift24In(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
uint32_t value = 0;
for (int i = 0; i < 24; i++) {
if (bitOrder == LSBFIRST)
value |= ((uint32_t)digitalRead(dataPin) << i);
else
value |= ((uint32_t)digitalRead(dataPin) << (23 - i));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
return value;
}
void shift24Out(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint32_t val) {
for (int i = 0; i < 24; i++) {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (23 - i))));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}