#define DATA_PIN 2 // Pin connected to DS of 74HC595
#define LATCH_PIN 4 // Pin connected to STCP of 74HC595
#define CLOCK_PIN 3 // Pin connected to SHCP of 74HC595
// How many of the shift registers
#define NUM_SHIFT_REGS 4
const uint8_t numOfRegisterPins = NUM_SHIFT_REGS * 8;
bool registers[numOfRegisterPins];
void setup() {
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
clearRegisters();
writeRegisters();
}
void loop() {
// Call the chaser effect functions
chaserEffect1();
delay(100);
chaserEffect2();
delay(100);
clearRegisters();
chaserEffect3();
delay(100);
chaserEffect4();
delay(100);
chaserEffect5();
delay(100);
chaserEffect6();
delay(100);
clearRegisters();
chaserEffect7();
delay(100);
chaserEffect8();
delay(100);
clearRegisters();
chaserEffect9();
delay(100);
chaserEffect10();
delay(100);
clearRegisters();
chaserEffect11();
delay(100);
chaserEffect12();
delay(100);
chaserEffect13();
delay(100);
chaserEffect14();
delay(100);
chaserEffect15();
delay(100);
}
void chaserEffect1() {
for (int i = 0; i < numOfRegisterPins; i++) {
clearRegisters();
setRegisterPin(i, HIGH);
writeRegisters();
delay(100);
}
}
void chaserEffect2() {
for (int i = numOfRegisterPins - 1; i >= 0; i--) {
clearRegisters();
setRegisterPin(i, HIGH);
writeRegisters();
delay(100);
}
}
void chaserEffect3() {
for (int i = 0; i < numOfRegisterPins; i++) {
setRegisterPin(i, HIGH);
writeRegisters();
delay(100);
}
}
void chaserEffect4() {
for (int i = 0; i < numOfRegisterPins; i++) {
setRegisterPin(i, LOW);
writeRegisters();
delay(100);
}
}
void chaserEffect5() {
for (int i = numOfRegisterPins - 1; i >= 0; i--) {
setRegisterPin(i, HIGH);
writeRegisters();
delay(100);
}
}
void chaserEffect6() {
for (int i = numOfRegisterPins - 1; i >= 0; i--) {
setRegisterPin(i, LOW);
writeRegisters();
delay(100);
}
}
void chaserEffect7() {
for (int i = 0; i < numOfRegisterPins; i += 2) {
setRegisterPin(i, HIGH);
writeRegisters();
delay(100);
}
}
void chaserEffect8() {
for (int i = numOfRegisterPins - 1; i >= 0; i -= 2) {
setRegisterPin(i, HIGH);
writeRegisters();
delay(100);
}
}
void chaserEffect9() {
for (int i = 0; i < numOfRegisterPins; i += 4) {
setRegisterPin(i, HIGH);
writeRegisters();
delay(100);
}
}
void chaserEffect10() {
for (int i = numOfRegisterPins - 1; i >= 0; i -= 4) {
setRegisterPin(i, HIGH);
writeRegisters();
delay(100);
}
}
void chaserEffect11() {
for (int i = numOfRegisterPins - 1; i >= 0; i -= 7) {
setRegisterPin(i, HIGH);
writeRegisters();
delay(100);
}
}
void chaserEffect12() {
for (int i = 0; i < numOfRegisterPins; i++) {
setRegisterPin(i, HIGH);
setRegisterPin(i + 1, HIGH);
writeRegisters();
delay(100);
}
}
void chaserEffect13() {
for (int i = 0; i < numOfRegisterPins; i++) {
setRegisterPin(i, HIGH);
setRegisterPin(i + 1, LOW);
writeRegisters();
delay(100);
}
}
void chaserEffect14() {
for (int i = 0; i < numOfRegisterPins; i++) {
setRegisterPin(i, LOW);
setRegisterPin(i + 1, HIGH);
writeRegisters();
delay(100);
}
}
void chaserEffect15() {
for (int i = 0; i < numOfRegisterPins; i++) {
setRegisterPin(i, HIGH);
setRegisterPin(i + 3, HIGH);
writeRegisters();
delay(100);
}
}
void clearRegisters() {
// Reset all register pins
for (int i = numOfRegisterPins - 1; i >= 0; i--) {
registers[i] = LOW;
}
}
void setRegisterPin(int index, int value) {
// Set an individual pin HIGH or LOW
registers[index] = value;
}
void writeRegisters() {
// Set and display registers
digitalWrite(LATCH_PIN, LOW);
for (int i = numOfRegisterPins - 1; i >= 0; i--) {
digitalWrite(CLOCK_PIN, LOW);
digitalWrite(DATA_PIN, registers[i]);
digitalWrite(CLOCK_PIN, HIGH);
}
digitalWrite(LATCH_PIN, HIGH);
}