24x8 LCD - Anyone have one of these?

Hey

Some years ago I brought one of these displays, and I am just curious if anyone else has one.

I actually have the version from the PJRC website (which they no longer sell sadly) - which has a keypad and LCD and the modified EEPROM to make it usable as it was originally for some AT&T terminal.

I have got it working on Arduino, and its very cool.

Purely interested to know if anyone else has one.
I am just trying to find the large font library for it which you can send at startup and is stored in its RAM, to display stuff like this - but I havent had any luck yet.

Cheers

How much $$ for one(assuming it can be found)?

Well this is the site I purchased it from, however they dont stock it anymore.

http://www.pjrc.com/store/mp3_display.html

I purchased the $77US version, which included a backlight which was obtained by some dude called Techknowman, however the site is no longer their either.

These may be available from elsewhere still, someone may have stock, however if they are the original AT&T item, then they will not work out of the box. You have to replace the EEPROM on the back of the display. The EEPROM from what I can tell, PJRC still has a few left.

This was the website that PJRC reference as to who most likely supplied them with the LCD, so they may have some...?
http://earthlcd.com/jw002.htm

Hope that is of some help.

I am just nutting out the large fonts now. I have some characters loaded into the RAM and I can piece them together to crudely display number 1 and 2, however it is far from usable yet.

I just spent a few hours today creating this program. It includes a custom font for large numbers.

The problem however is this program takes up 21312 bytes, and it simply writes serial commands to the display to print some normal text and then some large numbers.

It is by no means efficient, but I am not sure how to get the code more efficient and to take less space. Alot of this ideally needs to go in a library, however I have never made a library so not sure where to start to be honest.

Part 1 of code:

//Test program for talking to PJRC's 24x8 LCD with RS232 interface
//Program simply counts from 0 to 9999 on the LCD.

int Number = 0;
char NumberString[10];

void setup() 
{
  Serial.begin(19200);
  Serial1.begin(19200);
  LCD_init();
  Font10();
}

void loop()
{  
  LCDPrint("Test print - Font 0",0,0,0);
  LCDPrint("Test print - Font 1",0,1,1);
  
  itoa(Number, NumberString, 10);
  BigPrint((char*)NumberString,0,4);
  delay(1000);
  
  Number = Number + 1;
  if(Number == 10000)
  {
    Number = 0;
  }
}

void LCD_init()
/* Sets the LCD display to a known initialized state */
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x40,BYTE);  //Clear Display and Set Font
  Serial1.print(0x20,BYTE);  //Font 0
  Serial1.print(0x30,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x41,BYTE);  //Mode
  Serial1.print(0x31,BYTE);  //wrap on, scroll off
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x5B,BYTE);  //Display incomming characters   
}

//Prints normal sized text to the screen
void LCDPrint(char* String, int Column, int Row, int Font)
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);   //Select Font
  
  switch (Font)
  {
    case 0:
      Serial1.print(0x20,BYTE);  //Font 0
      break;
    case 1:
      Serial1.print(0x21,BYTE);  //Font 1
      break;
    case 2:
      Serial1.print(0x22,BYTE);  //Font 2
      break;
    case 3:
      Serial1.print(0x23,BYTE);  //Font 3
      break;
  }  
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);    //Position Cursor
  
  switch (Column)
  {
    case 0:
      Serial1.print(0x20,BYTE);
      break;
    case 1:
      Serial1.print(0x21,BYTE);
      break;
    case 2:
      Serial1.print(0x22,BYTE);
      break;
    case 3:
      Serial1.print(0x23,BYTE);
      break;
    case 4:
      Serial1.print(0x24,BYTE);
      break;
    case 5:
      Serial1.print(0x25,BYTE);
      break;
    case 6:
      Serial1.print(0x26,BYTE);
      break;
    case 7:
      Serial1.print(0x27,BYTE);
      break;
    case 8:
      Serial1.print(0x28,BYTE);
      break;
    case 9:
      Serial1.print(0x29,BYTE);
      break;
    case 10:
      Serial1.print(0x2A,BYTE);
      break;
    case 11:
      Serial1.print(0x2B,BYTE);
      break;
    case 12:
      Serial1.print(0x2C,BYTE);
      break;
    case 13:
      Serial1.print(0x2D,BYTE);
      break;
    case 14:
      Serial1.print(0x2E,BYTE);
      break;
    case 15:
      Serial1.print(0x2F,BYTE);
      break;
    case 16:
      Serial1.print(0x30,BYTE);
      break;
    case 17:
      Serial1.print(0x31,BYTE);
      break;
    case 18:
      Serial1.print(0x32,BYTE);
      break;
    case 19:
      Serial1.print(0x33,BYTE);
      break;
    case 20:
      Serial1.print(0x34,BYTE);
      break;
    case 21:
      Serial1.print(0x35,BYTE);
      break;
    case 22:
      Serial1.print(0x36,BYTE);
      break;
    case 23:
      Serial1.print(0x37,BYTE);
      break;
  } 
  
  switch (Row)
  {
    case 0:
      Serial1.print(0x20,BYTE);
      break;  
    case 1:
      Serial1.print(0x21,BYTE);
      break;   
    case 2:
      Serial1.print(0x22,BYTE);
      break;   
    case 3:
      Serial1.print(0x23,BYTE);
      break;   
    case 4:
      Serial1.print(0x24,BYTE);
      break;   
    case 5:
      Serial1.print(0x25,BYTE);
      break;   
    case 6:
      Serial1.print(0x26,BYTE);
      break;   
    case 7:
      Serial1.print(0x27,BYTE);
      break;
  }  
  Serial1.print(String);  //Print string to LCD
}

void Font10()    //Used to save custom segments in LCD RAM, which make up the large number font
{
  Serial1.print(0x5C,BYTE);
  Serial1.print("D00*        ");    //Blank                  - Font 10, character 0
  Serial1.print(0x5C,BYTE);
  Serial1.print("D01*   !#'/?");    //Bottom right triangle  - Font 10, character 1
  Serial1.print(0x5C,BYTE);
  Serial1.print("D02*????????");    //Full brick             - Font 10, character 2
  Serial1.print(0x5C,BYTE);
  Serial1.print("D03*   ?????");    //Bottom half brick      - Font 10, character 3
  Serial1.print(0x5C,BYTE);
  Serial1.print("D04*?><80   ");    //Top left triangle      - Font 10, character 4
  Serial1.print(0x5C,BYTE);
  Serial1.print("D05*?????   ");    //Top half brick         - Font 10, character 5
  Serial1.print(0x5C,BYTE);
  Serial1.print("D06*   08<>?");    //Bottom left triangle   - Font 10, character 6
  Serial1.print(0x5C,BYTE);
  Serial1.print("D07*?/'#!   ");    //Top right triangle     - Font 10, character 7
}

void BigPrint(char* String, int ColumnStart, int RowStart)
{
  int StartColumn;
  int StartRow;
  
  switch (String[0])
  {
    case '1':
    StartColumn = 32 + ColumnStart;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print1(StartColumn, StartRow);
    break;
    
    case '2':
    StartColumn = 32 + ColumnStart;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print2(StartColumn, StartRow);   
    break;
    
    case '3':
    StartColumn = 32 + ColumnStart;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print3(StartColumn, StartRow);   
    break;
    
    case '4':
    StartColumn = 32 + ColumnStart;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print4(StartColumn, StartRow);   
    break;
    
    case '5':
    StartColumn = 32 + ColumnStart;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print5(StartColumn, StartRow);   
    break;
    
    case '6':
    StartColumn = 32 + ColumnStart;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print6(StartColumn, StartRow);   
    break;
    
    case '7':
    StartColumn = 32 + ColumnStart;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print7(StartColumn, StartRow);   
    break;
    
    case '8':
    StartColumn = 32 + ColumnStart;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print8(StartColumn, StartRow);   
    break;
    
    case '9':
    StartColumn = 32 + ColumnStart;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print9(StartColumn, StartRow);   
    break;
    
    case '0':
    StartColumn = 32 + ColumnStart;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print0(StartColumn, StartRow);   
    break;
  }
  
  switch (String[1])
  {
    case '1':
    StartColumn = 32 + ColumnStart + 5;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print1(StartColumn, StartRow);
    break;
    
    case '2':
    StartColumn = 32 + ColumnStart + 5;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print2(StartColumn, StartRow);   
    break;
    
    case '3':
    StartColumn = 32 + ColumnStart + 5;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print3(StartColumn, StartRow);   
    break;
    
    case '4':
    StartColumn = 32 + ColumnStart + 5;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print4(StartColumn, StartRow);   
    break;
    
    case '5':
    StartColumn = 32 + ColumnStart + 5;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print5(StartColumn, StartRow);   
    break;
    
    case '6':
    StartColumn = 32 + ColumnStart + 5;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print6(StartColumn, StartRow);   
    break;
    
    case '7':
    StartColumn = 32 + ColumnStart + 5;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print7(StartColumn, StartRow);   
    break;
    
    case '8':
    StartColumn = 32 + ColumnStart + 5;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print8(StartColumn, StartRow);   
    break;
    
    case '9':
    StartColumn = 32 + ColumnStart + 5;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print9(StartColumn, StartRow);   
    break;
    
    case '0':
    StartColumn = 32 + ColumnStart + 5;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print0(StartColumn, StartRow);   
    break;
  }

Part 2 of code:

switch (String[2])
  {
    case '1':
    StartColumn = 32 + ColumnStart + 10;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print1(StartColumn, StartRow);
    break;
    
    case '2':
    StartColumn = 32 + ColumnStart + 10;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print2(StartColumn, StartRow);   
    break;
    
    case '3':
    StartColumn = 32 + ColumnStart + 10;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print3(StartColumn, StartRow);   
    break;
    
    case '4':
    StartColumn = 32 + ColumnStart + 10;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print4(StartColumn, StartRow);   
    break;
    
    case '5':
    StartColumn = 32 + ColumnStart + 10;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print5(StartColumn, StartRow);   
    break;
    
    case '6':
    StartColumn = 32 + ColumnStart + 10;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print6(StartColumn, StartRow);   
    break;
    
    case '7':
    StartColumn = 32 + ColumnStart + 10;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print7(StartColumn, StartRow);   
    break;
    
    case '8':
    StartColumn = 32 + ColumnStart + 10;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print8(StartColumn, StartRow);   
    break;
    
    case '9':
    StartColumn = 32 + ColumnStart + 10;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print9(StartColumn, StartRow);   
    break;
    
    case '0':
    StartColumn = 32 + ColumnStart + 10;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print0(StartColumn, StartRow);   
    break;
  }
  
  switch (String[3])
  {
    case '1':
    StartColumn = 32 + ColumnStart + 15;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print1(StartColumn, StartRow);
    break;
    
    case '2':
    StartColumn = 32 + ColumnStart + 15;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print2(StartColumn, StartRow);   
    break;
    
    case '3':
    StartColumn = 32 + ColumnStart + 15;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print3(StartColumn, StartRow);   
    break;
    
    case '4':
    StartColumn = 32 + ColumnStart + 15;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print4(StartColumn, StartRow);   
    break;
    
    case '5':
    StartColumn = 32 + ColumnStart + 15;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print5(StartColumn, StartRow);   
    break;
    
    case '6':
    StartColumn = 32 + ColumnStart + 15;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print6(StartColumn, StartRow);   
    break;
    
    case '7':
    StartColumn = 32 + ColumnStart + 15;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print7(StartColumn, StartRow);   
    break;
    
    case '8':
    StartColumn = 32 + ColumnStart + 15;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print8(StartColumn, StartRow);   
    break;
    
    case '9':
    StartColumn = 32 + ColumnStart + 15;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print9(StartColumn, StartRow);   
    break;
    
    case '0':
    StartColumn = 32 + ColumnStart + 15;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print0(StartColumn, StartRow);   
    break;
  }
  
  switch (String[4])
  {
    case '1':
    StartColumn = 32 + ColumnStart + 20;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print1(StartColumn, StartRow);
    break;
    
    case '2':
    StartColumn = 32 + ColumnStart + 20;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print2(StartColumn, StartRow);   
    break;
    
    case '3':
    StartColumn = 32 + ColumnStart + 20;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print3(StartColumn, StartRow);   
    break;
    
    case '4':
    StartColumn = 32 + ColumnStart + 20;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print4(StartColumn, StartRow);   
    break;
    
    case '5':
    StartColumn = 32 + ColumnStart + 20;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print5(StartColumn, StartRow);   
    break;
    
    case '6':
    StartColumn = 32 + ColumnStart + 20;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print6(StartColumn, StartRow);   
    break;
    
    case '7':
    StartColumn = 32 + ColumnStart + 20;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print7(StartColumn, StartRow);   
    break;
    
    case '8':
    StartColumn = 32 + ColumnStart + 20;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print8(StartColumn, StartRow);   
    break;
    
    case '9':
    StartColumn = 32 + ColumnStart + 20;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print9(StartColumn, StartRow);   
    break;
    
    case '0':
    StartColumn = 32 + ColumnStart + 20;
    StartRow = 32 + RowStart;
    Clear(StartColumn, StartRow);
    Print0(StartColumn, StartRow);   
    break;
  }
}

void Clear(int StartColumn, int StartRow)
{
  LCDPrint("    ", StartColumn-32, StartRow-32, 0);
  LCDPrint("    ", StartColumn-32, StartRow-32+1, 0);
  LCDPrint("    ", StartColumn-32, StartRow-32+2, 0);
  LCDPrint("    ", StartColumn-32, StartRow-32+3, 0);
}

void Print1(int StartColumn, int StartRow)
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x2A,BYTE);  //Font 10
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x21,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn + 2,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn + 2,BYTE);  //Column
  Serial1.print(StartRow + 1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn + 2,BYTE);  //Column
  Serial1.print(StartRow + 2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn + 1,BYTE);  //Column
  Serial1.print(StartRow + 3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn + 2,BYTE);  //Column
  Serial1.print(StartRow + 3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn + 3,BYTE);  //Column
  Serial1.print(StartRow + 3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
}

Part 3:

void Print2(int StartColumn, int StartRow)
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x2A,BYTE);  //Font 10
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x21,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x26,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x24,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x21,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
}

void Print3(int StartColumn, int StartRow)
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x2A,BYTE);  //Font 10
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x21,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x26,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x24,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x26,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x27,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x24,BYTE);
}

void Print4(int StartColumn, int StartRow)
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x2A,BYTE);  //Font 10
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x27,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
}

Part 4:

void Print5(int StartColumn, int StartRow)
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x2A,BYTE);  //Font 10
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x27,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x26,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x27,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x24,BYTE);
}

void Print6(int StartColumn, int StartRow)
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x2A,BYTE);  //Font 10
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x21,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x26,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x21,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x26,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x27,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x24,BYTE);
}

void Print7(int StartColumn, int StartRow)
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x2A,BYTE);  //Font 10
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x24,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x21,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x24,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x21,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
}

Part 5:

void Print8(int StartColumn, int StartRow)
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x2A,BYTE);  //Font 10
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x21,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x26,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x27,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x26,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x21,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x24,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x21,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x24,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x27,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x26,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x27,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x24,BYTE);
}

void Print9(int StartColumn, int StartRow)
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x2A,BYTE);  //Font 10
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x21,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x26,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x27,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x24,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x27,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x24,BYTE);
}

void Print0(int StartColumn, int StartRow)
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x2A,BYTE);  //Font 10
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x21,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x25,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x26,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+1,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+2,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x22,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x27,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+1,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+2,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x23,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(StartColumn+3,BYTE);  //Column
  Serial1.print(StartRow+3,BYTE);  //Row
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x24,BYTE);
}

See - long and not efficient eh!

I wrote it just trying to get some custom fonts going, and it turned into this beast. There must be a better way to do it though.

its driven by a KS108 chipset which is typically found in 128x64 GLCD's but its not the only use for it as shown

there is a KS108 GLCD lib on the playground which may answer some of the finer details of the chipset

(as a starting run, you can use the graphics area of ram for your custom fonts, since your not going to use it on that character screen anyway)

it may be interesting to do since this model also has a serial backpack, good luck!

Hi
Yep thanks.

There are 4 built in fonts which PJRC put into the EEPROM, and there are a number of free fonts available for inputting custom fonts, which is what I have done.

I have loaded in 8 characters into Font 10, which I use to make up the larger fonts.

All the commands that this LCD takes are on this page:

My code isnt very well commented, but here is basically what it does:

This bit sets the font to the custom Font 10 I have made.
Serial1.print(0x5C,BYTE);
Serial1.print(0x43,BYTE); //Set Font
Serial1.print(0x2A,BYTE); //Font 10

This bit selects the location on the screen to print, I made the location a variable so it can be changed in code and not fixed to one area only.
Serial1.print(0x5C,BYTE);
Serial1.print(0x42,BYTE);
Serial1.print(StartColumn,BYTE); //Column
Serial1.print(StartRow,BYTE); //Row

This bit prints character 0x21 from Font 10 to the screen. The characters are called using Character+32, but in hex. So 0x21 is 33 in Decimal, so its calling font number 1.
Serial1.print(0x5C,BYTE);
Serial1.print(0x21,BYTE);

I have created and loaded:
0x20 = blank square
0x21 = Bottom Right corner triangle
0x22 = Fully filled in square
0x23 = Bottom half square filled
0x24 = Top left corner triangle
0x25 = top half square filled
0x26 = Bottom left corner triangle
0x27 = Top right corner triangle

Fonts were designed using this website:
http://www.btinternet.com/~e2one/lcd/graphics_character_definer.htm

BigPrint() function determines the number to write to the screen, 1 character at a time, and sends requests off to the print functions.

The functions Print1() etc print a larger number 1 to the specified area on the screen, etc for the other print functions.

The LCDPrint() function I made to take a string and to also specify where on the screen it should go and the font used - makes it nicer to print. This is for the standard fonts, not the large font I have created.

Thats basically what it does, but it just takes so much room just to call all of the characters in the right order to make up each of the large numbers, I am not sure how else to do this...
Like the LCD only stores 8 small pictures basically, and I have to tell it how to arrange these pictures to form each number.

There has to be a better way. This is my first time attempting anything with a LCD like this though, so I expected it to be - well - crude.

It does work though.

Here is a pic of my test setup

I don't have one but I know I want one!

I have come across a PDF for another brand of micro to interface to an LCD which is very similar to this, however not quite as big. It uses the same 4x4 sized large font.
http://www.seetron.com/pdf/lcd_an1.pdf

I am going to attempt to port this to arduino.

If anyone is reading, bored and know how to easily port this - you are more than welcome to help me :stuck_out_tongue:

I haven't read the pdf in detail however skimming the code it looks like its MUCH more efficient than how my crap code above does it, so it should be a winner.

Time for me to hit the sack. Zzzzzzz

I have managed to find a couple of these LCD's in stock from a gentleman in the US. They are already modified with the PJRC EEPROM also.

They are about $35US each + shipping.

I am going to get 2 more of them, and he said he has about 4 more after that - so if anyone is totally keen I could devolge my source :stuck_out_tongue:

These are most likely the last ones available with the PJRC mods done to them... PJRC got back to me and said they have totally sold out and have no EEPROM's either, however they did give me the HEX file to program the EEPROM, but you need a special EEPROM chip and burner, so for me that goes into the 'too hard' basket for now.

Will get onto porting this code in about an hour.

Totally rewrote the code, and now its 4598 bytes, rather than 22394 bytes.
Porting from the PDF code mentioned in previous posts was too hard, as I dont understand BASIC enough, or Arduino code for that matter - lol. Still learning, but all is good.

On searching, there are a few other people who have done this, so I may have just reinvented the wheel - however this one is kinda specific to this screen and the commands required to send data to it.

Was worth the exercise though I think.

Note this is written for a 644P using the Sanguino bootloader, but can run on a standard Arduino too - just the 644P has 2 serial ports, hence the Serial1.print statements in the code.

Here is a pic, followed by the code. Still improvements to make, but its working code to share.

/* 3x3 Large Number display for 24x8 LCD with Serial backpack 
   Details of display available here:
   http://www.pjrc.com/store/mp3_display.html
   http://www.pjrc.com/tech/mp3/lcd_protocol.html
   http://www.pjrc.com/tech/mp3/lcd_fonts.html
   http://www.pjrc.com/store/tman_lcd.html                          */

/* A big thank you for the example found at the address below, 
   it helped me write this program

Large number example 
May 24, 2009
Fof HIFIDUINO
www.hifiduino.blogspot.com                                          */

/* Custom characters created using the following website:
   http://www.btinternet.com/~e2one/lcd/graphics_character_definer.htm  */
   

// The routine to create the custom characters in the LCD
void Font10()    //Used to save custom segments in LCD RAM, which make up the large number font
{
  Serial1.print(0x5C,BYTE);
  Serial1.print("D01*????????");    //Font 10, character 0
  Serial1.print(0x5C,BYTE);
  Serial1.print("D02*?????   ");    //Font 10, character 1
  Serial1.print(0x5C,BYTE);
  Serial1.print("D03*   ?????");    //Font 10, character 2
  Serial1.print(0x5C,BYTE);
  Serial1.print("D04*        ");    //Font 10, character 3
  Serial1.print(0x5C,BYTE);
  Serial1.print("D05*??????  ");    //Font 10, character 4
  Serial1.print(0x5C,BYTE);
  Serial1.print("D06* ?????  ");    //Font 10, character 5
  Serial1.print(0x5C,BYTE);
  Serial1.print("D07* ???????");    //Font 10, character 6
}

// Array index into parts of big numbers. Numbers consist of 9 custom characters in 3 lines
//            0      1      2      3      4      5      6      7      8      9    
char bn1[]={1,2,1, 3,1,4, 2,2,1, 2,2,1, 1,4,1, 1,2,2, 1,2,2, 2,2,1, 1,2,1, 1,2,1};
char bn2[]={1,4,1, 4,1,4, 7,6,5, 6,6,1, 5,6,1, 5,6,7, 1,6,7, 4,4,1, 1,6,1, 5,6,1};
char bn3[]={1,3,1, 3,1,3, 1,3,3, 3,3,1, 4,4,1, 3,3,1, 1,3,1, 4,4,1, 1,3,1, 3,3,1};

int value = 0;
int value2 = 30000;

void LCD_init()
/* Sets the LCD display to a known initialized state */
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x40,BYTE);  //Clear Display and Set Font
  Serial1.print(0x20,BYTE);  //Font 0
  Serial1.print(0x30,BYTE);
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x41,BYTE);  //Mode
  Serial1.print(0x31,BYTE);  //wrap on, scroll off
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x5B,BYTE);  //Display incomming characters   
}

void setup()
{
  Serial.begin(19200);
  Serial1.begin(19200);
  
  LCD_init();         // Init the display
  Font10();           // Create the custom characters  
}

void loop()
{
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x21,BYTE);  //Font 1
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(0x20,BYTE);  //Column 0
  Serial1.print(0x20,BYTE);  //Row 0 (Line 1)
  
  Serial1.print("Random Value:");

  // Print value in large numbers
  printNumber(value, 0, 1);
  if(value < 30000)
  {
    value = value + 1;
  }
  else
  {
    value = 0;
  }
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x21,BYTE);  //Font 1
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(0x20,BYTE);  //Column 0
  Serial1.print(0x24,BYTE);  //Row 4 (Line 5)
  
  Serial1.print("Random Value2:");
  
  printNumber(value2, 0, 5);
  if(value2 > 0)
  {
    value2 = value2 - 1;
  }
  else
  {
    value2 = 30000;
  }
  delay(200);
}

void printNumber(int number, int column, int row)
{
  int digit0;  // To represent the ones
  int digit1;  // To represent the tens
  int digit2;  // To represent the hundreds
  int digit3;  // To represent the thousands
  int digit4;  // To represent the ten-thousands
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x2A,BYTE);  //Font 10
  
  if (number < 10)
  {
    digit0 = number;
    printOneNumber(digit0, column+32, row+32);
  }
  if (number > 9 && number < 100)
  {
    digit0 = number % 10;
    printOneNumber(digit0, column+36, row+32);
    digit1 = number / 10;
    printOneNumber(digit1, column+32, row+32);
  }
  
  if (number > 99 && number < 1000)
  {
    digit0 = number % 10;
    printOneNumber(digit0, column+40, row+32);
    digit1 = (number / 10) % 10;
    printOneNumber(digit1, column+36, row+32);
    digit2 = number / 100;
    printOneNumber(digit2, column+32, row+32);
  }
  
  if (number > 999 && number < 10000)
  {
    digit0 = number % 10;
    printOneNumber(digit0, column+44, row+32);
    digit1 = (number / 10) % 10;
    printOneNumber(digit1, column+40, row+32);
    digit2 = (number / 100) % 10;
    printOneNumber(digit2, column+36, row+32);
    digit3 = number / 1000;
    printOneNumber(digit3, column+32, row+32);
  }
  
  if (number > 9999 && number < 100000)
  {
    digit0 = number % 10;
    printOneNumber(digit0, column+48, row+32);
    digit1 = (number / 10) % 10;
    printOneNumber(digit1, column+44, row+32);
    digit2 = (number / 100) % 10;
    printOneNumber(digit2, column+40, row+32);
    digit3 = (number / 1000) % 10;
    printOneNumber(digit3, column+36, row+32);
    digit4 = number / 10000;
    printOneNumber(digit4, column+32, row+32);
  }
}

void printOneNumber(int digit, byte Column, byte Row)
{
  int i;
  
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x43,BYTE);  //Set Font
  Serial1.print(0x2A,BYTE);  //Font 10
  
  // Line 1 of the one digit number
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(Column,BYTE);  //Column
  Serial1.print(Row,BYTE);  //Row
  
  for(i=0;i<3;i++)
  {
    Serial1.print(0x5C,BYTE);
    Serial1.print(bn1[digit*3+i] + 32,BYTE);
  }

  // Line 2 of the one-digit number
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(Column,BYTE);  //Column
  Serial1.print(Row+1,BYTE);  //Row
  
  for(i=0;i<3;i++)
  {
    Serial1.print(0x5C,BYTE);
    Serial1.print(bn2[digit*3+i] + 32,BYTE);
  }
  
  // Line 3 of the one-digit number
  Serial1.print(0x5C,BYTE);
  Serial1.print(0x42,BYTE);
  Serial1.print(Column,BYTE);  //Column
  Serial1.print(Row+2,BYTE);  //Row
  
  for(i=0;i<3;i++)
  {
    Serial1.print(0x5C,BYTE);
    Serial1.print(bn3[digit*3+i] + 32,BYTE);
  }
}

Time for some Zzzzz's now

I have ordered 2 more of these displays now, as I have a few projects which will use them up. Such a good sized display, and awesome with the serial backpack built into it.

I have written code for 3x3 font (as pictured above), 4x4 font (as pictured earlier in this thread) and have also done a 3x2 font which I found on this forum. 3 different style and sized fonts.

Good fun :slight_smile:

Incase anyone wants one of these displays, they are on Ebay at the moment.

If you want one, this may be one of the last opportunities to get one.

The Ebay ones have a small daughter board on the back with the MAX232 chip which also powers the board with the -ve voltage. So all you need to supply this with is 5V, Gnd and Tx for serial comms. There is a DB9 plug on the daughter board too so you can plug direct into your PC too.

Oh and there are 4 built in fonts, and 28 free fonts which you can program in custom characters. Note the word FONT - 28 fonts, each with 256 characters which you can custom design in your program - so that is over 7000 custom characters you can store in this thing.

$15US - better be quick if you want one

I just ordered 4, to go with the other 2 I got elsewhere and the 1 I already had... lol. Lots of projects to use these up in. Still about 10 left I think.

He has 2 listings:
http://cgi.ebay.com/Serial-24-x-8-Basic-Stamp-PIC-LCD-/120615798437?pt=LH_DefaultDomain_0&hash=item1c154306a5

http://cgi.ebay.com/Intel-8032-Single-Board-Controller-Serial-24-x-8-LCD-/120608750051?pt=LH_DefaultDomain_0&hash=item1c14d779e3

Let me know if you buy one. I have no affiliation with the seller but love the LCD's hence the promotion of them.

Cheers
James

I would love one but I can't justify buying it so no new LCD for me :frowning:

Just found he actually has a couple hundred of these in stock.

He purchased these in a bulk lot of 3000 units, reflashed them and put in his custom daughter board and has been selling them for a few years.

$15US each is a steal I reckon for a 24x8 character display.

Stop encouraging me... I will not allow myself to buy more stuff I don't need ;D

Mowcius