Device Information
There are several LCD backpacks on the market. This guide is written specifically using backpacks sold by HiLetGo on Amazon, but should work with any LCD Backpack using a single PCF8574T module. Note that the backpacks with a different architecture (like Adafruit’s) use a different library for communication. Additionally, not all modules are equal – we have found that those from SunFounder may vary in addressing schemas, despite being similar architecture to the HiLetgo modules.
In summary: The general function for all backpacks is the same, but some details may differ from the notes below for different individual units.

Arduino Library
The LCD Library for this module is from https://github.com/johnrickman/LiquidCrystal_I2C.
In Arduino Library Manager, is it listed as “LiquidCrystal I2C” by “Frank de Brabander”. The version used in the code provided below is 1.1.2 .
Setting the Address
There are 3 solder pads on the backpack, labeled A0, A1, and A2. By default, the pads are all open. You may close them with a solder or wire bridge to adjust the address to suit your needs.
For convenience, it can be a great help to write the address in Sharpie on the back of the LCD/Backpack combination.
Address | A0 | A1 | A2 |
0x20 | Closed | Closed | Closed |
0x21 | Open | Closed | Closed |
0x22 | Closed | Open | Closed |
0x23 | Open | Open | Closed |
0x24 | Closed | Closed | Open |
0x25 | Open | Closed | Open |
0x26 | Closed | Open | Open |
0x27 | Open | Open | Open |

Obtaining the Address & Writing to the display
Some modules do not use the table above, even if they use the same architecture. As such, it is fairly standard to scan the I2C bus to identify the display. I took the code a step further and print the address to the display when it is found.

#include <LiquidCrystal_I2C.h>
// SPDX-FileCopyrightText: 2023 Carter Nelson for Adafruit Industries
//
// SPDX-License-Identifier: MIT
// --------------------------------------
// i2c_scanner
//
// Modified from https://playground.arduino.cc/Main/I2cScanner/
// --------------------------------------
// The LCD Library used is from https://github.com/johnrickman/LiquidCrystal_I2C
//
// In Arduino Library Manager, is it listed as "LiquidCrystal I2C" by "Frank de Brabander". The version used in dev is 1.1.2 .
#include <Wire.h>
LiquidCrystal_I2C *plcd = NULL;
void setup() {
Wire.begin();
Serial.begin(9600);
while (!Serial)
delay(10);
Serial.println("\nI2C Scanner for LCD Backpacks");
delay(2000);
}
void loop() {
byte error;
uint8_t address;
int nDevices;
char addrString[4];
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at decimal address ");
Serial.print(address);
Serial.print(" or hexadecimal address 0x");
Serial.print(address, HEX);
Serial.println(" !");
sprintf(addrString, "%#x", address);
plcd = new LiquidCrystal_I2C(address, 20, 4);
plcd -> init();
plcd -> noBacklight();
delay(1000);
plcd -> clear();
plcd -> backlight();
plcd -> setCursor(0,0);
plcd -> print("Hello World");
plcd -> setCursor(0,1);
plcd -> print(addrString);
nDevices++;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(60000);
}