Arduino Mega · I2C LCD

Arduino Mega I2C LCD Simulator: Wiring, Code and a Live Circuit

This is a 16 by 2 character LCD with a PCF8574 I2C backpack, wired to an Arduino Mega 2560 and running live: the first line names the board and the second counts the seconds since reset. It uses the LiquidCrystal_I2C library, so four wires replace the sixteen of a bare LCD.

SDA goes to pin 20 and SCL to pin 21. Everything runs at 5 V, the Arduino Mega’s own level.

  • 5 V logic
  • Library: LiquidCrystal_I2C.h
  • I2C address 0x27
  • Powered from 5V
Arduino Mega · I2C LCDlive0.000 s 0.00x
Click to open it in the editor
The circuit itself, running on the simulator with the sketch below. Press what can be pressed; click anything else to open it in the editor.

Wiring the I2C LCD to the Arduino Mega

Every connection in the circuit above, with the board’s own pin names.

I2C LCD pinArduino Mega pinWhy
VCC5VThe display and its backlight run from 5 V.
GNDGNDCommon ground.
SDApin 20I2C data.
SCLpin 21I2C clock.

On the Mega the I2C bus is pin 20 (SDA) and pin 21 (SCL), not A4 and A5 as on an Uno. The SDA and SCL pins by AREF are the same two nets. The backpack’s own pull-ups hold both lines at 5 V, which is the Arduino Mega’s own logic level, so nothing else is needed.

Pins to leave alone on the Arduino Mega

Pins 14 to 19 are the three extra serial ports and 20 and 21 are I2C, so keep them free if you will need those. An Uno shield’s I2C on A4 and A5 is not connected to anything on a Mega.

On a real bench

The Mega is long, so put the breadboard beside its double row of pins 22 to 53 and leave the left-hand headers free. The I2C LCD uses only a few of its 54 pins; a Mega earns its size when one sketch drives a keypad, a display and several sensors at once.

The code

The sketch the circuit above runs. Open it in the editor, change a line and press Run: it compiles in your browser.

I2C LCD on Arduino Mega
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// A 16 x 2 display behind a PCF8574 backpack at 0x27.
// SDA pin 20, SCL pin 21.
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Arduino Mega");
  Serial.println("LCD ready");
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print("Seconds: ");
  lcd.print(millis() / 1000);
  lcd.print("   ");      // clears the tail of a shorter number
  delay(250);
}

LiquidCrystal_I2C lcd(0x27, 16, 2) names the backpack’s address and the size of the display. init() wakes the HD44780 controller behind the backpack in four-bit mode, and backlight() turns the LED on, which is a bit in the backpack, not in the display.

setCursor(column, row) counts from zero, so (0, 1) is the start of the second line. print() writes text there and moves the cursor along, the way Serial.print() does.

The three spaces after the number overwrite whatever a longer number left behind. Calling clear() every time would do the same and make the display flicker, because clear() takes about 2 ms and blanks the whole panel. Serial.begin(9600) opens the serial monitor. Serial is the USB port; Serial1 to Serial3 are on pins 18 and 19, 16 and 17, and 14 and 15.

Common mistakes with the I2C LCD on the Arduino Mega

The wrong address

Backpacks with the PCF8574T chip answer at 0x27; those with the PCF8574AT answer at 0x3F. The screen lights but shows nothing when the address is wrong. Run an I2C scanner, or set the part’s address property in the editor to match yours.

Contrast turned all the way down

A row of solid blocks, or nothing at all with the backlight on, is usually the blue trimmer on the backpack. Turn it until the text appears. In the simulator the part has a contrast property for the same thing.

Using A4 and A5

An Uno tutorial says SDA on A4 and SCL on A5. On the Mega those are plain analog pins; the bus is on 20 and 21. The display lights and shows nothing until the wires move.

Questions and answers

Can I simulate a 16x2 I2C LCD with an Arduino Mega 2560?

Yes. The circuit at the top of this page is an Arduino Mega 2560 with a 16x2 I2C LCD, running in your browser on a simulated ATmega2560. The characters the sketch prints appear on the simulated panel, backlight and contrast included. Press Run it in the editor to change the wiring or the code; it is free and needs no account.

Where do SDA and SCL go on the Arduino Mega?

On the Mega the I2C bus is pin 20 (SDA) and pin 21 (SCL), not A4 and A5 as on an Uno. The SDA and SCL pins by AREF are the same two nets.

Do I need a level shifter?

No. The Arduino Mega and the backpack both run at 5 V, so SDA and SCL connect directly.

How do I find the LCD’s I2C address?

Upload an I2C scanner sketch: it calls Wire.beginTransmission() on every address and prints the ones that answer. The two you will almost always see are 0x27 and 0x3F.

Build your own I2C LCD project

Open this circuit in the editor, change the wiring or the code, and keep your version in a free account.