The Nokia 5110 LCD is a ₹200 84×48 monochrome screen with a backlight, good for small menus and battery gadgets. Its controller, the PCD8544, is a 3.3 V chip — the one detail that decides how you wire it to an Uno.
Power it from the Uno’s 3.3V pin, and pass each of the five signal lines through a 1 kΩ / 2 kΩ divider: RST on D9, CE on D10, DC on D8, and hardware SPI on D11 (DIN) and D13 (CLK). The sketch shows an uptime counter in large digits and lets you tune the contrast from the Serial Monitor — the most common reason a new 5110 shows nothing.
Wiring
| Arduino Uno R3 | Nokia 5110 LCD (84×48, PCD8544) | Wire | Notes |
|---|---|---|---|
| D9 | RST | orange | Via 1 kΩ / 2 kΩ divider |
| D10 | CE | purple | Via 1 kΩ / 2 kΩ divider — Chip select (SCE on blue boards). |
| D8 | DC | blue | Via 1 kΩ / 2 kΩ divider |
| D11 | DIN | green | Via 1 kΩ / 2 kΩ divider — Hardware SPI MOSI. |
| D13 | CLK | yellow | Via 1 kΩ / 2 kΩ divider — Hardware SPI SCK. |
| 3.3V | VCC | red | Never 5V — the PCD8544 is a 3.3 V chip. It draws well under 1 mA. |
| GND | BL | black | Via 330 Ω — Red boards light the backlight with BL to GND. Blue boards: BL through 330 Ω to 3.3V instead. |
| GND | GND | black |
3.3 V (2.7–3.3 V) part, 5 V board. The PCD8544 is a 3.3 V chip and its inputs are not 5 V tolerant. ESP32 and Pico connect directly. On an Uno power it from 3.3 V and drop the five signal lines through a level shifter (or 10 kΩ series resistors on RST, DC, DIN, CLK and 1 kΩ on CE as a quick fix).
Board quirks
- The PCD8544’s inputs are not 5 V tolerant. Each of the five lines from the Uno gets a 1 kΩ / 2 kΩ divider, so 5 V arrives as 3.3 V. The often-quoted shortcut — 10 kΩ series resistors — relies on the chip’s protection diodes and is a quick hack, not a fix.
- Power goes to the Uno’s 3.3V pin. The 5 V pin damages the display, sometimes slowly.
- The frame buffer is 84 × 48 / 8 = 504 bytes — a quarter of the Uno’s RAM, but it fits. That is why the sketch can draw everything and send it with one
display()call. - Contrast differs between modules and with temperature. Open the Serial Monitor at 9600 baud and send
+or-until the text is crisp, then put that number incontrast. - Hardware SPI uses D11 and D13. The red board and the blue board print their pins in a different order and switch the backlight differently (BL to GND vs to 3.3V) — follow the labels on your board, not a photo.
Code
// Nokia 5110 LCD (PCD8544) on an Arduino Uno R3 — hardware SPI through dividers, contrast from Serial.
// CLK ← D13, DIN ← D11, CE ← D10, DC ← D8, RST ← D9 — each through a 1 kΩ / 2 kΩ divider (3.3 V chip).
// VCC → 3.3V, GND → GND, BL → 330 Ω → GND (red boards; blue boards: BL via 330 Ω to 3.3V).
// Type + or - in the Serial Monitor to find the right contrast for your module.
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
const int8_t LCD_DC = 8, LCD_CE = 10, LCD_RST = 9;
Adafruit_PCD8544 lcd(LCD_DC, LCD_CE, LCD_RST); // 3-pin constructor = hardware SPI on D11/D13
uint8_t contrast = 50;
void drawScreen() {
lcd.clearDisplay();
lcd.setTextSize(1);
lcd.setCursor(0, 0);
lcd.println(F("Uno + 5110"));
lcd.print(F("Contrast "));
lcd.println(contrast);
lcd.setTextSize(2);
lcd.setCursor(0, 22);
lcd.print(millis() / 1000);
lcd.print('s');
lcd.display(); // the whole 504-byte frame goes out in one go
}
void setup() {
Serial.begin(9600);
lcd.begin(contrast);
Serial.println(F("Nokia 5110 ready. Send + or - to change contrast."));
}
void loop() {
while (Serial.available()) {
char c = Serial.read();
if (c == '+' && contrast < 127) contrast++;
if (c == '-' && contrast > 0) contrast--;
if (c == '+' || c == '-') {
lcd.setContrast(contrast);
Serial.print(F("Contrast "));
Serial.println(contrast);
}
}
drawScreen();
delay(250);
}// Nokia 5110 LCD (PCD8544) on an Arduino Uno R3 — hardware SPI through dividers, contrast from Serial.
// CLK ← D13, DIN ← D11, CE ← D10, DC ← D8, RST ← D9 — each through a 1 kΩ / 2 kΩ divider (3.3 V chip).
// VCC → 3.3V, GND → GND, BL → 330 Ω → GND (red boards; blue boards: BL via 330 Ω to 3.3V).
// Type + or - in the Serial Monitor to find the right contrast for your module.
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
const int8_t LCD_DC = 8, LCD_CE = 10, LCD_RST = 9;
Adafruit_PCD8544 lcd(LCD_DC, LCD_CE, LCD_RST); // 3-pin constructor = hardware SPI on D11/D13
uint8_t contrast = 50;
void drawScreen() {
lcd.clearDisplay();
lcd.setTextSize(1);
lcd.setCursor(0, 0);
lcd.println(F("Uno + 5110"));
lcd.print(F("Contrast "));
lcd.println(contrast);
lcd.setTextSize(2);
lcd.setCursor(0, 22);
lcd.print(millis() / 1000);
lcd.print('s');
lcd.display(); // the whole 504-byte frame goes out in one go
}
void setup() {
Serial.begin(9600);
lcd.begin(contrast);
Serial.println(F("Nokia 5110 ready. Send + or - to change contrast."));
}
void loop() {
while (Serial.available()) {
char c = Serial.read();
if (c == '+' && contrast < 127) contrast++;
if (c == '-' && contrast > 0) contrast--;
if (c == '+' || c == '-') {
lcd.setContrast(contrast);
Serial.print(F("Contrast "));
Serial.println(contrast);
}
}
drawScreen();
delay(250);
}Library: Adafruit PCD8544 Nokia 5110 LCD library (Adafruit (also install Adafruit GFX Library)) — compiled with Adafruit PCD8544 Nokia 5110 LCD library 2.0.3.
Expected serial output
Nokia 5110 ready. Send + or - to change contrast.
Contrast 51
Contrast 52
Contrast 53Nokia 5110 ready. Send + or - to change contrast. Contrast 51 Contrast 52 Contrast 53
Common errors
Screen all black or all blank
Contrast. Send + or - in the Serial Monitor until text appears (40–65 suits most modules).
Backlight on, no text, contrast makes no difference
No data: a divider with its resistors swapped (1 kΩ belongs on the Uno side), DIN/CLK not on D11/D13, or RST floating.
Display worked on 5 V, now shows faint lines
Over-voltage damage. Move VCC to 3.3V and add the dividers; a damaged glass may not recover.