Home / 1602A LCD
Side quest · electronics · ~30 min

Wire up a 1602A LCD

The 1602A is the classic little screen — 16 characters across, 2 rows down. It's how your project says hello, shows a number, or flashes a tiny icon you drew yourself. We'll wire it the lean way — just 10 jumper wires, no breadboard, no contrast knob — and put your name on it.

01Meet the 1602A

"1602" means 16 columns × 02 rows of characters. Each character sits in its own little 5×8 pixel box. The module is driven by a famous chip called the HD44780, and the Arduino library that talks to it — LiquidCrystal — comes built into the Arduino software, so there's nothing extra to install.

It has a strip of 16 pins along one edge. That looks like a lot, but most of them just go to power and ground. Only six actually carry data.

Two flavours exist

Some 1602A screens come with a small I²C backpack soldered on the back (only 4 wires). This guide covers the bare module — the one with the full 16-pin strip and no backpack. If yours has a little chip board on the back, you want the I²C method instead.

02What you need

  • A 1602A LCD module (bare, 16 pins)
  • An Arduino Uno + USB cable
  • 10 male-to-female jumper wires — that's the exact count this build uses

No breadboard and no potentiometer needed. The LCD's pins plug straight into the Arduino's header sockets with the male-to-female jumpers. You'll just want to solder the row of header pins onto the LCD first (most modules ship with the strip loose in the bag).

Why only 10 wires?

The usual 1602A wiring needs ~12 wires plus a contrast knob. We trim it to 10 by tying the contrast pin straight to ground (full contrast, no knob) and leaving the backlight unwired. It fits an Uno's pins exactly. Want the knob or the backlight back? See the options at the end.

03Wiring it up

Ten wires, each going straight from a pin on the LCD to a pin on the Arduino — no breadboard, no potentiometer, nothing in between. The colours below are just the four jobs the wires do:

A 1602A LCD wired directly to an Arduino Uno with ten colour-coded jumper wires
FIG. 06 — 1602A → ARDUINO, 10 WIRES

And the same thing as a checklist. Every row is one jumper wire — LCD pin on the left, Arduino pin on the right:

#LCD pinWire to Arduino
1VSSGND
2VDD5V
3V0GND  contrast = full
4RSpin 12
5RWGND
6Epin 11
11D4pin 5
12D5pin 4
13D6pin 3
14D7pin 2

That's all ten. Pins 7–10 (D0–D3) and 15–16 (A, K — the backlight) are simply left unconnected. The Uno has exactly three GND pins and one 5V pin, which is precisely what this uses up.

The V0 → GND trick

Normally a potentiometer feeds an adjustable voltage into V0 to set contrast. Tying V0 straight to GND instead pins contrast at maximum — which is dark and crisp, and saves you the knob and two extra wires. On most screens it's perfectly readable.

Run it live first ↗

Not sure your wiring is right? Try it in a simulator before touching real hardware. Open a blank Arduino Uno project on Wokwi, then replace its diagram.json with this one and paste in this sketch. Press play and the virtual 1602A lights up with Hello Max — proof the connection list is correct. (A free Wokwi sign-in lets you Save it for your own shareable link.)

04Hello, Max

With the wiring done, upload this. The numbers in LiquidCrystal lcd(...) are simply the Arduino pins for RS, E, and the four data lines — in that order:

hello_lcd.ino
#include <LiquidCrystal.h>

// LiquidCrystal(RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  lcd.begin(16, 2);             // 16 columns, 2 rows
  lcd.print("Hello Max");       // top line
  lcd.setCursor(0, 1);          // column 0, row 1 (the bottom line)
  lcd.print("1602A ready");     // bottom line
}

void loop() {
  // nothing to repeat — the text just stays on screen
}
The two ideas to remember

lcd.setCursor(column, row) moves where the next text appears — columns are 0–15, rows are 0 (top) and 1 (bottom). lcd.print("…") writes text starting from the cursor.

05Custom characters

Here's the fun part. Each character is a grid of 5×8 pixels, and the 1602A lets you design up to 8 of your own. You draw the shape as eight rows of five pixels — a 1 turns a pixel on, a 0 leaves it off. Writing those rows in binary (0b…) lets you literally see the picture in the code:

0b00000
0b01010
0b11111
0b11111
0b11111
0b01110
0b00100
0b00000

A heart — read the orange pixels and the 1s; they're the same shape.

Store the shape with createChar(), then draw it with lcd.write():

custom_char.ino
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Our heart, one byte (row) at a time. Each 1 = a lit pixel.
byte heart[8] = {
  0b00000,
  0b01010,
  0b11111,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000
};

void setup() {
  lcd.begin(16, 2);
  lcd.createChar(0, heart);   // save the shape in slot 0 (slots 0–7)
  lcd.setCursor(0, 0);
  lcd.print("I ");
  lcd.write(byte(0));          // draw custom character #0
  lcd.print(" 3D printing");
}

void loop() {}

Change the eight numbers and you change the picture. Try a smiley, a tiny printer, the first letter of your name — anything that fits in the 5×8 grid. You can keep up to eight custom shapes at once (slots 0 through 7).

06If the screen is blank

What you seeUsually meansTry this
Nothing at allNo power, or V0 not groundedCheck VDD→5V, VSS→GND, and V0→GND
A row of solid blocksPowered, but no dataRe-seat RS, E and the four data wires
Garbled / wrong charactersA data wire is loose or swappedConfirm D4, D5, D6, D7 → pins 5, 4, 3, 2
Readable but a bit dimNo backlight — that's expected hereRead it in good light, or wire the backlight (below)
Totally dark blue screenBlue-type LCDs really need backlightWire the backlight, or use a green/reflective one
First move, every time

A "dead" 1602A is almost always a power or ground wire that isn't fully seated. Push every jumper firmly home — especially the three going to GND and the one to 5V — before changing anything else.

07More wiring options

The 10-wire build trades a couple of features for simplicity. If you want them back, here's the cost in extra wires and effort:

You want…Do thisWires
Adjustable contrastAdd a 10 kΩ pot: middle leg → V0, outer legs → 5V and GND (instead of V0→GND)+2
The backlight onSolder two small bridges on the LCD header to share the GND and 5V pins, then wire A→5V and K→GND+2*
The fewest wiresUse an I²C backpack board (SDA, SCL, VCC, GND) with the LiquidCrystal_I2C libraryjust 4

* With solder bridges sharing the power pins, the backlight adds wires without running the Uno out of GND/5V sockets. The I²C route needs a different library and a little adapter board, but it's the tidiest of all — only four wires.

More electronics: Morse code