Ethernet & LCD problem

Hi, I have Arduino Mega 2560 with connected Nokia 5110 display and Ethernet R3 Shield. Everythings works fine, but not together. If I run Ethernet->begin(); or Ethernet->available(); display is going to blank immediately (using PINS 45, 47, 49, 51, 53).

It’s job project and I received everything hard-soldered so I didn’t try to change a pinout. But i Have Nokia 5110 display and I’m using for display this code:

Spark Fun Electronics 2011
Nathan Seidle

This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license).

This code writes a series of images and text to the Nokia 5110 84x48 graphic LCD:

Do not drive the backlight with 5V. It will smoke. However, the backlight on the LCD seems to be 
happy with direct drive from the 3.3V regulator.

Although the PCD8544 controller datasheet recommends 3.3V, the graphic Nokia 5110 LCD can run at 3.3V or 5V. 
No resistors needed on the signal lines.

You will need 5 signal lines to connect to the LCD, 3.3 or 5V for power, 3.3V for LED backlight, and 1 for ground.

#define PIN_SCE   45 //Pin 7 on LCD
#define PIN_RESET 47 //Pin 6 on LCD
#define PIN_DC    49 //Pin 5 on LCD
#define PIN_SDIN  51 //Pin 4 on LCD
#define PIN_SCLK  53 //Pin 3 on LCD

//The DC pin tells the LCD if we are sending a command or data
#define LCD_COMMAND 0 
#define LCD_DATA  1

//You may find a different size screen, but this one is 84 by 48 pixels
#define LCD_X     84
#define LCD_Y     48

//This table contains the hex values that represent pixels
//for a font that is 5 pixels wide and 8 pixels high
static const byte ASCII[][5] = {
 {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 backslach
 ,{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

//forum would not let me add the char SFEFlame[] = { area and //Another SparkFun logo because to much text or

void setup(void) {
 LCDInit(); //Init the LCD

void loop(void) {

 LCDString("Hello World!");

void gotoXY(int x, int y) {
 LCDWrite(0, 0x80 | x);  // Column.
 LCDWrite(0, 0x40 | y);  // Row.  ?

//This takes a large array of bits and sends them to the LCD
void LCDBitmap(char my_array[]){
 for (int index = 0 ; index < (LCD_X * LCD_Y / 8) ; index++)
   LCDWrite(LCD_DATA, my_array[index]);

//This function takes in a character, looks it up in the font table/array
//And writes it to the screen
//Each character is 8 bits tall and 5 bits wide. We pad one blank column of
//pixels on each side of the character for readability.
void LCDCharacter(char character) {
 LCDWrite(LCD_DATA, 0x00); //Blank vertical line padding

 for (int index = 0 ; index < 5 ; index++)
   LCDWrite(LCD_DATA, ASCII[character - 0x20][index]);
   //0x20 is the ASCII character for Space (' '). The font table starts with this character

 LCDWrite(LCD_DATA, 0x00); //Blank vertical line padding

//Given a string of characters, one by one is passed to the LCD
void LCDString(char *characters) {
 while (*characters)

//Clears the LCD by writing zeros to the entire screen
void LCDClear(void) {
 for (int index = 0 ; index < (LCD_X * LCD_Y / 8) ; index++)
   LCDWrite(LCD_DATA, 0x00);
 gotoXY(0, 0); //After we clear the display, return to the home position

//This sends the magical commands to the PCD8544
void LCDInit(void) {

 //Configure control pins
 pinMode(PIN_SCE, OUTPUT);
 pinMode(PIN_DC, OUTPUT);

 //Reset the LCD to a known state
 digitalWrite(PIN_RESET, LOW);
 digitalWrite(PIN_RESET, HIGH);

 LCDWrite(LCD_COMMAND, 0x21); //Tell LCD that extended commands follow
 LCDWrite(LCD_COMMAND, 0xB0); //Set LCD Vop (Contrast): Try 0xB1(good @ 3.3V) or 0xBF if your display is too dark
 LCDWrite(LCD_COMMAND, 0x04); //Set Temp coefficent
 LCDWrite(LCD_COMMAND, 0x14); //LCD bias mode 1:48: Try 0x13 or 0x14

 LCDWrite(LCD_COMMAND, 0x20); //We must send 0x20 before modifying the display control mode
 LCDWrite(LCD_COMMAND, 0x0C); //Set display control, normal mode. 0x0D for inverse

//There are two memory banks in the LCD, data/RAM and commands. This 
//function sets the DC pin high or low depending, and then sends
//the data byte
void LCDWrite(byte data_or_command, byte data) {
 digitalWrite(PIN_DC, data_or_command); //Tell the LCD that we are writing either to data or a command

 //Send the data
 digitalWrite(PIN_SCE, LOW);
 shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
 digitalWrite(PIN_SCE, HIGH);

and everything works perfectly until I setup Ethernet, than display breaks and it’s showing only black. But i don’t get it, because It’s using different pins then Ethernet shield, so it couldn’t be a problem. Bu
I was thinking that problem should be this part:
#define LCD_COMMAND 0
#define LCD_DATA 1
It’s possible?

Sorry for my English and thanks for replies.

This is the page for the Arduino Mega 2560 : If you scroll down on that page, you read : SPI: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS). These pins support SPI communication using the SPI library. The SPI pins are also broken out on the ICSP header, which is physically compatible with the Arduino /Genuino Uno and the old Duemilanove and Diecimila Arduino boards.

That means that your display uses pins that are used for the SPI bus, and the Ethernet shield uses the SPI bus. Your display may not use pins 51 and 53, you must use other pins.

You might find living a bit easier if you use a library for the 5110, Like PCD8544.

You can run the 5110 on SPI but there is no obligation to do so - and clearly no need to on a Mega.. You can run it on any pins you like, so long as the declaration properly reflects that, and in the proper order. Just use pins that your ethernet doesn't