#include <SPI.h>
#define btndebounce 100
#define led 2
// 74HC165 bağlantıları
#define load 25 // PL pin 1
#define clock 26 // CP pin 2
#define dataIn 27 // Q7 pin 9
// 74HC595 bağlantıları
#define latch 32 // STCP pin 12
#define dataOut 33 // DS pin 14
uint32_t lastSwitchPress = 0;
uint32_t CurrentSwitchPress = 0;
uint32_t outputsUpdate = 0;
void setup()
{
Serial.begin(115200);
pinMode(load, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(dataIn, INPUT);
pinMode(latch, OUTPUT);
pinMode(dataOut, OUTPUT);
pinMode(led, OUTPUT);
digitalWrite(led, HIGH); // LED başlangıçta kapalı (ters bağlıysa)
}
void loop()
{
SN74165Control();
}
void SN74165Control() {
CurrentSwitchPress = millis();
if (CurrentSwitchPress - lastSwitchPress > btndebounce) {
digitalWrite(load, LOW);
digitalWrite(load, HIGH);
uint16_t incoming = shift16In(dataIn, clock, MSBFIRST);
if (incoming > 0) {
outputsUpdate ^= incoming;
digitalWrite(latch, LOW);
shift16Out(dataOut, clock, MSBFIRST, outputsUpdate);
digitalWrite(latch, HIGH);
// LED kontrolü (bit 0'e göre)
if (outputsUpdate & (1 << 0)) {
digitalWrite(led, LOW); // LED açık (ters bağlı)
} else {
digitalWrite(led, HIGH); // LED kapalı
}
Serial.print("Pin States:\r\n");
Serial.println(outputsUpdate, BIN);
}
lastSwitchPress = CurrentSwitchPress;
}
}
uint16_t shift16In(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
uint16_t value = 0;
for (uint8_t i = 0; i < 16; ++i) {
if (bitOrder == LSBFIRST)
value |= digitalRead(dataPin) << i;
else
value |= digitalRead(dataPin) << (15 - i);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
return value;
}
void shift16Out(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint16_t val) {
for (uint16_t i = 0; i < 16; i++) {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (15 - i))));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}