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.
📋 Contents
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.
Components Required
LCD Wiring (4-Bit Mode)
| LCD Pin | Name | Connect To | Notes |
|---|---|---|---|
| 1 | GND / VSS | GND | Ground |
| 2 | VCC / VDD | 5V | Power supply |
| 3 | VO (Contrast) | Pot middle pin | Adjust for visibility |
| 4 | RS | D12 | Register Select |
| 5 | RW | GND | Always write mode |
| 6 | EN | D11 | Enable signal |
| 7–10 | D0–D3 | Not used | 4-bit mode: leave unconnected |
| 11 | D4 | D5 | Data bit 4 |
| 12 | D5 | D4 | Data bit 5 |
| 13 | D6 | D3 | Data bit 6 |
| 14 | D7 | D2 | Data bit 7 |
| 15 | LED+ | 5V via 220Ω | Backlight anode |
| 16 | LED− | GND | Backlight cathode |

Visual Reference
Circuit Diagram
📐
Circuit diagram — Arduino UNO to 16×2 LCD in 4-bit mode. Pins D0–D3 left unconnected in this mode.
Assembly Guide
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.
Arduino Sketch
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
}
Try it online
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
Going further
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.
Common Issues
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.
More from MakeMindz
Explore More Projects
Level up with these Arduino tutorials — from beginner sensors to advanced robotics.
Circuit Diagram
Step-by-Step Instructions
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.
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).
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).
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
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.
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.
Basic Display Code
Uses the built-in LiquidCrystal library — no extra installation needed.
// 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 FilesDisplay 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:
#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 }
lcd.clear() — though clear() causes a brief flicker.
Troubleshooting Guide
Adjust the contrast potentiometer. Turn it slowly from one extreme to the other until characters appear. This is the #1 issue for new builders.
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.
Check that the 220Ω resistor is connected between 5V and LCD pin 15 (LED+). Also verify LCD pin 16 (LED−) is connected to GND.
Ensure RW (LCD pin 5) is tied to GND. A floating RW pin can cause random writes. Also check for loose jumper connections.
The LiquidCrystal library ships with the Arduino IDE. Go to Sketch → Include Library → Manage Libraries and search for "LiquidCrystal" to install it.
Explore More Projects
Level up with these Arduino tutorials — from beginner sensors to advanced robotics.
Comments
Post a Comment