Table of Contents

Nokia 5110 displays and classic Arduinos

Summary opinions

There are a few reasons you might want to use a Nokia 5110 LCD display in an Arduino project and a couple that mean you probably shouldn't. First the good reasons:

And now the bad reasons:

The order of the pins on these will vary from supplier to supplier. One of the best sources of information on these displays is SparkFun's Graphic LCD Hookup Guide.

Libraries

These are libraries I know about that let you interface to a Nokia 5110 display. The demo code here was built around a 8MHz 3.3V Arduino Pro Mini equivalent and a display I bought off eBay from a vendor in China.

These are just tests using static text to demonstrate code setup and the most basic functionality. I've also done some dynamic updating tests.

U8g2

Oli Kraus' U8g2 is intended to be a common platform for interfacing to a whole bunch of different monochrome displays. It supports the Nokia 5110 display's PCD8544 controller chip out of the box.

My test case is below. Notes regarding resource consumption are embedded in the code as comments.

display_nokia_5110_u8g2.ino
#include <U8x8lib.h>
#include <U8g2lib.h>
 
/*
 * Basic test a Nokia 5110 display and the U8g2 library.
 *
 * Notes:
 * Program storage space and dynamic memory are the same whether you use HW or SW SPI.
 * With u8g_font_profont11, it uses 29% of program storage space and 24% of dynamic memory.
 * With u8g2_font_profont11_tr, it uses 25% of program storage space and 24% of dynamic memory.
 * With u8g2_font_fur30_tr, it uses 35% of program storage space and 24% of dynamic memory.
 */
 
/*
 * Pin assignments:
 * RST: 8
 * CE/CS/SCE: 10
 * DC/"D/C": 9
 * DIN/DN/MOSI/DATA: 11
 * CLK/SCLK/SCK: 13
 * VCC: 3.3V
 * LIGHT/LED: ground through 330 ohm resistor
 * GND: ground
 */
 
const unsigned int CLOCK_PIN = 13,
                   DATA_PIN = 11,
                   CS_PIN = 10,
                   DC_PIN = 9,
                   RESET_PIN = 8;
 
//U8G2_PCD8544_84X48_1_4W_SW_SPI u8g2 = U8G2_PCD8544_84X48_1_4W_SW_SPI(U8G2_R0, CLOCK_PIN, DATA_PIN, CS_PIN, DC_PIN, RESET_PIN);  // SW SPI
U8G2_PCD8544_84X48_1_4W_HW_SPI u8g2 = U8G2_PCD8544_84X48_1_4W_HW_SPI(U8G2_R0, CS_PIN, DC_PIN, RESET_PIN);                       // HW SPI
 
void setup() {
  u8g2.begin();
  u8g2.setContrast(135);
}
 
void loop() {
  u8g2.firstPage();
  do {
    // u8g2.setFont(u8g_font_profont11);  // set a font
    u8g2.setFont(u8g2_font_profont11_tr);
    // u8g2.setFont(u8g2_font_fur30_tr);
    u8g2.drawStr(0, 15, "Nokia 5110");  // write a string at position X, Y
    u8g2.drawStr(0, 35, "Hello World!");
  } while ( u8g2.nextPage() );
}

U8glib

Before there was U8g2, there was U8glib. While this version of the library is no longer maintained, it doesn't mean it doesn't have value. It's constructors are a little less bewildering than U8g2 and so may be better suited to beginners. It also seems to be a bit lighter in resource consumption, as you can see from the comments in my test case below.

display_nokia_5110_u8glib.ino
// Modified by Mithat Konar from
// Henry's Bench
// Arduino Nokia 5110 U8Glib Tutorial
// http://henrysbench.capnfatz.com/henrys-bench/arduino-displays/arduino-nokia-5110-with-u8glib-tutorial/
 
#include "U8glib.h"
 
/*
 * Notes:
 * With u8g_font_profont11, uses 23% of program storage space and 11% of dynamic memory.
 * With u8g_font_fur30r, uses 38% of program storage space and 11% of dynamic memory.
 */
 
/* Pin assignments:
 * RST: 8
 * CE/CS/SCE: 10
 * DC/"D/C": 9
 * DIN/DN/MOSI/DATA: 11
 * CLK/SCLK/SCK: 13
 * VCC: 3.3V
 * LIGHT/LED: ground through 330 ohm resistor
 * GND: ground
 */
 
const unsigned int CLOCK_PIN = 13,
                   DATA_PIN = 11,
                   CS_PIN = 10,
                   DC_PIN = 9,
                   RESET_PIN = 8;
 
// Declare the display and assign the pins
U8GLIB_PCD8544 u8g(CLOCK_PIN, DATA_PIN, CS_PIN, DC_PIN, RESET_PIN);  // CLK=8, DIN=4, CE=7, DC=5, RST=6
 
void draw() {
 
  u8g.setFont(u8g_font_profont11);  // select font
  // u8g.setFont(u8g_font_fur30r);
  u8g.drawStr(0, 15, "Nokia 5110");  // write a string at position X, Y
  u8g.drawStr(0, 35, "Hello world!");
}
 
void setup() {
  u8g.setContrast(138);  
}
 
void loop() { 
 u8g.firstPage(); 
  do {
    draw();
  } while( u8g.nextPage() );  
}

SparkFun

You can download code for the Nolia 5110 from the SparkFun information page that isn't actually a library but rather a comprehensive sketch that exercises a lot of the things you might want to do with the display. To get a rough idea of its resource use, I stripped out all the graphics stuff and had it only write two lines of text. Don't be misled by the simplicity of the code below. The stuff provided in the download is able to do just about everything you might want to do with the display. Once again, notes about resource use embedded as comments.

display_nokia_5110_sparkfun_minimal.ino
/* Nokia 5100 LCD Example Code
   Graphics driver and PCD8544 interface code for SparkFun's
   84x48 Graphic LCD.
   https://www.sparkfun.com/products/10168
 
  by: Jim Lindblom
    adapted from code by Nathan Seidle and mish-mashed with
    code from the ColorLCDShield.
  date: October 10, 2013
  license: Officially, the MIT License. Review the included License.md file
  Unofficially, Beerware. Feel free to use, reuse, and modify this
  code as you see fit. If you find it useful, and we meet someday,
  you can buy me a beer.
 */
 
/*
 * Further modifications by Mithat Konar: minimal test, different pins, different contrast.
 * 
 * Notes:
 * This minimal version uses 6% of program storage space and 26% of dynamic memory.
 * Different fonts can be experimented with.
 */
 
/* Mithat's pin assignments (set in LCD_Functions.h):
 * RST: 8
 * CE/CS/SCE: 10
 * DC/"D/C": 9
 * DIN/DN/MOSI/DATA: 11
 * CLK/SCLK/SCK: 13
 * VCC: 3.3V
 * LIGHT/LED: ground through 330 ohm.
 * GND: ground
 */
 
#include <SPI.h>
#include "LCD_Functions.h"
 
void setup()
{
  lcdBegin(); // This will setup our pins, and initialize the LCD
  setContrast(55); // Good values range from 40-60
 
  setStr("Nokia 5110", 0, 12, BLACK);
  setStr("Hello World!", 0, 28, BLACK);
  updateDisplay();
}
 
// Loop does nothing!
void loop()
{
}

Rinky-Dink Electronics

Rinky-Dink Electronics has a number of libraries for working with the Nokia 5110: a basic version that let you write text and render bitmaps, a version that ads graphics capabilities, and an add-on that lets you load images from an SPI flash chip.

I have not yet tested any of these, but I like the two-tiered and modular approach to functionality.

Adafruit

Adafruit has a dedicated library. Untested.

nitins11

Nitin Sharma has a dedicated library. Untested.

baghayi

Hossein Baghayi has a dedicated library. Untested.