[Solved]expected identifier before numeric constant when instantiating object...

Hello everyone,

I am attempting to drive to Nokia 5110 LCD displays using my Arduino Mega. I can get them working one at a time using Jim Park's example code. I am trying to convert this to a library so I can create two display objects and reference the displays that way. I'm running into an issue when instantiating a display object. Here is the sketch:

/*
This Code has extra features 
including a XY positioning function on Display
and a Line Draw function on Nokia 3310 LCD 
It is modded from the original 
http://www.arduino.cc/playground/Code/PCD8544
*/
// Mods by Jim Park 
// jim(^dOt^)buzz(^aT^)gmail(^dOt^)com
// hope it works for you
#include <nokia5110.h>

#define PIN_SCE   7  // LCD CS  .... Pin 3
#define PIN_RESET 6  // LCD RST .... Pin 1
#define PIN_DC    5  // LCD Dat/Com. Pin 5
#define PIN_SDIN  4  // LCD SPIDat . Pin 6
#define PIN_SCLK  3  // LCD SPIClk . Pin 4
                     // LCD Gnd .... Pin 2
                     // LCD Vcc .... Pin 8
                     // LCD Vlcd ... Pin 7
NokiaLCD LeftDisplay(PIN_SCE, PIN_RESET, PIN_DC, PIN_SDIN, PIN_SCLK);

void setup(void)
{

}

void loop(void)
{
  // Display some simple character animation
  //
  int a,b;
  char Str[15];
  // Draw a Box
  for(b=1000; b>0; b--){
  LeftDisplay.drawBorderBox();
  for(a=0; a<=5 ; a++){
  LeftDisplay.gotoXY(2,1);
  // Put text in Box
  LeftDisplay.LcdString ("Left Front");
  LeftDisplay.gotoXY(24,3);
  LeftDisplay.LcdCharacter('H');
  LeftDisplay.LcdCharacter('E');
  LeftDisplay.LcdCharacter('L');
  LeftDisplay.LcdCharacter('L');
  LeftDisplay.LcdCharacter('O');
  LeftDisplay.LcdCharacter(' ');
  LeftDisplay.LcdCharacter('=');
  // Draw + at this position
  LeftDisplay.gotoXY(10,3);
  LeftDisplay.LcdCharacter('=');
  delay(250);
  LeftDisplay.gotoXY(24,3);
  LeftDisplay.LcdCharacter('h');
  LeftDisplay.LcdCharacter('e');
  LeftDisplay.LcdCharacter('l');
  LeftDisplay.LcdCharacter('l');
  LeftDisplay.LcdCharacter('o');
  LeftDisplay.LcdCharacter(' ');
  LeftDisplay.LcdCharacter('-');
  // Draw - at this position
  LeftDisplay.gotoXY(10,3);
  LeftDisplay.LcdCharacter('-');
  delay(250);
  }
  }
}

Here's the Library files:
nokia5110.cpp:

/*
nokia5110.pp
This file contains the functions and data required
to drive several Nokia 5110 LCD displays.
*/

#include "nokia5110.h"
#include "Arduino.h"

NokiaLCD::NokiaLCD(int SCE, int RESET, int DC, int SDIN, int SCLK)
{
  //Set up the pins
  pinMode(SCE,   OUTPUT);
  pinMode(RESET, OUTPUT);
  pinMode(DC,    OUTPUT);
  pinMode(SDIN,  OUTPUT);
  pinMode(SCLK,  OUTPUT);

  //Reset the display
  digitalWrite(RESET, LOW);
  digitalWrite(RESET, HIGH);
  LcdWrite(0, 0x21);  // LCD Extended Commands.
  LcdWrite(0, 0xBf);  // Set LCD Vop (Contrast). //B1
  LcdWrite(0, 0x04);  // Set Temp coefficent. //0x04
  LcdWrite(0, 0x14);  // LCD bias mode 1:48. //0x13
  LcdWrite(0, 0x0C);  // LCD in normal mode. 0x0d for inverse
  LcdWrite(LOW, 0x20);
  LcdWrite(LOW, 0x0C);

  //Set the global variables
  _SCE = SCE;
  _RESET = RESET;
  _DC = DC;
  _SDIN = SDIN;
  _SCLK = SCLK;


  //Set up the ASCII tables
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 ¥
 ,{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 ?
 ,{0x00, 0x06, 0x09, 0x09, 0x06} // 7f ?
 };

}

void NokiaLCD::LcdCharacter(char character) //Prints a charachter to the LCD
{
  LcdWrite(HIGH, 0x00);
  for (int index = 0; index < 5; index++)
  {
    LcdWrite(HIGH, ASCII[character - 0x20][index]);
  }
  LcdWrite(HIGH, 0x00);
}

void NokiaLCD::LcdClear() //Blanks out the LCD
{
  for (int index = 0; index < 84 * 48
 / 8; index++)
  {
    LcdWrite(HIGH, 0x00);
  }
}

void NokiaLCD::LcdString(char *characters) // Print a string to the LCD
{
  while (*characters)
  {
    LcdCharacter(*characters++);
  }
}

void NokiaLCD::LcdWrite(byte dc, byte data) // Send data to the LCD
{
  digitalWrite(_DC, dc);
  digitalWrite(_SCE, LOW);
  shiftOut(_SDIN, _SCLK, MSBFIRST, data);
  digitalWrite(_SCE, HIGH);
}

// gotoXY routine to position cursor 
// x - range: 0 to 84
// y - range: 0 to 5

void NokiaLCD::gotoXY(int x, int y)
{
  LcdWrite(0, 0x80 | x);  // Column.
  LcdWrite(0, 0x40 | y);  // Row.  

}



void NokiaLDC::drawBorderBox() // Print a line on the LCD
{
  unsigned char  j;  
   for(j=0; j<84; j++) // top
	{
    gotoXY (j,0);
	LcdWrite (1, 0x01);
  	} 	
  for(j=0; j<84; j++) //Bottom
	{
    gotoXY (j,5);
	LcdWrite (1, 0x80);
	} 	

  for(j=0; j<6; j++) // Right
	{
    gotoXY (83,j);
	LcdWrite (1, 0xff);
  	} 	
	for(j=0; j<6; j++) // Left
	{
    gotoXY (0,j);
	LcdWrite (1, 0xff);
  	}

}

nokia5110.h:

/*
nokia5110.h
This file contains the functions and data required
to drive several Nokia 5110 LCD displays.
*/


#ifndef NokiaLCD_h
#define NokiaLCD_h

#include "Arduino.h"

class NokiaLCD
{
  public:
    NokiaLCD(int SCE, int RESET, int DC, int SDIN, int SCLK);
    void drawBorderBox();
    void gotoXY(int x, int y);
    void LcdWrite(byte dc, byte data);
    void LcdClear();
    void LcdString(char *charachters);
    void LcdCharacter(char charachter);

  private:
    int _SCE;
    int _RESET;
    int _DC;
    int _SDIN;
    int _SCLK;
    const byte ASCII[][5];
  
#endif

And here's the fit the compiler is giving me:

sketch_sep09a:20: error: expected identifier before numeric constant
sketch_sep09a:20: error: expected ‘,’ or ‘...’ before numeric constant
sketch_sep09a:22: error: ‘void NokiaLCD::setup()’ cannot be overloaded
sketch_sep09a:18: error: with ‘void NokiaLCD::setup()’
sketch_sep09a:27: error: ‘void NokiaLCD::loop()’ cannot be overloaded
sketch_sep09a:19: error: with ‘void NokiaLCD::loop()’
sketch_sep09a:66: error: expected `}' at end of input
sketch_sep09a.cpp: In member function ‘void NokiaLCD::loop()’:
sketch_sep09a:35: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:37: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:39: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:40: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:41: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:42: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:43: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:44: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:45: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:46: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:47: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:49: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:50: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:52: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:53: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:54: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:55: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:56: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:57: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:58: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:59: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:61: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a:62: error: ‘((NokiaLCD*)this)->NokiaLCD::LeftDisplay’ does not have class type
sketch_sep09a.cpp: At global scope:
sketch_sep09a:66: error: expected unqualified-id at end of input

Any input is appreciated. Thanks.

Oh yeah, sorry about the multiple posts but I was running in to the forum's character limit.

can't see a 'loop' function in the class like the error:

In member function ‘void NokiaLCD::loop()’:

your class needs a } and ; at the end

It is also good practice to name the .h and .cpp files to match the class that they define and implement.

NokiaLCD != nokia5110

StayFrosty:
Any input is appreciated. Thanks.

To solve your immediate problem doesn't strictly require you to use a library - it requires you to use classes. The problem you're having seems to be caused by using a library - probably because the .h file is not named correctly or is not in the correct library directory. While there's no reason you shouldn't be able to put your class in a library - and it would certainly improve reuse of your code in other sketches - you could tackle that task in two stages by putting the declarations and definitions in your main sketch file for initial compilation and testing, and extract the class into a library later once you have got it working.

Thanks, I figured it was something simple... I can't believe i missed that.

I also appreciate the style pointers. I'm learning as I go and I don't know this stuff unless someone tells me.

So now I'm running in to a problem with my byte array. Here's the code as it sits now:

MultiScreen.cpp

/*
This Code has extra features 
including a XY positioning function on Display
and a Line Draw function on Nokia 3310 LCD 
It is modded from the original 
http://www.arduino.cc/playground/Code/PCD8544
*/
// Mods by Jim Park 
// jim(^dOt^)buzz(^aT^)gmail(^dOt^)com
// hope it works for you
#include <nokia5110.h>

#define PIN_SCE   7  // LCD CS  .... Pin 3
#define PIN_RESET 6  // LCD RST .... Pin 1
#define PIN_DC    5  // LCD Dat/Com. Pin 5
#define PIN_SDIN  4  // LCD SPIDat . Pin 6
#define PIN_SCLK  3  // LCD SPIClk . Pin 4
                     // LCD Gnd .... Pin 2
                     // LCD Vcc .... Pin 8
                     // LCD Vlcd ... Pin 7

nokia5110 LeftDisplay(PIN_SCE, PIN_RESET, PIN_DC, PIN_SDIN, PIN_SCLK);

void setup(void)
{

}

void loop(void)
{
  // Display some simple character animation
  //
  int a,b;
  char Str[15];
  // Draw a Box
  for(b=1000; b>0; b--){
  LeftDisplay.drawBorderBox();
  for(a=0; a<=5 ; a++){
  LeftDisplay.gotoXY(2,1);
  // Put text in Box
  LeftDisplay.LcdString ("Left Front");
  LeftDisplay.gotoXY(24,3);
  LeftDisplay.LcdCharacter('H');
  LeftDisplay.LcdCharacter('E');
  LeftDisplay.LcdCharacter('L');
  LeftDisplay.LcdCharacter('L');
  LeftDisplay.LcdCharacter('O');
  LeftDisplay.LcdCharacter(' ');
  LeftDisplay.LcdCharacter('=');
  // Draw + at this position
  LeftDisplay.gotoXY(10,3);
  LeftDisplay.LcdCharacter('=');
  delay(250);
  LeftDisplay.gotoXY(24,3);
  LeftDisplay.LcdCharacter('h');
  LeftDisplay.LcdCharacter('e');
  LeftDisplay.LcdCharacter('l');
  LeftDisplay.LcdCharacter('l');
  LeftDisplay.LcdCharacter('o');
  LeftDisplay.LcdCharacter(' ');
  LeftDisplay.LcdCharacter('-');
  // Draw - at this position
  LeftDisplay.gotoXY(10,3);
  LeftDisplay.LcdCharacter('-');
  delay(250);
  }
  }
}

Here's the header:

/*
nokia5110.h
This file contains the functions and data required
to drive several Nokia 5110 LCD displays.
*/


#ifndef nokia5110_h
#define nokia5110_h

#include "Arduino.h"

class nokia5110
{
  public:
    nokia5110(int SCE, int RESET, int DC, int SDIN, int SCLK);
    void drawBorderBox();
    void gotoXY(int x, int y);
    void LcdWrite(byte dc, byte data);
    void LcdClear();
    void LcdString(char *charachters);
    void LcdCharacter(char charachter);

  private:
    int _SCE;
    int _RESET;
    int _DC;
    int _SDIN;
    int _SCLK;
    static byte ASCII[][5];
};
  
#endif

The rest of the library:

/*
nokia5110.cpp
This file contains the functions and data required
to drive several Nokia 5110 LCD displays.
*/

#include "nokia5110.h"
#include "Arduino.h"

nokia5110::nokia5110(int SCE, int RESET, int DC, int SDIN, int SCLK)
{
  //Set up the pins
  pinMode(SCE,   OUTPUT);
  pinMode(RESET, OUTPUT);
  pinMode(DC,    OUTPUT);
  pinMode(SDIN,  OUTPUT);
  pinMode(SCLK,  OUTPUT);

  //Reset the display
  digitalWrite(RESET, LOW);
  digitalWrite(RESET, HIGH);
  LcdWrite(0, 0x21);  // LCD Extended Commands.
  LcdWrite(0, 0xBf);  // Set LCD Vop (Contrast). //B1
  LcdWrite(0, 0x04);  // Set Temp coefficent. //0x04
  LcdWrite(0, 0x14);  // LCD bias mode 1:48. //0x13
  LcdWrite(0, 0x0C);  // LCD in normal mode. 0x0d for inverse
  LcdWrite(LOW, 0x20);
  LcdWrite(LOW, 0x0C);

  //Set the global variables
  _SCE = SCE;
  _RESET = RESET;
  _DC = DC;
  _SDIN = SDIN;
  _SCLK = SCLK;

  //Set up the ASCII tables
static 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 ¥
 ,{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 ←
 ,{0x00, 0x06, 0x09, 0x09, 0x06} // 7f →
 };
}

void nokia5110::LcdCharacter(char character) //Prints a charachter to the LCD
{
  LcdWrite(HIGH, 0x00);
  for (int index = 0; index < 5; index++)
  {
    LcdWrite(HIGH, ASCII[character - 0x20][index]);
  }
  LcdWrite(HIGH, 0x00);
}

void nokia5110::LcdClear() //Blanks out the LCD
{
  for (int index = 0; index < 84 * 48
 / 8; index++)
  {
    LcdWrite(HIGH, 0x00);
  }
}

void nokia5110::LcdString(char *characters) // Print a string to the LCD
{
  while (*characters)
  {
    LcdCharacter(*characters++);
  }
}

void nokia5110::LcdWrite(byte dc, byte data) // Send data to the LCD
{
  digitalWrite(_DC, dc);
  digitalWrite(_SCE, LOW);
  shiftOut(_SDIN, _SCLK, MSBFIRST, data);
  digitalWrite(_SCE, HIGH);
}

// gotoXY routine to position cursor 
// x - range: 0 to 84
// y - range: 0 to 5

void nokia5110::gotoXY(int x, int y)
{
  LcdWrite(0, 0x80 | x);  // Column.
  LcdWrite(0, 0x40 | y);  // Row.  

}



void nokia5110::drawBorderBox() // Print a line on the LCD
{
  unsigned char  j;  
   for(j=0; j<84; j++) // top
	{
    gotoXY (j,0);
	LcdWrite (1, 0x01);
  	} 	
  for(j=0; j<84; j++) //Bottom
	{
    gotoXY (j,5);
	LcdWrite (1, 0x80);
	} 	

  for(j=0; j<6; j++) // Right
	{
    gotoXY (83,j);
	LcdWrite (1, 0xff);
  	} 	
	for(j=0; j<6; j++) // Left
	{
    gotoXY (0,j);
	LcdWrite (1, 0xff);
  	}

}

And the compiler output:

nokia5110\nokia5110.cpp.o: In function `nokia5110::LcdCharacter(char)':
C:\Users\kuhnbe\Documents\Arduino\libraries\nokia5110/nokia5110.cpp:140: undefined reference to `nokia5110::ASCII'
C:\Users\kuhnbe\Documents\Arduino\libraries\nokia5110/nokia5110.cpp:140: undefined reference to `nokia5110::ASCII'
C:\Users\kuhnbe\Documents\Arduino\libraries\nokia5110/nokia5110.cpp:141: undefined reference to `nokia5110::ASCII'
C:\Users\kuhnbe\Documents\Arduino\libraries\nokia5110/nokia5110.cpp:141: undefined reference to `nokia5110::ASCII'

Thanks again.

Move the ASCII array declaration out of the nokia5100::nokia5110() function and into the global variable area, under the includes.

OK. I made that change, same results. I also tried making it public but that did not help either.

static byte ASCII[][5] = {

Why static?

nokia5110::nokia5110(int SCE, int RESET, int DC, int SDIN, int SCLK)
{
...

  //Set up the ASCII tables
static byte ASCII[][5] = {
...
 };
}

That table has scope only inside that function (I think).

Move the table outside, like this, then it compiles:

//Set up the ASCII tables
byte nokia5110::ASCII[][5] = {
  {0x00, 0x00, 0x00, 0x00, 0x00} // 20  
 ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
... blah blah
 ,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ←
 ,{0x00, 0x06, 0x09, 0x09, 0x06} // 7f →
 };
 
nokia5110::nokia5110(int SCE, int RESET, int DC, int SDIN, int SCLK)
{
  //Set up the pins
  pinMode(SCE,   OUTPUT);
  pinMode(RESET, OUTPUT);
...

Yup, that did it. Thanks everyone.