Project Overview
Arduino + 74HC595 shift register (8 LEDs from 3 pins): When your Arduino runs out of GPIO, the 74HC595 shift register lets you drive eight LED outputs using only three control pins. Wire it once to learn how serial data, clock, and latch signals work, then reuse the same pattern for LED matrices and 7-segment displays.
- Time: ~45 minutes
- Skill level: Beginner-Intermediate
-
What you will build: An 8-LED bar driven by
shiftOut()with chasing patterns, binary counting, and a path to daisy-chaining more chips.
Parts List
From ShillehTek
- Arduino Uno R3 Super Starter Kit - includes a 74HC595, LEDs, and resistors
- Resistor Kit - 220Ω per LED
- 830-Point Breadboard - room for the chip plus 8 LEDs
- Dupont Jumper Wires
External
- Extra 74HC595 chips if you want to daisy-chain
Note: The chip works like a bucket brigade. Bits enter one at a time on the data pin, move forward on each clock pulse, and appear on all 8 outputs at once when you pulse the latch.
Step-by-Step Guide
Step 1 - Know the three control pins
Goal: Understand data, clock, latch.
What to do: Only three chip pins matter for control: SER (14) receives bits one at a time, SRCLK (11) is the clock that shifts each bit in, and RCLK (12) is the latch that copies the internal register to the output pins QA-QH. OE (13) ties to ground (outputs enabled), MR (10) ties to 5V (no reset), and power is 5V/GND on 16/8.
Expected result: The 16-pin chip reduced to three signals in your head.
Step 2 - Wire it
Goal: Place the chip on the breadboard and connect LEDs to the outputs.
What to do: Straddle the chip across the breadboard's center channel. Arduino D11→SER, D12→RCLK, D9→SRCLK (any three pins work, just match the sketch). Then wire one LED plus 220Ω from each output QA-QH (pins 15, 1-7) to ground.
Expected result: Eight LEDs wired and ready for their first byte.
Step 3 - Use shiftOut() to send patterns
Goal: Send bytes and see LED patterns.
What to do: Arduino's built-in shiftOut() clocks a whole byte into the chip. You frame it by toggling the latch so all outputs update at once.
Code:
const int DATA = 11; // SER (pin 14)
const int LATCH = 12; // RCLK (pin 12)
const int CLOCK = 9; // SRCLK (pin 11)
void writeByte(byte value) {
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, MSBFIRST, value);
digitalWrite(LATCH, HIGH); // all 8 outputs update at once
}
void setup() {
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
}
void loop() {
// binary counter: watch 0-255 tick across the LEDs
for (int i = 0; i <= 255; i++) {
writeByte(i);
delay(120);
}
// knight-rider chase
for (int i = 0; i < 8; i++) { writeByte(1 << i); delay(80); }
for (int i = 7; i >= 0; i--) { writeByte(1 << i); delay(80); }
}
Expected result: A binary counter followed by a scanner sweep. Each LED represents one bit of the byte you sent.
Step 4 - Chain for more outputs
Goal: Expand to 16, 24, 32 outputs using the same 3 pins.
What to do: Connect the first chip's QH' (pin 9) to the next chip's SER, share clock and latch, and call shiftOut() twice before latching. Bits overflow from chip 1 into chip 2 automatically.
Expected result: Multiple 74HC595 chips controlled with the same three Arduino signals.
Conclusion
The 74HC595 shift register gives an Arduino 8 outputs using only 3 control pins by shifting serial data into a parallel output register. Once you are comfortable with data, clock, and latch timing, the same approach scales to LED matrices, multi-digit 7-segment displays, and more.
Want the exact parts used in this build? Grab them from ShillehTek.com. If you want help customizing this project or building something for your product, check out our IoT consulting services.
Credits
All photos and images in this tutorial are credited to Rachana Jain on Hackster.io. The original guide by Rachana Jain served as the reference for this ShillehTek version. We thank her for the excellent work in the maker community.






