// 74HC165 connections
const int PL_PIN = A2; // Parallel Load pin (74HC165)
const int CP_PIN = A1; // Clock pin (74HC165)
const int Q7_PIN = A0; // Serial Output pin (74HC165)
// 74HC595 connections
const int DATA_PIN = 4; // Serial Data Input (74HC595)
const int CLOCK_PIN = 3; // Shift Register Clock (74HC595)
const int LATCH_PIN = 2; // Storage Register Clock (74HC595)
// 按键状态和LED状态
bool buttonStates[8] = {false, false, false, false, false, false, false, false};
bool ledStates[8] = {false, false, false, false, false, false, false, false};
void setup() {
// 初始化引脚
pinMode(PL_PIN, OUTPUT);
pinMode(CP_PIN, OUTPUT);
pinMode(Q7_PIN, INPUT);
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
Serial.begin(115200);
}
void loop() {
// 读取按键状态
readButtons();
// 检查按键状态并更新LED状态
for (int i = 0; i < 8; i++) {
if (buttonStates[i]) {
ledStates[i] = !ledStates[i]; // 切换对应的LED状态
}
}
// 更新LED显示
updateLEDs();
// 小延时用于消除按键抖动
delay(100);
}
void readButtons() {
// 加载并行数据到移位寄存器
digitalWrite(PL_PIN, LOW);
delayMicroseconds(50);
digitalWrite(PL_PIN, HIGH);
// 逐位读取按键状态
for (int i = 0; i < 8; i++) {
buttonStates[7 - i] = digitalRead(Q7_PIN);
digitalWrite(CP_PIN, HIGH);
delayMicroseconds(50);
digitalWrite(CP_PIN, LOW);
}
}
void updateLEDs() {
// 手动将LED状态转换为字节数据并写入74HC595
digitalWrite(LATCH_PIN, LOW);
for (int i = 0; i < 8; i++) {
// 将数据位写入DATA_PIN
if (ledStates[7 - i]) {
digitalWrite(DATA_PIN, HIGH);
} else {
digitalWrite(DATA_PIN, LOW);
}
// 产生一个时钟脉冲
digitalWrite(CLOCK_PIN, HIGH);
delayMicroseconds(50);
digitalWrite(CLOCK_PIN, LOW);
}
digitalWrite(LATCH_PIN, HIGH);
}
// int big = 2; //595_STCP
// int push = 3; //595_SHCP
// int datain = 4; //595_DS
// int dataout = A0; //165_Q7
// int clkpin = A1; //165_CP
// int latpin = A2; //165_PL
// // int numbits = [8]; // 8 * number of shift
// int datainput[8];
// void setup() {
// // put your setup code here, to run once:
// Serial.begin(115200);
// // 设置595引脚定义
// pinMode(big, OUTPUT);
// pinMode(push, OUTPUT);
// pinMode(datain, OUTPUT);
// // 设置165引脚定义
// pinMode(dataout, INPUT);
// pinMode(clkpin, OUTPUT);
// pinMode(latpin, OUTPUT);
// }
// void loop() {
// // 下面是165的代码
// // 采集信号
// digitalWrite(latpin, LOW);
// digitalWrite(latpin, HIGH);
// // 读取并显示八个引脚的状态
// Serial.print("Bits:");
// for(int i=0 ;i < 8 ;i++){
// int bit = digitalRead(dataout);
// if (bit == HIGH){
// int datainput[i] = {1};
// Serial.print("1");
// } else {
// int datainput[i] = {0};
// Serial.print("0");
// }
// // 数据转移给寄存器,关闭读取
// digitalWrite(clkpin, HIGH);
// digitalWrite(clkpin, LOW);
// }
// Serial.println();
// delay(1000);
// 下面是595的代码:
// digitalWrite(big, LOW);
// digitalWrite(push, LOW);
// digitalWrite(datain, 1);
// digitalWrite(push, HIGH);
// for (int i=0;i<8;i++){
// putsomething(datainput[i]);
// }
// putsomething(1);
// putsomething(0);
// putsomething(1);
// putsomething(0);
// putsomething(1);
// putsomething(0);
// putsomething(1);
// putsomething(0);
// digitalWrite(big, HIGH);
// }
// void putsomething(int number){
// digitalWrite(push, LOW);
// digitalWrite(datain, number);
// digitalWrite(push, HIGH);
// }
// void putone(){
// digitalWrite(push, LOW);
// digitalWrite(datain, 1);
// digitalWrite(push, HIGH);
// }
// void putzero(){
// digitalWrite(push, LOW);
// digitalWrite(datain, 0);
// digitalWrite(push, HIGH);
// }