Arduino Uno with 16x2 LCD (Non-I2C) – Circuit and Code (4-Bit Mode)

Arduino UNO with 16x2 LCD (Non-I2C) – 4-Bit Mode Tutorial | MakeMindz
🔧 Beginner Tutorial

Arduino UNO with
16×2 LCD (Non-I2C)

Interface a character LCD in 4-bit parallel mode — no I2C adapter needed. Full wiring, code & simulation included.

4-Bit Mode
Beginner Friendly
⏱ ~20 min build

What You'll Build

In this tutorial, we'll interface a 16×2 Character LCD (Non-I2C) with the Arduino Uno using 4-bit parallel mode. Unlike the I2C version, this setup uses data pins D4–D7 plus RS and EN control pins — giving you a hands-on understanding of how parallel communication works.


💡
Why 4-bit mode? In 4-bit mode, data is sent in two 4-bit chunks instead of all 8 bits at once. This reduces the number of Arduino pins needed from 8 to just 4 data pins — saving precious GPIO for other sensors!

Components Required

🔵
Arduino UNOMicrocontroller
📺
16×2 LCD16-pin, Non-I2C
🎛️
10kΩ PotentiometerContrast control
220Ω ResistorBacklight protection
🔌
BreadboardFull/half size
🔗
Jumper WiresMale-to-male

LCD Wiring (4-Bit Mode)

LCD Pin Name Connect To Notes
1GND / VSSGNDGround
2VCC / VDD5VPower supply
3VO (Contrast)Pot middle pinAdjust for visibility
4RSD12Register Select
5RWGNDAlways write mode
6END11Enable signal
7–10D0–D3Not used4-bit mode: leave unconnected
11D4D5Data bit 4
12D5D4Data bit 5
13D6D3Data bit 6
14D7D2Data bit 7
15LED+5V via 220ΩBacklight anode
16LED−GNDBacklight cathode

🎛️
Potentiometer Wiring Connect one outer pin to 5V, the other outer pin to GND, and the middle (wiper) pin to LCD pin 3 (VO). Turn the knob until characters appear clearly.




Circuit Diagram

ARDUINO UNO R3 D2 ● D3 ● D4 ● D5 ● D11 ● D12 ● 5V ● GND ● BREADBOARD 10kΩ Pot 220Ω MakeMindz Arduino LCD 16x2 LCD Module 1 2 3 4 5 6 11 12 13 14 15 16 RW→GND VO (contrast) Circuit Diagram — Arduino UNO ↔ 16×2 LCD (4-Bit Mode) RS → D12 EN → D11 D4 → D5 D5 → D4 D6 → D3 D7 → D2 5V (power) GND Contrast (Pot) Backlight (via 220Ω)
📐 Circuit diagram — Arduino UNO to 16×2 LCD in 4-bit mode. Pins D0–D3 left unconnected in this mode.

Step-by-Step Instructions

01

Power the LCD (Pins 1 & 2)

Connect LCD Pin 1 (GND/VSS) to the breadboard's GND rail and LCD Pin 2 (VCC) to the 5V rail. Connect your Arduino's 5V and GND to the corresponding breadboard rails.

⚡ Always wire power before signal lines to avoid floating pins.
02

Connect the Potentiometer (Pin 3)

Place the 10kΩ potentiometer on the breadboard. Wire one outer leg to 5V, the other outer leg to GND, and the middle (wiper) pin to LCD Pin 3 (VO).

🎛️ Turn the pot after powering on — you'll see contrast appear. If nothing shows, try adjusting this first!
03

Wire RS and EN Control Pins (Pins 4 & 6)

Connect LCD Pin 4 (RS)Arduino D12 and LCD Pin 6 (EN)Arduino D11. Connect LCD Pin 5 (RW)GND (we always write, never read).

🔴 RS controls whether you're sending a command or character. EN is the "clock" that latches each byte.
04

Connect Data Pins D4–D7 (Pins 11–14)

In 4-bit mode, only the upper 4 data pins are used. Leave LCD pins 7–10 unconnected.

  • LCD Pin 11 (D4) → Arduino D5
  • LCD Pin 12 (D5) → Arduino D4
  • LCD Pin 13 (D6) → Arduino D3
  • LCD Pin 14 (D7) → Arduino D2
📌 Note the reversed pin numbering — LCD D4 goes to Arduino D5, not D4. This is correct!
05

Wire the Backlight (Pins 15 & 16)

Connect LCD Pin 15 (LED+) → 5V through a 220Ω resistor. Connect LCD Pin 16 (LED−) → GND. The resistor protects the LED from overcurrent.

💡 Without the resistor, the backlight may burn out quickly. Don't skip it!
06

Upload Code & Adjust Contrast

Upload the Arduino code below. Power on the board, then slowly turn the potentiometer until characters appear on the LCD. You should see "MakeMindz" on line 1 and "Arduino LCD" on line 2.

✅ If you see solid black blocks, turn the pot the other way. If nothing shows, check your EN and RS pin connections.

Basic Display Code

Uses the built-in LiquidCrystal library — no extra installation needed.


Arduino C++
// MakeMindz — 16x2 LCD Tutorial (Non-I2C, 4-bit mode)
#include <LiquidCrystal.h>

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

void setup() {
  lcd.begin(16, 2);       // 16 columns, 2 rows

  lcd.setCursor(0, 0);    // Column 0, Row 0
  lcd.print("MakeMindz");

  lcd.setCursor(0, 1);    // Column 0, Row 1
  lcd.print("Arduino LCD");
}

void loop() {
  // Nothing needed — text stays on screen
}

Tinkercad Simulation

🖥️

Test the circuit before building!

Open the Tinkercad simulation to run the code virtually — no hardware needed to get started.

▶ Open Tinkercad Simulation ⬇ Download Files

Display Live Sensor Values

Want to show real-time data? Here's how to display an analog sensor reading (e.g. a temperature sensor on A0) and refresh it every second:


Arduino C++ — Sensor Display
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int sensorPin = A0;

void setup() {
  lcd.begin(16, 2);
}

void loop() {
  int value = analogRead(sensorPin);   // 0–1023

  lcd.setCursor(0, 0);
  lcd.print("Sensor Value:   ");   // trailing spaces clear old chars

  lcd.setCursor(0, 1);
  lcd.print(value);
  lcd.print("              ");     // clear stale digits

  delay(1000);                          // update every 1 second
}

🔬
Pro tip: Clear stale characters When the displayed number shrinks (e.g. from 1023 to 9), old digits remain visible. Add trailing spaces after your value or call lcd.clear() — though clear() causes a brief flicker.

Troubleshooting Guide

Screen shows blank/black boxes only

Adjust the contrast potentiometer. Turn it slowly from one extreme to the other until characters appear. This is the #1 issue for new builders.

💡
Backlight on but no characters visible

Your EN/RS pins may be swapped or the data pins mapped incorrectly. Double-check that LiquidCrystal lcd(12, 11, 5, 4, 3, 2) matches your wiring exactly.

🔇
No backlight at all

Check that the 220Ω resistor is connected between 5V and LCD pin 15 (LED+). Also verify LCD pin 16 (LED−) is connected to GND.

🔁
Garbled or random characters

Ensure RW (LCD pin 5) is tied to GND. A floating RW pin can cause random writes. Also check for loose jumper connections.

📚
Compilation error: LiquidCrystal not found

The LiquidCrystal library ships with the Arduino IDE. Go to Sketch → Include Library → Manage Libraries and search for "LiquidCrystal" to install it.


© 2026 MakeMindz — Arduino & Robotics Tutorials for Everyone

Made with ❤️ in Coimbatore, India

Comments