Large Alphanumeric on LCD

Here is what I have. It uses program memory and a table for entry for each character

//************************************************************************
//*      A set of custom made large numbers for a 16x2 LCD using the
//*      LiquidCrystal librabry. Works with displays compatible with the
//*      Hitachi HD44780 driver.
//*      
//*      orginal developed  by Michael Pilcher  2/9/2010
//*      there are 8 entries, 8 bytes per entry
//*      these are the building blocks to make the numbers
//*      
//*      http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1265696343
//************************************************************************


//*      The LL, LT, UB, ect... are rust abreviations to help me designate which segment was which when referencing the large '0'.
//*      LT= left top
//*      UB= upper bar
//*      RT= right top
//*      LL= lower left
//*      LB= lower bar
//*      LR= lower right
//*      UMB= upper middle bars(upper middle section of the '8')
//*      LMB= lower middle bars(lower middle section of the '8')

uint8_t      gBigFontShapeTable[] PROGMEM      =      {
//*      LT[8] =
  B00111,
  B01111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
//*      UB[8] =
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
//*      RT[8] =
  B11100,
  B11110,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
//*      LL[8] =
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B01111,
  B00111,
//*      LB[8] =
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111,
//*      LR[8] =
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11110,
  B11100,
//*      UMB[8] =
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
//*      LMB[8] =
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111


};


//************************************************************************
//*      6 numbers for each character
//*      9 means BLANK
uint8_t      gBigFontAsciiTable[] PROGMEM      =      {

      32,      32,      32,      32,      32,      32,            //      0x20      space
      32,      0,      32,      32,      4,      32,            //      0x21      !
      32,      32,      32,      32,      32,      32,            //      0x22      
      32,      32,      32,      32,      32,      32,            //      0x23      
      32,      32,      32,      32,      32,      32,            //      0x24      
      32,      32,      32,      32,      32,      32,            //      0x25      
      32,      32,      32,      32,      32,      32,            //      0x26      
      32,      32,      32,      32,      32,      32,            //      0x27      
      32,      32,      32,      32,      32,      32,            //      0x28      
      32,      32,      32,      32,      32,      32,            //      0x29      
      32,      32,      32,      32,      32,      32,            //      0x2A      
      32,      32,      32,      32,      32,      32,            //      0x2B      
      32,      32,      32,      32,      32,      32,            //      0x2C      
      32,      32,      32,      32,      32,      32,            //      0x2D
      32,      32,      32,      32,      4,      32,            //      0x2E      . (period)
      32,      32,      32,      32,      32,      32,            //      0x2F      


      0,      1,      2,      3,      4,      5,            //      0x30      0
      1,      2,      32,      32,      5,      32,            //      0x31      1
      6,      6,      2,      3,      7,      7,            //      0x32      2
      6,      6,      2,      7,      7,      5,            //      0x33      3
      3,      4,      2,      32,      32,      5,            //      0x34      4
      255,6,      6,      7,      7,      5,            //      0x35      5 
//      0,      6,      6,      7,      7,      5,            //      0x35      5
      0,      6,      6,      3,      7,      5,            //      0x36      6
      1,      1,      2,      32,      0,      32,            //      0x37      7
      0,      6,      2,      3,      7,      5,            //      0x38      8
      0,      6,      2,      32,      32,      5,            //      0x39      9
      32,      32,      32,      32,      32,      32,            //      0x3A      
      32,      32,      32,      32,      32,      32,            //      0x3B
      32,      32,      32,      32,      32,      32,            //      0x3C
      32,      32,      32,      32,      32,      32,            //      0x3D
      32,      32,      32,      32,      32,      32,            //      0x3E
      1,      6,      2,      254,7,      32,            //      0x3F      ?

      32,      32,      32,      32,      32,      32,            //      0x40      @
      0,      6,      2,      255,254,255,      //      0x41      A
      255,6,      5,      255,7,      2,            //      0x42      B
      0,      1,      1,      3,      4,      4,            //      0x43      C
      255,1,      2,      255,4,      5,            //      0x44      D
      255,6,      6,      255,7,      7,            //      0x45      E
      255,6,      6,      255,32,      32,            //      0x46      F
      
      0,      1,      1,      3,      4,      2,            //      0x47      G
      255,4,      255,255,254,255,      //      0x48      H
      1,      255,1,      4,      255,4,            //      0x49      I
      32,      32,      255,4,      4,      5,            //      0x4A      J
      255,4,      5,      255,254,2,            //      0x4B      K
      255,32,      32,      255,4,      4,            //      0x4C      L
      32,      32,      32,      32,      32,      32,            //      0x4D      M      place holder
      32,      32,      32,      32,      32,      32,            //      0x4E      N      place holder
      0,      1,      2,      3,      4,      5,            //      0x4F      O      (same as zero)

      0,      6,      2,      3,      32,      32,            //      0x50      P
      32,      32,      32,      32,      32,      32,            //      0x51      Q
      0,      6,      5,      3,      32,      2,            //      0x52      R
      0,      6,      6,      7,      7,      5,            //      0x35      S      (same as 5)
      1,      2,      1,      32,      5,      32,            //      0x54      T
      2,      32,      2,      3,      4,      5,            //      0x55      U
      32,      32,      32,      32,      32,      32,            //      0x56      V      place holder
      32,      32,      32,      32,      32,      32,            //      0x57      W      place holder
      3,      4,      5,      0,      32,      2,            //      0x58      X
      3,      4,      5,      32,      5,      32,            //      0x59      Y
      1,      6,      5,      0,      7,      4,            //      0x5A      Z
      0

};

//*      we have a seperate table for the wide routines
uint8_t      gBigFontAsciiTableWide[] PROGMEM      =      {
//*      this table is 10 bytes, 2 rows of 5
//      ---top------------|
      0,      1,      3,      1,      2,      3,      32,      32,      32,      5,            //      0x4D      M            5-wide
      0,      3,      32,      2,      32,      3,      32,      2,      5,      32,            //      0x4E      N            4-wide
      0,      1,      2,      32,      32,      3,      4,      3,      4,      32,            //      0x51      Q            4-wide
      3,      32,      32,      5,      32,      32,      3,      5,      32,      32,            //      0x56      V            4-wide
      0,      32,      32,      32,      2,      3,      4,      0,      4,      5,            //      0x57      W            5-wide
      0
};


//************************************************************************
static void      BigNumber_SendCustomChars(void)
{
uint8_t      customCharDef[10];
uint8_t      ii;
int            jj;

      for (ii=0; ii<8; ii++)
      {
            for (jj=0; jj<8; jj++)
            {
                  customCharDef[jj]      =      pgm_read_byte_near(gBigFontShapeTable + (ii * 8) + jj);
            }
            gLCD.createChar(ii, customCharDef);
      }
}

//************************************************************************
//*      returns the width of the character
static int      DrawBigChar(int xLocation, int yLocation, char theChar)
{
int            offset;
int            ii;
char      theByte;
boolean      specialCase;
int            specialIndex;
int            charWidth;

      if (theChar == 0x20)
      {
            return(2);
      }
      else if (theChar < 0x20)
      {
            return(0);
      }

      if (theChar >= 'A')
      {
            theChar      =      theChar & 0x5F;      //*      force to upper case
      }
      specialCase      =      true;
      switch (theChar)
      {
            case 'M':      charWidth      =      5;      specialIndex      =      0;      break;
            case 'N':      charWidth      =      4;      specialIndex      =      1;      break;
            case 'Q':      charWidth      =      4;      specialIndex      =      2;      break;
            case 'V':      charWidth      =      4;      specialIndex      =      3;      break;
            case 'W':      charWidth      =      5;      specialIndex      =      4;      break;
                  
            
            default:
                  charWidth      =      3;
                  specialCase      =      false;
                  offset            =      6 * (theChar - 0x20);
                  gLCD.setCursor(xLocation, yLocation);
                  for (ii=0; ii<3; ii++)
                  {
                        theByte      =      pgm_read_byte_near(gBigFontAsciiTable + offset + ii);
                        gLCD.write(theByte);
                  }

                  gLCD.setCursor(xLocation, yLocation + 1);
                  offset      +=      3;
                  for (ii=0; ii<3; ii++)
                  {
                        theByte      =      pgm_read_byte_near(gBigFontAsciiTable + offset + ii);
                        gLCD.write(theByte);
                  }
                  break;
      }
      if (specialCase)
      {
            //*
            offset            =      10 * specialIndex;
            gLCD.setCursor(xLocation, yLocation);
            for (ii=0; ii<charWidth; ii++)
            {
                  theByte      =      pgm_read_byte_near(gBigFontAsciiTableWide + offset + ii);
                  gLCD.write(theByte);
            }

            gLCD.setCursor(xLocation, yLocation + 1);
            offset      +=      5;
            for (ii=0; ii<charWidth; ii++)
            {
                  theByte      =      pgm_read_byte_near(gBigFontAsciiTableWide + offset + ii);
                  gLCD.write(theByte);
            }
      }
      return(charWidth + 1);
}