Skip to main content
An LCD with 2 lines, 16 characters per line.

Pin names

The LCD1602 comes in 2 possible configurations: I2C configuration and standard configuration. The I2C configuration is usually simpler to use. The following table summarizes the key differences:
PropertyStandardI2C
Number of Arduino I/O pins7*2 (SCL/SDA)
Backlight controlOptionalYes
Library nameLiquidCrystalLiquidCrystal_I2C
* Controlling the backlight requires another I/O pin. You can select the desired configuration by setting the pins attribute. Set it to “i2c” for the I2C configuration, or “full” for the standard configuration (the default).

I2C configuration

GND
pin
Ground
VCC
pin
Supply voltage
SDA
pin
I2C data line
SCL
pin
I2C clock line
The default I2C address of the LCD1602 module is 0x27. You can change the address by setting the i2cAddress attribute.
The I2C configuration simulates a PCF8574T chip that controls the LCD module. Normally, you wouldn’t have to worry about this as the LiquidCrystal_I2C library takes care of the communication with the chip.

PCF8574T pin mapping

The following table shows how the PCF8574T I/O expander pins are mapped to the HD44780 LCD controller:
PCF8574T PinHD44780 Pin
P0RS
P1R/W
P2E
P3Backlight
P4D4
P5D5
P6D6
P7D7
For an example of controlling the LCD using direct I2C commands (without the LiquidCrystal_I2C library), see I2C Protocol for LCD.

Standard configuration

VSS
pin
Ground
VDD
pin
Supply voltage
V0
pin
Contrast adjustment (not simulated)
RS
pin
Command/Data select
RW
pin
Read/Write. Connect to Ground.
E
pin
Enable
D0
pin
Parallel data 0 (optional, 8-bit mode only)
D1
pin
Parallel data 1 (optional, 8-bit mode only)
D2
pin
Parallel data 2 (optional, 8-bit mode only)
D3
pin
Parallel data 3 (optional, 8-bit mode only)
D4
pin
Parallel data 4
D5
pin
Parallel data 5
D6
pin
Parallel data 6
D7
pin
Parallel data 7
A
pin
Backlight anode
K
pin
Backlight cathode
Normally, you’d configure the chip in 4-bit parallel mode, which means you only need to connect RS, E, D4, D5, D6, and D7 pins to Arduino.

Arduino code example

When you initialize the LiquidCrystal library in your code, you need to pass the pin numbers to the constructor. The following example uses pin numbers that match a typical setup:
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

void setup() {
  lcd.begin(16, 2);
  // you can now interact with the LCD, e.g.:
  lcd.print("Hello World!");
}

void loop() {
  // ...
}
You can also try this example on Wokwi.

Attributes

pins
string
default:"full"
Set to “i2c” for I2C configuration
i2cAddress
string
default:"0x27"
I2C address (I2C configuration only)
color
string
default:"black"
The color of the text
background
string
default:"green"
The color of the backlight
variant
string
default:"A00"
Font variant: “A00” or “A02” (see Font section below)

Font

The LCD1602 uses the Hitachi HD44780 LCD Controller chip. The chip comes with a built-in font, as well as the ability to define up to 8 custom characters. There are two versions of the chip’s ROM with two different fonts: HD44780UA00, which includes Japanese katakana characters, and HD44780UA02, which includes Western European characters. Wokwi simulates the HD44780UA00 variant by default, but you can switch to the HD44780UA02 variant by setting the variant attribute to “A02”.

A00 variant

The HD44780UA00 font has 256 characters, with the following ranges:
RangeDescription
0-7User defined characters
8-31Blank characters
32-127Standard ASCII characters
128-160Blank characters
161-255Japanese katankana and symbols

A02 variant

The HD44780UA02 font has 256 characters, with the following ranges:
RangeDescription
0-7User defined characters
8-31Blank characters
32-127Standard ASCII characters (characters 92, 126, 127 differ from A00)
128-255Western european and Cyrillic characters, symbols

User defined characters

You can define custom characters using the createChar method of the LiquidCrystal (or LiquidCrystal_I2C) library. The custom characters are the first 8 characters in the font, with indexes from 0 to 7. You can print them to the LCD display using the write() method, or using C string escape sequence, such as "\x07". The following code example defines a heart shaped character, stores it at index 3, and then uses it to display the text “I (heart) Arduino”:
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

uint8_t heart[8] = {
  0b00000,
  0b01010,
  0b11111,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000,
};

void setup() {
  lcd.createChar(3, heart);
  lcd.begin(16, 2);
  lcd.print("  I \x03 Arduino");
}

void loop() { }
You can also run this example on Wokwi. You can modify any custom character while the program is running. This method is useful for creating simple animations. For example, change loop() in the code sample above to slowly reveal the heart icon, line-by-line:
void loop() {
  uint8_t heart2[8] = {0};
  for (int i = 0; i < 8; i++) {
    heart2[i] = heart[i];
    lcd.createChar(3, heart2);
    delay(100);
  }
  delay(500);
}

Simulator examples

Build docs developers (and LLMs) love