Before I2C backpacks, every Arduino book wired the 16×2 LCD this way, and many kits sold in India still ship it bare. It needs six signal wires in 4-bit mode, plus power, contrast and backlight. The built-in LiquidCrystal library drives it.
On the Uno this takes six digital pins. The sketch uses the same pins as the Arduino IDE examples (RS on D12, E on D11, data on D5–D2), so you can follow any old tutorial. Everything is 5 V, so no shifting is needed. The one part that needs care is contrast on V0. A fixed 1 kΩ resistor to GND works for most panels; a 10 kΩ pot lets you tune it.
The sketch prints a greeting on the first line and counts seconds on the second.
Wiring
| Arduino Uno R3 | 16×2 character LCD (1602, parallel HD44780) | Wire | Notes |
|---|---|---|---|
| GND | VSS | black | |
| 5V | VDD | red | |
| GND | V0 | orange | Via 1 kΩ — Contrast. A 1–2.2 kΩ resistor to GND suits most 5 V panels; for fine control use a 10 kΩ pot (ends to 5V and GND, wiper to V0). |
| D12 | RS | yellow | |
| GND | RW | black | Write-only: RW must be LOW. |
| D11 | E | green | |
| D5 | D4 | blue | |
| D4 | D5 | blue | |
| D3 | D6 | blue | |
| D2 | D7 | blue | |
| 5V | A | red | Via 220 Ω — Backlight LED. Many modules already have a resistor near pin 15; the 220 Ω is harmless if so. |
| GND | K | black |
5 V (3.3 V versions exist — check the listing) part, 5 V board. Tie RW to GND so the LCD only ever reads from your board. A 3.3 V HIGH is above the HD44780’s 2.2 V input threshold, so ESP32 and Pico drive RS, E and D4–D7 directly while the LCD runs on 5 V.
Board quirks
- D0–D3 on the LCD stay unconnected — 4-bit mode sends each byte in two halves over D4–D7.
- These are the pins from the Arduino IDE’s LiquidCrystal examples. They use 6 Uno pins including D3, D5 and D11 — three of the six PWM pins, and D11 is also SPI MOSI. If you need those, move them: any digital pin works, just change the numbers in the constructor.
- Short on pins? An I2C backpack does the same job on two wires — see the 16x2 I2C guide.
- Contrast is the first thing to fix. With V0 floating you get nothing; tied straight to GND you get dark blocks on the top row.
Code
// 16x2 LCD (HD44780, no I2C backpack) on an Arduino Uno R3 in 4-bit mode.
// RS → D12, E → D11, D4 → D5, D5 → D4, D6 → D3, D7 → D2 (the Arduino IDE example pins).
// VSS, RW, K → GND. VDD → 5V. A → 220 Ω → 5V. V0 → about 1 kΩ to GND (or a 10 kΩ pot wiper).
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // RS, E, D4, D5, D6, D7
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.print(F("Hello, Uno!"));
Serial.println(F("LCD started in 4-bit mode. No text? Adjust V0 (contrast)."));
}
void loop() {
lcd.setCursor(0, 1);
lcd.print(F("Up "));
lcd.print(millis() / 1000);
lcd.print(F(" s "));
delay(1000);
}// 16x2 LCD (HD44780, no I2C backpack) on an Arduino Uno R3 in 4-bit mode.
// RS → D12, E → D11, D4 → D5, D5 → D4, D6 → D3, D7 → D2 (the Arduino IDE example pins).
// VSS, RW, K → GND. VDD → 5V. A → 220 Ω → 5V. V0 → about 1 kΩ to GND (or a 10 kΩ pot wiper).
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // RS, E, D4, D5, D6, D7
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.print(F("Hello, Uno!"));
Serial.println(F("LCD started in 4-bit mode. No text? Adjust V0 (contrast)."));
}
void loop() {
lcd.setCursor(0, 1);
lcd.print(F("Up "));
lcd.print(millis() / 1000);
lcd.print(F(" s "));
delay(1000);
}Library: LiquidCrystal (Arduino, Adafruit) — compiled with LiquidCrystal 1.0.7.
Expected serial output
LCD started in 4-bit mode. No text? Adjust V0 (contrast).LCD started in 4-bit mode. No text? Adjust V0 (contrast).
Common errors
A row of dark blocks, no text
The LCD has power but never got initialised. Check RS, E and D4–D7 match the constructor order (RS, E, D4, D5, D6, D7), and that RW is on GND.
Backlight on, screen looks empty
Contrast. Raise the V0 resistor to 2.2 kΩ, or use a pot and turn it slowly. See LCD shows blocks or blank.
Random characters after a few seconds
A loose wire on E or a data line, or long wires near a motor. Keep the ribbon short and press-fit pins firmly.