// 引脚定义
const int dataPin1 = 0; /* 第一块74HC165的Q7 */
const int clockPin1 = 1; /* 第一块74HC165的CP */
const int latchPin1 = 2; /* 第一块74HC165的PL */
const int dataPin2 = 3; /* 第二块74HC165的Q7 */
const int clockPin2 = 4; /* 第二块74HC165的CP */
const int latchPin2 = 5; /* 第二块74HC165的PL */
const int dataPin595 = 6; /* 74HC595的DS */
const int latchPin595 = 7; /* 74HC595的STCP */
const int clockPin595 = 8; /* 74HC595的SHCP */
const int numBits = 8; /* 每块移位寄存器有8位 */
const int debounceDelay = 50; // 50 milliseconds debounce delay
byte lastSwitchStates = 0; // 上次的开关状态
byte ledStates = 0; // 当前的LED状态
byte switchStates = 0; // 当前的开关状态
byte lastDebouncedSwitchStates = 0; // 上次去抖动后的开关状态
unsigned long lastDebounceTime = 0; // 上次去抖动的时间
void setup() {
Serial.begin(115200);
// 第一块74HC165引脚模式
pinMode(dataPin1, INPUT);
pinMode(clockPin1, OUTPUT);
pinMode(latchPin1, OUTPUT);
// 第二块74HC165引脚模式
pinMode(dataPin2, INPUT);
pinMode(clockPin2, OUTPUT);
pinMode(latchPin2, OUTPUT);
// 74HC595引脚模式
pinMode(dataPin595, OUTPUT);
pinMode(clockPin595, OUTPUT);
pinMode(latchPin595, OUTPUT);
// 初始化引脚状态
digitalWrite(clockPin1, LOW);
digitalWrite(latchPin1, HIGH);
digitalWrite(clockPin2, LOW);
digitalWrite(latchPin2, HIGH);
digitalWrite(clockPin595, LOW);
digitalWrite(latchPin595, LOW);
}
void loop() {
// 读取第一块74HC165的按钮状态
digitalWrite(latchPin1, LOW);
delayMicroseconds(5); // 确保脉冲足够长
digitalWrite(latchPin1, HIGH);
delayMicroseconds(5); // 确保脉冲足够长
byte currentSwitchStates = 0;
for (int i = 0; i < numBits; i++) {
digitalWrite(clockPin1, LOW);
delayMicroseconds(5); // 确保脉冲足够长
int bit = digitalRead(dataPin1);
currentSwitchStates |= (bit << i);
digitalWrite(clockPin1, HIGH);
delayMicroseconds(5); // 确保脉冲足够长
}
// 无阻塞去抖动
unsigned long currentTime = millis();
if (currentSwitchStates != switchStates) {
lastDebounceTime = currentTime;
switchStates = currentSwitchStates;
}
if ((currentTime - lastDebounceTime) > debounceDelay) {
// 去抖动后更新开关状态
if (switchStates != lastDebouncedSwitchStates) {
lastDebouncedSwitchStates = switchStates;
// 处理开关自锁逻辑
for (int i = 0; i < numBits; i++) {
if ((switchStates & (1 << i)) && !(lastSwitchStates & (1 << i))) {
// 切换LED状态
ledStates ^= (1 << i);
}
}
lastSwitchStates = switchStates;
// 通过74HC595输出LED状态
digitalWrite(latchPin595, LOW);
for (int i = 0; i < numBits; i++) {
digitalWrite(clockPin595, LOW);
digitalWrite(dataPin595, (ledStates >> i) & 0x01);
digitalWrite(clockPin595, HIGH);
}
digitalWrite(latchPin595, HIGH);
// 打印LED状态到串口
Serial.print("LEDs: ");
for (int i = 0; i < numBits; i++) {
Serial.print((ledStates >> i) & 0x01);
}
Serial.println();
}
}
}