I used two 74HC595 chips hooked to the Serial Peripheral Interface Bus of an Arduino. This bus will runs at 4MHz so the updates to the LEDs were very snappy.
A single chip can only control 8 LED's. In order to control another 8 chips you have to connect a second chip to the first chip in series.
/*
Shift Register Example
for 74HC595 shift register
This sketch turns turns your arduino into a cylon.
Hardware:
* 74HC595 shift register attached to hardware SPI
Arduino 74HC959
pin# name pin# name
10 SS ---> 12 RCK
11 MOSI ---> 14 SI
13 SCK ---> 11 SCK
* LEDs attached to each of the outputs of the shift register
Created 02 Oct 2014
by James M. Rogers
Based on work of others found in following locations:
http://forum.arduino.cc/index.php/topic,149470.0.html
http://arduino.cc/en/tutorial/ShiftOut
http://arduino.cc/en/Tutorial/SPIDigitalPot
*/
#include <SPI.h>
int pinSS=10; //latch
int d=40;
void setup() {
SPI.begin();
}
//#define d 40
void loop() {
int i;
for (i=0 ; i<16 ; i++) {
registerWrite(i, HIGH);
delay (d);
}
for (i=15 ; i>=0 ; i--) {
registerWrite(i, HIGH);
delay (d);
}
if (d>10)
d-=5;
else
d--;
if (d==0)
d=40;
}
// This method sends bits to the shift register:
void registerWrite(int whichPin, int whichState) {
// the bits you want to send
byte lowbitsToSend = 0;
byte highbitsToSend = 0;
if (whichPin <8) {
// turn on the next highest bit in bitsToSend:
bitWrite(lowbitsToSend, whichPin, whichState);
} else {
bitWrite(highbitsToSend, whichPin-8, whichState);
}
SPI.transfer(highbitsToSend);
SPI.transfer(lowbitsToSend);
digitalWrite(pinSS,LOW);
delayMicroseconds(1);
digitalWrite(pinSS,HIGH);
}
