Blog

LCD1602 Character LCD Display – Complete Guide

Character LCD Display

LCD1602 Character LCD Display

16x2 Character Display with Parallel HD44780 Interface

The LCD1602 is a character-based liquid crystal display built around the HD44780 (or a compatible clone) controller, an interface standard so widely adopted that essentially every 16x2 and 20x4 character LCD sold today, from any manufacturer, speaks the same command set. Unlike a pixel-addressable OLED, a character LCD is organized as a fixed grid of character cells - 16 columns by 2 rows here - where each cell is really its own small dot-matrix display capable of showing any character from the controller's built-in font table, plus up to 8 fully custom user-defined characters you can design yourself for simple icons or symbols. The controller can be driven in either 8-bit or 4-bit parallel mode; 4-bit mode is by far the more common choice in Arduino projects since it uses only 6 digital pins total (4 data plus 2 control) instead of 10, at the cost of the library needing to send each byte as two separate nibbles internally - a tradeoff completely invisible to your own code once you're using a standard LCD library.

16 x 2 Characters
Display Size
HD44780
Controller
4-bit or 8-bit
Interface Mode

Key features

Industry-Standard HD44780 Interface

Compatible with the vast majority of Arduino LCD libraries.

4-Bit or 8-Bit Parallel Mode

Trade pin count for wiring simplicity depending on your project.

Adjustable Contrast

An onboard or external potentiometer sets display contrast.

Backlit Display

Blue or green/yellow LED backlight for visibility in normal indoor lighting.

8 Custom Characters

Define your own simple icons or symbols in the controller's CGRAM.

I2C Backpack Compatible

Widely available add-on backpacks reduce wiring to just 2 signal pins.

Technical specifications

Supply Voltage 5V DC
Display Format 16 characters x 2 rows
Controller HD44780 or compatible
Interface Parallel, 4-bit or 8-bit mode
Character Size 5x8 dots per character
Custom Characters Up to 8 user-defined (CGRAM)
Contrast Control Onboard/external potentiometer (V0 pin)
Backlight LED, typically blue or yellow-green
Pin Count 16-pin header (parallel interface)

Pinout

PinFunction
VSS / VDD Ground / 5V power supply
V0 Contrast adjustment input
RS / RW / E Register select, read/write, and enable control lines
D0–D7 Data lines (only D4–D7 used in 4-bit mode)
A / K Backlight LED anode / cathode

Applications

Menu and status displays for embedded projects Sensor readout panels Simple calculators and lookup devices Access-control PIN entry displays 3D printer and CNC status screens Standalone clocks and counters

What's in the box

1x LCD1602 display module

Downloads

Datasheet (PDF) Arduino LiquidCrystal Library Example
🔌
Pin Connections
1 Table
Pin Connections Table 1
BoardSensor PinConnection
LCD1602RS/EN/D4-D7/VOboard digital pins / board digital pins / 10k contrast pot wiper
📟
LCD1602 Parallel LCD Display with Blue Backlight
7 Examples • C/C++ | Boards: Arduino Uno, Arduino Nano, Arduino Mega, ESP32, ESP8266, STM32, Raspberry Pi Pico
LCD1602 Parallel LCD Display with Blue Backlight - Arduino Uno
LCD1602 Parallel LCD Display with Blue Backlight - Arduino Nano
LCD1602 Parallel LCD Display with Blue Backlight - Arduino Mega
LCD1602 Parallel LCD Display with Blue Backlight - ESP32
LCD1602 Parallel LCD Display with Blue Backlight - ESP8266
LCD1602 Parallel LCD Display with Blue Backlight - STM32
LCD1602 Parallel LCD Display with Blue Backlight - Raspberry Pi Pico
📄 File: lcd1602_parallel_lcd_display_with_blue_backlight_-_arduino_uno.inoArduino Uno
435 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RS=12, EN=11, D4-D7=5,4,3,2 on Arduino Uno. Also wire R/W to GND, and a 10k pot between VCC/GND with its wiper to VO for contrast.
6#include <LiquidCrystal.h>
7
8LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
9
10void setup() {
11 lcd.begin(16, 2);
12 lcd.print("Hello, Ekostra!");
13}
14
15void loop() {
16 lcd.setCursor(0, 1);
17 lcd.print(millis() / 1000);
18 lcd.print(" sec");
19 delay(500);
20}
📄 File: lcd1602_parallel_lcd_display_with_blue_backlight_-_arduino_nano.inoArduino Nano
436 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RS=12, EN=11, D4-D7=5,4,3,2 on Arduino Nano. Also wire R/W to GND, and a 10k pot between VCC/GND with its wiper to VO for contrast.
6#include <LiquidCrystal.h>
7
8LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
9
10void setup() {
11 lcd.begin(16, 2);
12 lcd.print("Hello, Ekostra!");
13}
14
15void loop() {
16 lcd.setCursor(0, 1);
17 lcd.print(millis() / 1000);
18 lcd.print(" sec");
19 delay(500);
20}
📄 File: lcd1602_parallel_lcd_display_with_blue_backlight_-_arduino_mega.inoArduino Mega
436 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RS=12, EN=11, D4-D7=5,4,3,2 on Arduino Mega. Also wire R/W to GND, and a 10k pot between VCC/GND with its wiper to VO for contrast.
6#include <LiquidCrystal.h>
7
8LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
9
10void setup() {
11 lcd.begin(16, 2);
12 lcd.print("Hello, Ekostra!");
13}
14
15void loop() {
16 lcd.setCursor(0, 1);
17 lcd.print(millis() / 1000);
18 lcd.print(" sec");
19 delay(500);
20}
📄 File: lcd1602_parallel_lcd_display_with_blue_backlight_-_esp32.inoESP32
437 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RS=13, EN=12, D4-D7=14,27,26,25 on ESP32. Also wire R/W to GND, and a 10k pot between VCC/GND with its wiper to VO for contrast.
6#include <LiquidCrystal.h>
7
8LiquidCrystal lcd(13, 12, 14, 27, 26, 25);
9
10void setup() {
11 lcd.begin(16, 2);
12 lcd.print("Hello, Ekostra!");
13}
14
15void loop() {
16 lcd.setCursor(0, 1);
17 lcd.print(millis() / 1000);
18 lcd.print(" sec");
19 delay(500);
20}
📄 File: lcd1602_parallel_lcd_display_with_blue_backlight_-_esp8266.inoESP8266
439 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RS=D0, EN=D1, D4-D7=D2,D3,D4,D5 on ESP8266. Also wire R/W to GND, and a 10k pot between VCC/GND with its wiper to VO for contrast.
6#include <LiquidCrystal.h>
7
8LiquidCrystal lcd(D0, D1, D2, D3, D4, D5);
9
10void setup() {
11 lcd.begin(16, 2);
12 lcd.print("Hello, Ekostra!");
13}
14
15void loop() {
16 lcd.setCursor(0, 1);
17 lcd.print(millis() / 1000);
18 lcd.print(" sec");
19 delay(500);
20}
📄 File: lcd1602_parallel_lcd_display_with_blue_backlight_-_stm32.inoSTM32
449 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RS=PB0, EN=PB1, D4-D7=PB2,PB3,PB4,PB5 on STM32. Also wire R/W to GND, and a 10k pot between VCC/GND with its wiper to VO for contrast.
6#include <LiquidCrystal.h>
7
8LiquidCrystal lcd(PB0, PB1, PB2, PB3, PB4, PB5);
9
10void setup() {
11 lcd.begin(16, 2);
12 lcd.print("Hello, Ekostra!");
13}
14
15void loop() {
16 lcd.setCursor(0, 1);
17 lcd.print(millis() / 1000);
18 lcd.print(" sec");
19 delay(500);
20}
📄 File: lcd1602_parallel_lcd_display_with_blue_backlight_-_raspberry_pi_pico.inoRaspberry Pi Pico
449 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// RS=10, EN=11, D4-D7=12,13,14,15 on Raspberry Pi Pico. Also wire R/W to GND, and a 10k pot between VCC/GND with its wiper to VO for contrast.
6#include <LiquidCrystal.h>
7
8LiquidCrystal lcd(10, 11, 12, 13, 14, 15);
9
10void setup() {
11 lcd.begin(16, 2);
12 lcd.print("Hello, Ekostra!");
13}
14
15void loop() {
16 lcd.setCursor(0, 1);
17 lcd.print(millis() / 1000);
18 lcd.print(" sec");
19 delay(500);
20}
Parallel-interface 16x2 character LCD.
The single most common ”blank screen” cause is contrast, not wiring - if nothing shows, not even the faint row of cursor boxes, turn the contrast potentiometer through its full range before assuming a code or connection problem. Wiring all pins directly also uses a lot of GPIO - an inexpensive I2C backpack module solders onto the back of the LCD and reduces the connection to just 4 wires (VCC, GND, SDA, SCL), which is worth the small extra cost on almost any project with pins to spare. And remember the built-in character set is fixed text plus a handful of special glyphs depending on the controller revision - true custom graphics need to be built one 5x8 tile at a time in CGRAM, not drawn freeform the way an OLED would allow.