Introduction: Hookup an LCD to an Arduino in 6 Seconds With 3, Not 6 Pins
Adding an LCD display to Arduino projects can add real value but the cost of doing so can be significant. Not a financial cost - you can pick up 16 (characters) x 2 (rows) LCD for as little as £3.50. The cost is the pin count it can take to drive them. Using the built-in LiquidCrystal Display library it can take as many as 6 pins! That does not leave much for your sensors, motors and other components.
There are many projects that discuss using alternatives - such as a much more expensive Serial LCD (£10 up). Other projects discuss using two-wire interfaces, increasing the complexity of your code. The simplest way to drive the HD44780 style LCDs, in my opinion, is to use a 74HC595 shift register, taking the pin count down to 3.
In any case, connecting an LCD either using the 595 Shift Register or the more traditional way takes a lot of wiring which is not only a super mess (unless you use a ribbon cable I guess), it takes time.
This shield is simplifies this process - all that is required is power and three wires back to the Arduino - ie. connect the LCD in under 6 seconds!
Step 1: Required Components
This is an extremely easy board to make and should take you no more than 15 minutes to solder up and have running.
Component List
1 x 74HC595 Shift Register
1 x BC547 NPN (or MOFSET or similar NPN)
1 x 10k Trimmer Potentiometer
6 x Male headers (I used right angle connectors)
16 x Female headers
Strip/Vero-board 17 strips x 13 holes (I used 15 for cable support)
Hookup wire
Your soldering kit
Step 2: Stripboard Preparation
!! Remember, you are cutting the other side of the breadboard so you need to cut the INVERSE of these graphics. A simple way to get this right is to download the image, flip it horizontally then use it as your cutting guide. !!
There are 18 cuts in total you need to make on your stripboard.
To cut the tracks of these boards you can use a "track cutter" which is available from most electronic component retails, use a drill bit or knife to cut across them or bring out your trusty Dremel and use one of the myriad of tools they have for doing this.
The board size needs to be, at minimum, 17 strips x 13 holes. That said, I used 15 holes to give my cables some extra support.
Double check all track cuts for bridges!
Step 3: Soldering Components
Now comes the fun part of soldering all the components. The attached images will help you place each of the wires and components easily. These are "top-view" images, i.e. your board should look exactly the same from above.
Start by soldering the wires first.
Then the 74HC595 Shift Register, Potentiometer then the NPN.
Lastly, solder in the headers.
The NPN collector pin has been bent backwards slightly and is placed behind the base pin. This is easily seen in the second image.
Double check all track cuts again and your soldering for bridges!
Step 4: Connections
Overview the entire board (again) for any bridges to ensure there are no short circuits.
Now it is time to connect this up and test it.
Connect the power (5v and ground).
Connect the wires to the shift register, if you use the library as default you will connect Green to Arduino Pin 7, Blue to Arduino Pin 8, Yellow to Arduino Pin 9.
The pin between Green and Blue is not used. It is placed there to enable 4-pin connectors if that is the cabling you have and to make soldering much easier (trying to solder 1 pin then 2 pins is painful).
Next attach the LCD so it covers the board - this will ensure you are connecting it the correct way.
Contrast is adjusted using the Potentiometer.
Step 5: Software
The method of using a shift register to drive these displays with only 3 pins seems to have originally documented by Stephen Hobley. He did a great job of adjusting the built-in LiquidCrystal Library so it works brilliantly with the 595 Shift Register. I have now updated this library to be compatible with Arduino 1.x and adjusted some of the Shift Register pin assignments to be easier to prototype with. You need to download the latest code. It is feature complete and should be a drop-in replacement for any project you already have.
Here is the test Arduino sketch to show you how to use the new library, replacing the LiquidCrystal 6-pin with a great 3-pin version.
--------------------COPY BELOW HERE--------------------
/*
* 3-pin Arduino interface for HD44780 LCDs via 74HC595 Shift Register
* by Rowan Simms code@rowansimms.com
* License: Creative Commons - Attribution.
* Full Documentation and Description: http://rowansimms.com/article.php/lcd-hookup-in-seconds
*
* This sketch allows Arduinos to use a shift register to control an LCD, allowing
* a reduction in pins it requires from 6 to 3 while still retaining full control
* including backlight on/off.
* This requires the use of the LiquidCrystal595 library
* available at: http://code.google.com/p/arduino-lcd-3pin/
*/
#include <LiquidCrystal595.h> // include the library
LiquidCrystal595 lcd(7,8,9); // datapin, latchpin, clockpin
void setup() {
lcd.begin(16,2); // 16 characters, 2 rows
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Wow. 3 pins!");
lcd.setCursor(0,1);
lcd.print("Fabulous");
}
void loop() {
// not used.
}
--------------------COPY ABOVE HERE--------------------
Copy this in to a new Sketch after installing the library and upload to your Arduino.
You should now be basking in the glorious glow of your LCD.
Step 6: Conclusion
This shield really does allow you to use just 3 pins of your Arduino to drive an LCD display - and it takes less than 6 seconds to connect it up.
Don't want to commit to a shield just yet? Wish to do this with only 3 components and breadboard?
I understand that you may not wish to make a shield before trying this method out - that is completely understandable. For you, I have this documented for breadboards too. Sure, you will have to deal with more hookup wire, but it gives you a great way of at least trying this 3-pin method without any soldering. That layout, more code and wiring explanations are available from http://rowansimms.com/article.php/lcd-hookup-in-seconds
That's it. Enjoy your sub-6-second hookups!

Participated in the
Arduino Challenge
149 Comments
10 years ago on Introduction
I have this running great from an ATtiny85. It also has a TMP36 temp sensor to desplay the current temperature. LCD uses pins 0, 1, 2 and TMP36 uses pin 3.
Reply 10 years ago on Introduction
Here is my version. Thanks, it was a fun project.
Reply 8 years ago on Introduction
Hi, please where did you buy this stripboard? It was online? I just found another version with independent holes, different of yours... Sorry my English, thanks!
Reply 7 years ago
hi. You can get the connected holes from electronic store. They sell copper board with independent holes and copper strip board
Reply 10 years ago on Introduction
That is fantastic Matt. Really nice work.
Being in London, I feel those cold mornings too.
Thank-you for sharing.
R
Reply 10 years ago on Introduction
Hey thanks bitterOz. I gave your instructables page props in the description of the above video and in the prototype video http://www.youtube.com/watch?v=1ipJzppZvVk
Thanks again, It was a fun project.
Matt
Reply 10 years ago on Introduction
I'm wanting to build your project Matt. Any chance you could post the modified code for the attiny85?
Reply 10 years ago on Introduction
Hi. Here's a link I made for you.
http://pastebin.com/saZ3ect9
It should contain the code.
The temp sensor I use is a TMP36 from Adafruit.com
I hope this helps.
Matt
Reply 10 years ago on Introduction
Thanks! You should really do an instructable on this, or at the least, draw up a schematic for us noobs and post it in the description of your video.
4 years ago
Just me or do the cuts in section 2 not line up with the cuts shown in section 3?
4 years ago
It worked once and then started showing garbage values and never worked again. It shows a row of boxes whenever I power it up again, nothing else. Please help !
Reply 4 years ago
Connecting OE to ground worked
5 years ago
Made it on an arduino. Thx for saving me 3 (really needed) pins.
As heman said, needed
lcd.setLED2Pin(HIGH);
to turn the backlight on.
If i would build it a second time i would change the layout a bit so you can change the poti without dismounting the lcd.
5 years ago
I've rechecked the circuit and code thrice, no hit for me...
Tried flipping the e and c of transistor too, including that extra bit of code...
Reply 5 years ago
Not even backlight is working, and yes I have the correct transistor and have already switched it two times
6 years ago
@bitteroz Had to swap the emitter and collector of the BC547 NPN transistor to make the back light work. Mistake in circuit drawings? Or is my LCD different ? I have a green one.
Reply 6 years ago
Also had to use following to turn on backlight.
lcd.setLED2Pin(HIGH);
lcd.shift595();
Reply 5 years ago
Would you send me the exact code you used?
6 years ago
Would it be possible to connect multiple screens with multiple shift registers to the same 3 pins the same way you can daisy chain the shift registers for other purposes (like 7 segment LED's or input buttons)?
6 years ago
I have this running great from an ATtiny85. It also has a TMP36 temp sensor to desplay the current temperature. LCD uses pins 0, 1, 2 and TMP36 uses pin 3