/*
Arduino code for Individual control over each pin
Support for 40+ 74HC595 8 bit shift registers
http://bildr.org/2011/02/74hc595/
*/
#define DATA_PIN 8 // Pin connected to DS of 74HC595
#define LATCH_PIN 9 // Pin connected to STCP of 74HC595
#define CLOCK_PIN 10 // Pin connected to SHCP of 74HC595
// How many of the shift registers
#define NUM_SHIFT_REGS 3
// definenumber of output pins
// each shift register has 8 output pins, 3 input pins
const uint8_t numOfRegisterPins = NUM_SHIFT_REGS * 8;
// array of registers
bool registers[numOfRegisterPins];
void setup() {
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
clearRegisters();
writeRegisters();
}
void loop() {
oneAfterAnother();
clearRegisters();
}
// to clear registers of previous outputs
void clearRegisters() {
// Reset all register pins
for (int i = numOfRegisterPins - 1; i >= 0; i--) {
registers[i] = HIGH;
// high because rgb led are not grounded but are provided 5v
}
}
void setRegisterPin(int index, int value) {
// Set an individual pin HIGH or LOW
registers[index] = value;
}
void oneAfterAnother()
{
// This function will turn on all the LEDs, one-by-one,
// and then turn them off all off, one-by-one.
int index;
int delayTime = 100; // Time (milliseconds) to pause between LEDs
// Make this smaller for faster switching
for(index = 23; index >= 16; index--)
{
// LOW because we want that pin to act as ground
setRegisterPin(index,LOW);
writeRegisters();
delay(delayTime);
}
clearRegisters();
for(index = 15; index >= 8; index--)
{
setRegisterPin(index,LOW);
writeRegisters();
delay(delayTime);
}
clearRegisters();
for(index = 7; index >= 0; index--)
{
setRegisterPin(index,LOW);
writeRegisters();
delay(delayTime);
}
// Turn all the LEDs off
}
// write on registers
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);
}