Character LCD modules such as 1602, 2004 and 1604 displays are still very useful in Arduino, ESP32, ESP8266, RP2040 and CANABLOX projects. They are inexpensive, easy to read, and available with I2C backpack modules that reduce the wiring to only four connections.
One of the most common problems is that the LCD backlight turns on, but no text appears. The display may glow blue, green or white, but the characters are missing. Sometimes the screen shows only dark blocks, sometimes nothing at all.
This problem is usually caused by contrast adjustment, wrong I2C address, wrong library, wrong LCD size, wrong backpack pin mapping, power problems or voltage-level issues.
Typical Symptoms
- The LCD backlight turns on, but no text appears.
- The display shows a row of dark blocks.
- The I2C scanner finds an address, but the example sketch does not work.
- The display works with one library but not another.
- The text appears on the wrong line or wraps strangely.
- The display works on Arduino Uno but not on ESP32.
- The display works only when the contrast potentiometer is touched or adjusted.
First Check: The Backlight Is Not the Same as the LCD
The backlight is only the light behind the LCD glass. It can turn on even when the LCD controller is not initialized correctly.
This means a glowing display does not prove that the LCD is working. It only proves that the backlight has power.
The actual text display depends on:
- The LCD controller receiving correct data.
- The contrast voltage being adjusted correctly.
- The I2C backpack mapping matching the library.
- The sketch using the correct address and display size.
Most Common Cause: Contrast Is Set Wrong
Most I2C LCD backpacks have a small blue potentiometer. This controls the LCD contrast, not the backlight brightness.
If the contrast is too low, the display may look completely blank. If the contrast is too high, you may see dark blocks instead of normal text.
Use a small screwdriver and turn the contrast potentiometer slowly while the test sketch is running.
- If the display is blank, turn the contrast slowly in both directions.
- If you see solid blocks, reduce the contrast slightly.
- Do not assume the display is dead until contrast has been adjusted.
This is the number one mistake with 1602 and 2004 LCD modules.
Common Cause: Wrong I2C Address
I2C LCD backpacks commonly use addresses such as 0x27 or 0x3F. Other addresses are possible depending on the expander chip and solder jumpers.
Run an I2C scanner first. Then make sure the sketch uses the address found by the scanner.
LiquidCrystal_I2C lcd(0x27, 16, 2);
If the scanner reports 0x3F, but the sketch uses 0x27, change the constructor:
LiquidCrystal_I2C lcd(0x3F, 16, 2);
The backlight may still turn on with some libraries even when the LCD data is not being written correctly, so always confirm the address.
Common Cause: Wrong LCD Size in the Sketch
The LCD constructor must match the physical display size.
| Display Type | Characters | Typical Constructor |
|---|---|---|
| 1602 LCD | 16 columns x 2 rows | LiquidCrystal_I2C lcd(0x27, 16, 2); |
| 2004 LCD | 20 columns x 4 rows | LiquidCrystal_I2C lcd(0x27, 20, 4); |
| 1604 LCD | 16 columns x 4 rows | LiquidCrystal_I2C lcd(0x27, 16, 4); |
If the wrong size is selected, text may appear on unexpected lines, wrap incorrectly, or disappear outside the visible area.
Common Cause: Wrong Library
There are several Arduino libraries with similar names for I2C LCD modules. Some use different constructors. Some expect different backpack wiring. Some are old and no longer work well with modern board packages.
If an example sketch does not work, check which library it was written for. Do not mix code from one LCD library with another library unless the functions and constructor match.
Common signs of a library mismatch:
- The code compiles, but nothing appears.
- The backlight function works, but text does not.
- The constructor format in the example does not match your installed library.
- The compiler says multiple LCD libraries were found.
Common Cause: Backpack Pin Mapping Is Different
Most I2C LCD backpacks use a PCF8574 or PCF8574A I/O expander. The expander controls the LCD data pins, enable pin, register-select pin and backlight transistor.
Unfortunately, not all backpacks connect the expander pins to the LCD in the same way.
If the library assumes one pin mapping but the backpack uses another, the LCD may not initialize. The scanner will still find the I2C chip, but the LCD will not display text.
This is one reason why one LiquidCrystal_I2C library may work while another does not.
Common Cause: PCF8574 vs PCF8574A
Some LCD backpacks use the PCF8574. Others use the PCF8574A. These chips are very similar, but their default I2C address ranges are different.
- PCF8574 backpacks are often found around 0x20 to 0x27.
- PCF8574A backpacks are often found around 0x38 to 0x3F.
This is why one LCD backpack may be at 0x27 and another almost identical-looking backpack may be at 0x3F.
Common Cause: Incorrect Initialization Order
Most LCD libraries require a specific setup order. A typical sketch should initialize the LCD, turn on the backlight and then print text.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Hello World");
lcd.setCursor(0, 1);
lcd.print("LCD is working");
}
void loop() {
}
Some libraries use lcd.begin() instead of lcd.init(). Use the function required by your installed library.
Common Cause: SDA and SCL Are on the Wrong Pins
On Arduino Uno and Nano, I2C is usually on A4 and A5. On Arduino Mega, it is on pins 20 and 21. On ESP32, the pins are flexible, but the sketch must define them correctly if non-default pins are used.
If the I2C scanner finds the LCD, the basic SDA/SCL wiring is probably correct. But if the scanner finds nothing, check the pins first.
| Board | Typical SDA | Typical SCL | Note |
|---|---|---|---|
| Arduino Uno / Nano | A4 | A5 | Also available on SDA/SCL header on some boards |
| Arduino Mega 2560 | 20 | 21 | Different from Uno/Nano |
| ESP8266 NodeMCU | Often D2 / GPIO4 | Often D1 / GPIO5 | Depends on sketch and board definition |
| ESP32 | Often GPIO21 | Often GPIO22 | Can be changed in code |
ESP32 Note: Define the I2C Pins If Needed
On ESP32, it is often safer to define the SDA and SCL pins explicitly before using the LCD.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define I2C_SDA 21
#define I2C_SCL 22
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Wire.begin(I2C_SDA, I2C_SCL);
lcd.init();
lcd.backlight();
lcd.print("Hello ESP32");
}
void loop() {
}
Change the pin numbers to match your board and wiring.
Common Cause: 5V LCD Backpack on a 3.3V Controller
Many character LCD modules are designed for 5V operation. The LCD itself, the backpack pull-up resistors and the backlight circuit may all be connected to 5V.
This can create two different problems with ESP32, ESP8266, RP2040 and other 3.3V boards:
- The LCD backpack may pull SDA and SCL up to 5V, which is unsafe for many 3.3V microcontrollers.
- The LCD backpack may not reliably recognize 3.3V I2C signals if it is powered from 5V.
Some modules work anyway, but this should not be assumed. For reliable operation, use a proper I2C level shifter, a 3.3V-compatible LCD module, or a backpack designed for 3.3V logic.
Common Cause: Power Is Too Weak
Character LCDs with backlights can draw more current than small OLED displays, especially if the backlight is bright. If the power supply is weak, the backlight may turn on but the controller may behave unreliably.
Check for:
- Weak USB ports.
- Long breadboard wires.
- Poor ground connection.
- Backlight drawing too much current from a small regulator.
- Other modules sharing the same supply.
Measure the voltage directly at the LCD module while it is connected.
Common Cause: I2C Pull-Ups Are Missing or Wrong
Most I2C LCD backpacks include pull-up resistors. However, if the pull-ups are missing, removed, too weak, or pulled to the wrong voltage, communication can fail or become unreliable.
If several I2C modules are connected, each one may include pull-ups. Too many pull-ups in parallel can make the effective resistance too low and overload the bus.
If the display works alone but fails when other I2C modules are added, pull-up resistance and address conflicts should be checked.
Common Cause: The LCD Is Not Actually I2C
Some character LCD modules have only the bare parallel interface. Others have an I2C backpack soldered to the back.
If the module does not have an I2C backpack, it cannot be controlled by SDA and SCL directly. A bare HD44780-compatible LCD needs multiple data/control pins or an added backpack module.
Check whether the back of the display has a small I2C adapter board with pins labeled VCC, GND, SDA and SCL.
Common Cause: Damaged Solder Joints
Many LCD backpacks are hand-soldered or factory-soldered to the LCD module. A poor solder joint between the backpack and the LCD can cause the I2C chip to respond while the LCD itself receives bad or missing signals.
This can produce a confusing result:
- The I2C scanner finds the backpack.
- The backlight works.
- The LCD does not show text.
Inspect the solder joints between the backpack and the LCD header. Reflow bad joints if necessary.
Recommended Troubleshooting Steps
- Run an I2C scanner and write down the address.
- Use that address in the LCD constructor.
- Set the correct display size: 16x2, 20x4, 16x4 or other.
- Turn the contrast potentiometer slowly while the sketch is running.
- Try the simplest “Hello World” example for your installed library.
- Check whether your library uses
lcd.init()orlcd.begin(). - Disconnect other I2C devices.
- Check whether the backpack is PCF8574 or PCF8574A.
- Check voltage compatibility, especially with ESP32 and other 3.3V boards.
- Inspect solder joints between the backpack and the LCD.
Quick Diagnostic Table
| Symptom | Most Likely Cause | First Thing to Try |
|---|---|---|
| Backlight on, completely blank screen | Contrast too low, wrong address, wrong library | Adjust contrast and run I2C scanner |
| One row of black blocks | LCD powered but not initialized | Check library, address, init function and pin mapping |
| Backlight can be controlled, but no text | Backpack responds, LCD mapping or init is wrong | Try another LiquidCrystal_I2C library or mapping-aware library |
| Text appears on wrong lines | Wrong LCD size or row mapping | Use correct constructor for 16x2, 20x4 or 16x4 |
| Works on Uno, fails on ESP32 | Voltage-level or I2C pin issue | Check 3.3V logic compatibility and define SDA/SCL |
| Works alone, fails with other modules | Address conflict or pull-up problem | Test one I2C module at a time |
When the LCD May Actually Be Defective
The LCD may be defective, but this should be considered after the common checks.
A display or backpack may be damaged if:
- The I2C scanner never finds the backpack on any board.
- The module gets unusually hot.
- SDA or SCL is permanently pulled low.
- The contrast adjustment has no visible effect at all.
- The same sketch and wiring work with another identical LCD.
- There is visible physical damage or bad soldering.
CANABLOX Practical Note
CANABLOX helps remove many of the usual LCD troubleshooting problems because the wiring is modular and repeatable. Instead of running many loose jumper wires between a controller and a display, CANABLOX modules use standardized connections and are easier to isolate.
When testing an I2C LCD in a CANABLOX setup, start with only the controller and the LCD module connected. Confirm the I2C address, run a simple display test, then add other modules one at a time.
Conclusion
If a 1602 or 2004 I2C LCD backlight works but no text appears, the display is often not broken. The backlight is only one part of the module and can work even when the LCD itself is not initialized correctly.
Start with contrast adjustment, then check the I2C address, LCD size, library, initialization function, backpack pin mapping and voltage compatibility.
Most of these displays are reliable once the correct combination of address, library and contrast setting is found.
