nokia 5110

Bonjour,

I have an issue with my setup : nokia 5510 + arduino uno r3.

Here below the wiring :

nokia->arduino
led->3.3v
vcc->5v
gnd->gnd
sce->d7
rst->d6
dc->d5
mosi->d4
sclk->d3

My issue : only the bottom part of the screen seems to work (line 3,4,5).

Here attached a pic illustrating the issue.

Any help welcome :slight_smile:

Thanks,
Erwan

It's probably all to do with the code and nothing to do with the connections. In the meantime you show us all the connections and none of the code.

Show the code.
Also crop the picture.

The picture also suggests you have a contrast problem. This is also fixable in the code.

Useful link:

http://code.google.com/p/pcd8544/

Image cropped.

The 5510.

Here is the arduino sketch :

/* Definition des broches du lcd */
#define PIN_SCE   7
#define PIN_RESET 6 
#define PIN_DC    5
#define PIN_SDIN  4
#define PIN_SCLK  3

// Définir ici la hauteur / largeur de l'écran en pixel
#define LCD_X 84
#define LCD_Y 48

// La broche DC permet de dire à l'écran si on envoi une commande ou une donnée
#define LCD_COMMAND LOW
#define LCD_DATA HIGH

#define LCD_C 0

PROGMEM prog_uchar asciiTable[] = {
   0x00, 0x00, 0x00, 0x00, 0x00 // 20  
  ,0x00, 0x00, 0x5f, 0x00, 0x00 // 21 !
  ,0x00, 0x07, 0x00, 0x07, 0x00 // 22 "
  ,0x14, 0x7f, 0x14, 0x7f, 0x14 // 23 #
  ,0x24, 0x2a, 0x7f, 0x2a, 0x12 // 24 $
  ,0x23, 0x13, 0x08, 0x64, 0x62 // 25 %
  ,0x36, 0x49, 0x55, 0x22, 0x50 // 26 &
  ,0x00, 0x05, 0x03, 0x00, 0x00 // 27 '
  ,0x00, 0x1c, 0x22, 0x41, 0x00 // 28 (
  ,0x00, 0x41, 0x22, 0x1c, 0x00 // 29 )
  ,0x14, 0x08, 0x3e, 0x08, 0x14 // 2a *
  ,0x08, 0x08, 0x3e, 0x08, 0x08 // 2b +
  ,0x00, 0x50, 0x30, 0x00, 0x00 // 2c ,
  ,0x08, 0x08, 0x08, 0x08, 0x08 // 2d -
  ,0x00, 0x60, 0x60, 0x00, 0x00 // 2e .
  ,0x20, 0x10, 0x08, 0x04, 0x02 // 2f /
  ,0x3e, 0x51, 0x49, 0x45, 0x3e // 30 0
  ,0x00, 0x42, 0x7f, 0x40, 0x00 // 31 1
  ,0x42, 0x61, 0x51, 0x49, 0x46 // 32 2
  ,0x21, 0x41, 0x45, 0x4b, 0x31 // 33 3
  ,0x18, 0x14, 0x12, 0x7f, 0x10 // 34 4
  ,0x27, 0x45, 0x45, 0x45, 0x39 // 35 5
  ,0x3c, 0x4a, 0x49, 0x49, 0x30 // 36 6
  ,0x01, 0x71, 0x09, 0x05, 0x03 // 37 7
  ,0x36, 0x49, 0x49, 0x49, 0x36 // 38 8
  ,0x06, 0x49, 0x49, 0x29, 0x1e // 39 9
  ,0x00, 0x36, 0x36, 0x00, 0x00 // 3a :
  ,0x00, 0x56, 0x36, 0x00, 0x00 // 3b ;
  ,0x08, 0x14, 0x22, 0x41, 0x00 // 3c <
  ,0x14, 0x14, 0x14, 0x14, 0x14 // 3d =
  ,0x00, 0x41, 0x22, 0x14, 0x08 // 3e >
  ,0x02, 0x01, 0x51, 0x09, 0x06 // 3f ?
  ,0x32, 0x49, 0x79, 0x41, 0x3e // 40 @
  ,0x7e, 0x11, 0x11, 0x11, 0x7e // 41 A
  ,0x7f, 0x49, 0x49, 0x49, 0x36 // 42 B
  ,0x3e, 0x41, 0x41, 0x41, 0x22 // 43 C
  ,0x7f, 0x41, 0x41, 0x22, 0x1c // 44 D
  ,0x7f, 0x49, 0x49, 0x49, 0x41 // 45 E
  ,0x7f, 0x09, 0x09, 0x09, 0x01 // 46 F
  ,0x3e, 0x41, 0x49, 0x49, 0x7a // 47 G
  ,0x7f, 0x08, 0x08, 0x08, 0x7f // 48 H
  ,0x00, 0x41, 0x7f, 0x41, 0x00 // 49 I
  ,0x20, 0x40, 0x41, 0x3f, 0x01 // 4a J
  ,0x7f, 0x08, 0x14, 0x22, 0x41 // 4b K
  ,0x7f, 0x40, 0x40, 0x40, 0x40 // 4c L
  ,0x7f, 0x02, 0x0c, 0x02, 0x7f // 4d M
  ,0x7f, 0x04, 0x08, 0x10, 0x7f // 4e N
  ,0x3e, 0x41, 0x41, 0x41, 0x3e // 4f O
  ,0x7f, 0x09, 0x09, 0x09, 0x06 // 50 P
  ,0x3e, 0x41, 0x51, 0x21, 0x5e // 51 Q
  ,0x7f, 0x09, 0x19, 0x29, 0x46 // 52 R
  ,0x46, 0x49, 0x49, 0x49, 0x31 // 53 S
  ,0x01, 0x01, 0x7f, 0x01, 0x01 // 54 T
  ,0x3f, 0x40, 0x40, 0x40, 0x3f // 55 U
  ,0x1f, 0x20, 0x40, 0x20, 0x1f // 56 V
  ,0x3f, 0x40, 0x38, 0x40, 0x3f // 57 W
  ,0x63, 0x14, 0x08, 0x14, 0x63 // 58 X
  ,0x07, 0x08, 0x70, 0x08, 0x07 // 59 Y
  ,0x61, 0x51, 0x49, 0x45, 0x43 // 5a Z
  ,0x00, 0x7f, 0x41, 0x41, 0x00 // 5b [
  ,0x02, 0x04, 0x08, 0x10, 0x20 // 5c backslash
  ,0x00, 0x41, 0x41, 0x7f, 0x00 // 5d ]
  ,0x04, 0x02, 0x01, 0x02, 0x04 // 5e ^
  ,0x40, 0x40, 0x40, 0x40, 0x40 // 5f _
  ,0x00, 0x01, 0x02, 0x04, 0x00 // 60 `
  ,0x20, 0x54, 0x54, 0x54, 0x78 // 61 a
  ,0x7f, 0x48, 0x44, 0x44, 0x38 // 62 b
  ,0x38, 0x44, 0x44, 0x44, 0x20 // 63 c
  ,0x38, 0x44, 0x44, 0x48, 0x7f // 64 d
  ,0x38, 0x54, 0x54, 0x54, 0x18 // 65 e
  ,0x08, 0x7e, 0x09, 0x01, 0x02 // 66 f
  ,0x0c, 0x52, 0x52, 0x52, 0x3e // 67 g
  ,0x7f, 0x08, 0x04, 0x04, 0x78 // 68 h
  ,0x00, 0x44, 0x7d, 0x40, 0x00 // 69 i
  ,0x20, 0x40, 0x44, 0x3d, 0x00 // 6a j 
  ,0x7f, 0x10, 0x28, 0x44, 0x00 // 6b k
  ,0x00, 0x41, 0x7f, 0x40, 0x00 // 6c l
  ,0x7c, 0x04, 0x18, 0x04, 0x78 // 6d m
  ,0x7c, 0x08, 0x04, 0x04, 0x78 // 6e n
  ,0x38, 0x44, 0x44, 0x44, 0x38 // 6f o
  ,0x7c, 0x14, 0x14, 0x14, 0x08 // 70 p
  ,0x08, 0x14, 0x14, 0x18, 0x7c // 71 q
  ,0x7c, 0x08, 0x04, 0x04, 0x08 // 72 r
  ,0x48, 0x54, 0x54, 0x54, 0x20 // 73 s
  ,0x04, 0x3f, 0x44, 0x40, 0x20 // 74 t
  ,0x3c, 0x40, 0x40, 0x20, 0x7c // 75 u
  ,0x1c, 0x20, 0x40, 0x20, 0x1c // 76 v
  ,0x3c, 0x40, 0x30, 0x40, 0x3c // 77 w
  ,0x44, 0x28, 0x10, 0x28, 0x44 // 78 x
  ,0x0c, 0x50, 0x50, 0x50, 0x3c // 79 y
  ,0x44, 0x64, 0x54, 0x4c, 0x44 // 7a z
  ,0x00, 0x08, 0x36, 0x41, 0x00 // 7b {
  ,0x00, 0x00, 0x7f, 0x00, 0x00 // 7c |
  ,0x00, 0x41, 0x36, 0x08, 0x00 // 7d }
  ,0x10, 0x08, 0x08, 0x10, 0x08 // 7e ~
  ,0x78, 0x46, 0x41, 0x46, 0x78 // 7f DEL
};

/* Envoi une commande ou un octet de donnée à l'écran */
void lcd_write(byte mode, byte data) {
  digitalWrite(PIN_DC, mode); // Place DC suivant le mode voulu (COMMAND ou DATA)
  digitalWrite(PIN_SCE, LOW);
  shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data); // Envoi la commande / donnée
  digitalWrite(PIN_SCE, HIGH);
}

/* Initialise l'écran en envoyant la séquence "magique" d'initialisation au PCD8544 */
void lcd_init(void) {
  // Place les broches de contrôle en sorties
  pinMode(PIN_SCE, OUTPUT);
  pinMode(PIN_RESET, OUTPUT);
  pinMode(PIN_DC, OUTPUT);
  pinMode(PIN_SDIN, OUTPUT);
  pinMode(PIN_SCLK, OUTPUT);
 
  // Reset l'écran pour être sur de son état intial
  digitalWrite(PIN_RESET, LOW);
  digitalWrite(PIN_RESET, HIGH);
 
  // Séquence magique
  lcd_write(LCD_COMMAND, 0x21); // Extended Commands
  lcd_write(LCD_COMMAND, 0xBf); // LCD VOP (contrast) - 0xB1 @ 3v3 ou 0xBF @ 5v
  lcd_write(LCD_COMMAND, 0x04); // Temp coefficent
  lcd_write(LCD_COMMAND, 0x14); // LCD bias mode = 1:48
  lcd_write(LCD_COMMAND, 0x0c); // Display control = normal mode (0x0D pour mode "négatif")
  lcd_write(LCD_C, 0x20); 
  lcd_write(LCD_C, 0x0c); 
}

/* Affiche sur l'écran un caractére passé en argument, avec un colonne vide de "pagination" pour plus de lisibilité */
void lcd_putChar(char chr) {
  lcd_write(LCD_DATA, 0x00); // Colonne vide de pagination
  unsigned int val = (chr - 0x20) * 5; // 0x20 -> 1er caractéres de notre table ascii
  lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val)); 
  lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val + 1));
  lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val + 2));
  lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val + 3));
  lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val + 4));
  lcd_write(LCD_DATA, 0x00); // Colonne vide de pagination
}

/* Affiche sur l'écran une chaine de caratéres stocké en RAM */
void lcd_string_ram(char *str) {
  while(*str)
    lcd_putChar(*str++);
}

/* Affiche sur l'écran une chaine de caratéres stocké en PROGMEM */
void lcd_string_flash(prog_char *str) {
  char c = pgm_read_byte_near(str);
  while(c) {
    lcd_putChar(c);
    c = pgm_read_byte_near(++str);
  }
}

/* Déplace le curseur aux coordonnées xy donnée en arguments */
void lcd_goto(byte x, byte y) {
  lcd_write(LCD_COMMAND, 0x80 | x);  // Colonne
  lcd_write(LCD_COMMAND, 0x40 | y);  // Ligne
}

/* Efface l'écran */
void lcd_clear() {
  for (int i = 0 ; i < (LCD_X * LCD_Y / 8) ; i++)
    lcd_write(LCD_DATA, 0x00);
  lcd_goto(0, 0); // Place le curseur à (0, 0)
}


void setup () {
  lcd_init(); // Initialisation de l'écran

lcd_clear(); // Efface l'écran
lcd_goto(0,3);
lcd_string_ram("Hello World!"); 
 
  //lcd_string_flash(PSTR("Hello World!")); 
  
 
}

void loop () {
  
}

OK, I guess I should have said try using a library and then post the code.
I suggest you get the library from the link I posted. You can then use the 5110 rather like any other LCD, a lot easier than this mess.

The contrast control is here

  // Séquence magique
  lcd_write(LCD_COMMAND, 0x21); // Extended Commands
  lcd_write(LCD_COMMAND, 0xBf); // LCD VOP (contrast) - 0xB1 @ 3v3 ou 0xBF @ 5v

You might need to fiddle with that. Note that this command is included in the library and may need to be edited there.

This is what a hello world looks like when you do it properly with a library, I bet you can't wait to use that....

#include <PCD8544.h>
static PCD8544 lcd;

void setup() {
  // PCD8544-compatible displays may have a different resolution...
  lcd.begin(84, 48);
}

void loop() {
  // Just to show the program is alive...
  static int counter = 0;

  // Write a piece of text on the first line...
  lcd.setCursor(0, 0);
  lcd.print("Hello, World!");

  // Write the counter on the second line...
  lcd.setCursor(0, 1);
  lcd.print(counter, DEC);

  delay(500);  
  counter++;
}

Code is indeed much simpler.
Thanks for the tip.
Worked right away without any modification.

But still the same issue :frowning:

lcd.setCursor(0, 0); -> I see only the first line of pixels but miss the whole row.

lcd.setCursor(0, 3); -> works fine but starts at row 3.

OK, I'm afraid it might be time to admit the LCD is faulty.

You clearly understand and send the right commands and row 3 is in the right position. I also now believe that your picture demonstrates a fault. The contrast problem shows the top half of the pixels different to the bottom half. I am certain there is no adjustment that can do that. One setting does them all and the reason why there is no contrast problem in the top half is because the pixels are dead.

This is unfortunate. I have four of them, they work fine and are my favourite display. I understand these things are surplus from Nokia, so I guess the odd bad one has to turn up.

Note two things about them.

  1. The ones with the blue background lights are useless. They are easier to read with the light off.

  2. I don't think they are very good at graphics, it's just too hard to get the contrast right, and it is better to stick with text.

FWIW the pic below shows what the text should look like with better contrast adjustment

I bought one of these several months ago and played with it on a 8051 system. The complexity imposed by it dire warnings about the reset signal and needing 3.3V signals made it a real pain. None of you seem worried about those problems should I just hook it up and hope like you do?

about wiring it was pretty straigh forward for me on arduino :

I believe you can actually use the 5v pin for the 5110: i read that it has an internal resistor that will take care of it.
The led should be wired indeed on the 3.3v arduino pin (although it will work fine on 5v but will probably get worn out faster).

For the rest, simple SPI 4 wires.

Regards,
Erwan

sickparrot:
. The complexity imposed by it dire warnings about the reset signal and needing 3.3V signals made it a real pain.

I don't know what an 8051 is, but there is no problem wiring them to the 3.3v pin on an Arduino. I'm sure every Arduino has one, and you just plug it in. I'm not aware of anything dire about the reset. The complexity is mainly down to the plethora of pins hence the need to avoid clashing with other stuff, and I use 5,6,7 for DC,RST,CE, they being commonly used for LCDs. The matter is not helped by 5110s from different sources having different wiring. All mine have LED to ground, hence no question on the LED supply voltage.

They fit nicely on the Freetronics small proto shield.

5110.jpg

From the Philips PDC8544 datasheet:

8.1 Initialization
Immediately following power-on, the contents of all internal
registers and of the RAM are undefined. A RES pulse
must be applied. Attention should be paid to the
possibility that the device may be damaged if not properly
reset.

In my earlier playing with a 8051 (originally the Intel MCS-51, the microcontroller with a heritage which began in the 1970s, is a very common core (widest variety of derivatives including Atmel) still used in designs today in many products) I couldn't ensure the correct power-on conditions without external hardware but maybe this doesn't apply to AVR.

Also from 'Limiting Conditions': all input voltages Max: VDD + 0.5

ie an upper limit of 3.3+0.5V which concerned me.

[Edited: I just looked at the datasheet again and realised my mistake: the VDD supply voltage is ok up to 7V, so no problem.]

When using the 8051 I was working alone and it took a good few hours of writing the code and cobbling a level-shifting and reset arrangement from bits I had available and getting connections right before trying it so as not to damage it. I also didn't have 3.3V handy so needed an external supply.

With an Arduino life is so much easier - I can read other people's experiences and probably wire it up, load someone's sketch and have it going in a few minutes. Thanks!

Hi..

I HAVE one of these displays and I am experiencing an issue that I don't know if it's correct or some problem...

The power consumption is about 40~50mA. Is it right?

MY project will run at small batteries and 50mA plus atmega238 will drain my battery so quickly.

Could anyone who knows how much is the normal average consumption of Nokia 5110?

Is that 40-50mA including the LED backlight? If so, try disconnecting the LED pin and measure the current again. You might want to only have the backlight on when necessary.

I've tried to get the code Nick_Pyner showed working with that library but can't get it to compile so far.
So much for my hope that it could work within minutes!

sickparrot:
Is that 40-50mA including the LED backlight? If so, try disconnecting the LED pin and measure the current again. You might want to only have the backlight on when necessary.

I've tried to get the code Nick_Pyner showed working with that library but can't get it to compile so far.
So much for my hope that it could work within minutes!

Hi... No.. With the led turned off.. Here is about 500mA :frowning:

did you try and check how was the consumption?

sickparrot:
I've tried to get the code Nick_Pyner showed working with that library but can't get it to compile so far.
So much for my hope that it could work within minutes!

There can be only three reason why erwanl and I have it compile and you don't

  1. You haven't got the library
  2. You have but it's in the wrong place.
  3. You have been slack-arsed with the copy/paste

Note that you must ensure the the pin call in the library is kosher, but that has nothing to do with compiling propaerly. Erwanl may have been rather lucky.

Nick_Pyner:

sickparrot:
I've tried to get the code Nick_Pyner showed working with that library but can't get it to compile so far.
So much for my hope that it could work within minutes!

There can be only three reason why erwanl and I have it compile and you don't

  1. You haven't got the library
  2. You have but it's in the wrong place.
  3. You have been slack-arsed with the copy/paste

Note that you must ensure the the pin call in the library is kosher, but that has nothing to do with compiling propaerly. Erwanl may have been rather lucky.

Ooh, good thoughts.

  1. I got it, I'm sure
  2. most likely
  3. Don't think so
    ....
    Thanks Nick that was helpful. I'm still new to this Arduino stuff and put the library in the wrong place.
    It compiles now, so I need to connect and try it but it's late here (UK).

It does work now. Honestly.

Grisly details:
Last night I thought I'd compiled it when I posted, then connected it but found it wouldn't work, gave up and went to bed.
Today I found it had only compiled because I'd commented out lots of stuff to isolate the problem but forgotten. So I put back all the code and it failed again. I'd also changed the header ref from <> to "" and the name from PCD8544.h to pcd8544.h to match the header I had and I'd tried to work with a different library for this before which of course had a very similar name and got muddled. So even with the library Nick linked to in the right pace under Sketchbook/libraries due to my changed header reference, it was still wrong.

We all know everything has to be right and in the right place but it's so easy to introduce one or more errors while trying to work out what's wrong, and to make wrong assumptions and make things worse as I did. And I'm not a novice to programming!

Thanks all, esp Nick.

I'm concerned again.

From Nick's link Google Code Archive - Long-term storage for Google Code Project Hosting.

Since these LCDs are 3.3V devices, you have to add extra components to connect it to the digital pins of the Arduino (not necessary if you are using a 3.3V variant of the Arduino, such as the Arduino Pro).

There a few variants of this display and the connections marked on mine don't match those shown on that link or pcd8544 based displays (serdisplib).
Maybe the warnings are cautious and for 'best practice' but 5V power and signals usually cause no harm.

Still, mine is working and it's cheap and easy to replace.

sickparrot:
Maybe the warnings are cautious and for

I think that's true and there are plenty of conflicting stories around. I run them off Arduino's 3.3v and ground the LED through 330 ohms - it being the bleeding obvious. All the other connections are direct, no level shifting resistors. I have grounded the LEDs directly. Probably not a good idea but no damage done.