8 LED Chaser With 74HC595 8 Bit Shift Register
Intro: 8 LED Chaser With 74HC595 8 Bit Shift Register
In this tutorial we’ll be using the 74HC595 8 Bit Shift Register, and this is what we'll be making;
Parts Required:
Arduino Uno (Or Arduino compatible clone)
Jumper Wires (Various colours and lengths)
1x 74HC595 8 Bit Shift Register
1x Breadboard
8x 220 Ohm Resisters
STEP 1: Get Ready to Shift
STEP 2: Power, Data, Clock and Latch
Take your blue wire (data) and connect it to pin 14, the yellow (clock) to pin 11 and green (latch) to pin 12 on the IC respectfully.
Then take your LED’s (I’m using an LED bar graph for size) and place them over the IC gap.
STEP 3: Let There Be LED Light!
Then take your 220 Ohm resistors and wire them from the other side of the LED’s to the ground rail.
STEP 4: Arduino Time!
int clockPin = 12; //IC Pin 11, Yellow Jumper
int dataPin = 11; //IC Pin 14, Blue Jumper
int latchPin = 8; //IC Pin 12, Green Jumper
byte patterns[30] = {
B00000001, 100,
B00000010, 100,
B00000100, 100,
B00001000, 100,
B00010000, 100,
B00100000, 100,
B01000000, 100,
B10000000, 100,
B01000000, 100,
B00100000, 100,
B00010000, 100,
B00001000, 100,
B00000100, 100,
B00000010, 100
};
int index = 0;
int count = sizeof(patterns) / 2;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, patterns[index * 2]);
digitalWrite(latchPin, HIGH);
delay(patterns[(index * 2) + 1]);
index++;
if (index >= count){
index = 0;
}
}
STEP 5: Going Further
If I touch onto Shift Registers in the future (Which I most likely will) I will show you how to expand.
27 Comments
AT395 5 years ago
pavium 7 years ago
A friendly suggestion: people who create electronic instructables should try to include schematics. A schematic would make this a whole lot easier to describe. It's worth learning how to create them, and read them!
ArifSae 8 years ago
thanks!
SideTracked350 9 years ago
Can this be modified to run short el strips in place of the LEDs with the help of an inverter?
oldsmarracin 10 years ago
robot797 12 years ago
i am gonna rewrite it so you can use it with only 2 wires
Baron von Biffo 12 years ago
The following code works with two 595s. Be sure to connect the overflow pin of the first 595 to the data in pin of the second and connect the clock and latch pins together.
HTH,
von Biffo.
/*
A simple 16 LED chaser using two 74HC595N serial in/parallel out shift registers.
This sketch causes one of sixteen LEDs to be lit in turn moving up and down the display.
By Baron von Biffo
28th April 2012.
*/
// setup the data, latch and clock pins for the 74HC595.
int dataPin = 2;
int latchPin = 3;
int clockPin = 4;
void setup(){
// Set the data, latch and clock pins to output mode.
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
}
void loop(){
// Setup array with the individual LED positions. Decimal is easier to use than binary.
unsigned int displayLED[] = {0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768};
// Setup two 8 bit bytes to hold the data for each 595.
uint8_t low_byte;
uint8_t high_byte;
// Set length of time to display each LED.
int pause = 45;
// Loop control variable
int count;
// Count up loop.
for(count = 1; count < 16; count++){
// Read the decimal value from the array. Use bitwise And with OxFF for the low byte
// and shift 8 bits right for the high byte.
//
// I learned this from Korman at http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1285651171
//
low_byte = displayLED[count] & 0xff;
high_byte = (displayLED[count] >> 8);
// set the latch pin low prior to shifting out the data.
digitalWrite(latchPin, LOW);
// Shift out the data. The first shiftout puts the high byte into the first 595.
// The second shiftout shifts the high byte from the first 595 to the second and
// shifts the low byte into the first 595.
shiftOut(dataPin, clockPin, MSBFIRST, high_byte);
shiftOut(dataPin, clockPin, MSBFIRST, low_byte);
// Display the data by setting the latch pin high.
digitalWrite(latchPin, HIGH);
// Pause for the number of miliseconds determined by the 'pause' variable.
delay(pause);
}
//Count down loop. Same as the count up loop but moves in the opposite direction.
for(count = 16; count > 0; count--){
low_byte = displayLED[count] & 0xff;
high_byte = (displayLED[count] >> 8);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, high_byte);
shiftOut(dataPin, clockPin, MSBFIRST, low_byte);
digitalWrite(latchPin, HIGH);
delay(pause);
}
}
Ugifer 12 years ago
I guess you don't need a separate latch pin for each chip so in effect you seem to be getting 8 outputs for every pair of normal pins, with 1 extra pin for latching. That's potentially a lot of outputs!
Dominion-Network 12 years ago
Ugifer 12 years ago
Only question - how do you know which '595 you are writing to? Maybe it's clear from the code but I missed that if so.
It occurs to me that a shift register has just the right number of outputs to control a seven-segment+decimal LED display.... wouldn't take a whole lot of code to write a library that would output any number of digits to daisy-chained 7-segment displays with a shift register attached to each.
I may have to try that.
Dominion-Network 12 years ago
Also, I am sure that someone in the Arduino community has in fact written a library to interface the '595 and 7-Segment displays.
Ugifer 12 years ago
There probably is a library for this but I'm just starting out with micro-controllers (you might have guessed) so I might just make it a project anyway.....
Thanks for all your help.
jborgne 12 years ago
i dont think you can send 16 bits at once either. eg B1111111111111111
due to the arduino language not having a consistent defined for anything over 8 bit. (This may have changed for the 1.0 IDE)
if i had 2 shift's i would send like so
shiftout(reg2);
shiftout(reg1);
digitalWrite(latchPin, HIGH);
note this is not working code just to show how it works.
3 shifts? just add the last shift first like so
shiftout(reg3);
shiftout(reg2);
shiftout(reg1);
digitalWrite(latchPin, HIGH);
HTH,
Ugifer 12 years ago
I used exactly that type of code and it works great. When I have a minute I'll write it up as an 'ibble.
There is a ShiftOut tutorial on the arduino site that's very helpful for these things.
Dominion-Network 12 years ago
jborgne 12 years ago
I was sending 00000011 instead of B00000011.
I ended up converting the binary to base-10 and sending that.
After reading this instruct I see i needed to add a B to the binary.
thanks
lesic25 12 years ago
Dominion-Network 12 years ago
Eax5 12 years ago
I just finished learning about these from a different source and making a Connect 4 clone.
Just some advice, if any one having issues if LEDs flickering when they are not supposed to you might want to add a .1uF capacitor between the Vcc(pin 16) and ground.
I need to figure something out to do with the extra 7 chips I have lying around
Dominion-Network 12 years ago