Preview build — page text is a draft awaiting human review. Code badges come from real compiles. The flasher is real but not yet hardware-tested; the Playground is still a preview.

16x2 LCD without I2C on Arduino Uno — 4-bit wiring and contrast

Wire a plain 16x2 HD44780 LCD to an Arduino Uno R3 in 4-bit mode (RS D12, E D11, D4–D7 on D5–D2), set the contrast and print text.

Arduino C++Verified — core avr 1.8.8, LiquidCrystal 1.0.7, 3 Nov 2026Compile-only

Community draft — report a mistake

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 R3Only the pins used are shown · 5 V logic16×2 character LCD (1602, parallel HD44780)220 Ω1 kΩ5VGNDD2D3D4D5D11D12VSSVDDV0RSRWED0 (not connected)D1 (not connected)D2 (not connected)D3 (not connected)D4D5D6D7AK
Also needed: 1 kΩ resistor (or a 10 kΩ potentiometer) for contrast, 220 Ω resistor for the backlight.
Every connection
Arduino Uno R316×2 character LCD (1602, parallel HD44780)WireNotes
GNDVSSblack
5VVDDred
GNDV0orangeVia 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).
D12RSyellow
GNDRWblackWrite-only: RW must be LOW.
D11Egreen
D5D4blue
D4D5blue
D3D6blue
D2D7blue
5VAredVia 220 Ω — Backlight LED. Many modules already have a resistor near pin 15; the 220 Ω is harmless if so.
GNDKblack

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

lcd-16x2-parallel-uno.inoArduino C++Open in PlaygroundOpen in PlaygroundFlash
// 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

Serial Monitor · 9600Output
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.

↑↓ to move · Enter to open