Projects‎ > ‎Payphone Conversion‎ > ‎

Section 3

Setup an Arduino to run the VFD display (Sample Video)

Just incase your interested, here is a output from a Saleae logic analyser hooked up to an active payphone running the Nortel test sequence.

The Datasheet is at the bottom of this page - This is not the official datasheet, it was put together by a very talented electronics hobbiest named John Warga with Protospace.ca

(**VFD attached to an arduino Mega 2560 running simple code)

The VFD found on the Nortel payphones are a custom screen, not completely unique but everything that is important has had some minor change to it. One of the contributors to this put it best "It seems like it just didnt do what Nortel wanted, so they had Noritake remove all the instructions and let nortel do it manually". In this particular case, we will be talking about the Noritake CU20026SCPB-T23A. This units pin out is as follows:
Note: I use 26,24,22 as GND and 2,4,6 as +5v out from Arduino (Do not use a data pin, it wont sync enough current).
GND: 12,14,16,18,22,24,26
+5vDC: 2,4,6,8,10 (Draw is approximately 300ma)
Logic:
25 = (X4)
23 = (X3)
21 = (X2)
20 = Reset (X6)
19 = Commit Change (X1)
17 = Data 1
15 = Data 2
13 = Data 3
11 = Data 4
9 = Data 5
7 = Data 6
5 = Data 7
3 = Data 8




Character Set:
The above link is NOT the correct datasheet, but the character map happens to match, with the exception of the red highlighted areas. They dont work.

The ascii characters of note are:
10 - Line Feed
13 - Carriage return
12 - Clear screen
19 - Cursor visible
20 - Cursor invisible 
18 - Scrolling text mode off
21 - Scrolling text mode on 
17 - ???

Sample code will be available for download. For now, I am going to give the experimental code, just in case I don't get around to finishing this article, because I HATE it when people do that. Scroll to Section 6.



SOURCE CODE EXAMPLE:

//The library to make this all much easier to interact with is coming. 

////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////                                                                            ////
////                        VFD Test Code for CU20026SCPB-T23A                  ////
////                              Author: Wes D & Mark M                        ////
////                                 Date: 2/17/2014                            ////
////                                  Version: 1.00                             ////
////                            Platform: Arduino Mega 2560                     ////
////                                                                            ////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

// These pins are based on a Arduino Mega 2560. But can be run on any Arduino
// I have tested with enough pins. And just to be clear, this could just as
// easily be run on a Pic or Pi or Beagle, you name it.
//     Arduino name / Arduino pin / Pin on VFD
#define     d7            22     //Pin 15 on VFD
#define     d6            24     //Pin 13 on VFD
#define     d5            26     //Pin 11 on VFD
#define     d4            28     //Pin 9 on VFD
#define     d3            30     //Pin 7 on VFD
#define     d2            32     //Pin 5 on VFD
#define     d1            34     //Pin 3 on VFD
#define     d0            36     //Pin 1 on VFD
#define     x1            38     //Pin 17 on VFD
#define     x2            40     //Pin 19 on VFD
#define     x3            42     //Pin 21 on VFD
#define     x4            44     //Pin 23 on VFD
#define     x5            46     //Pin 25 on VFD
#define     x6            48     //Pin 20 on VFD



int scrollDelay;

void setup() {
  pinMode(d0,OUTPUT);
  pinMode(d1,OUTPUT);
  pinMode(d2,OUTPUT);
  pinMode(d3,OUTPUT);
  pinMode(d4,OUTPUT);
  pinMode(d5,OUTPUT);
  pinMode(d6,OUTPUT);
  pinMode(d7,OUTPUT);
  pinMode(x1,OUTPUT);
  pinMode(x2,OUTPUT);
  pinMode(x3,OUTPUT);
  pinMode(x4,OUTPUT);
  pinMode(x5,OUTPUT);
  pinMode(x6,OUTPUT);
  pinMode(12,OUTPUT);

  //Default States
  digitalWrite(12, HIGH);
  digitalWrite(d0, HIGH);
  digitalWrite(d1, HIGH);
  digitalWrite(d2, HIGH);
  digitalWrite(d3, HIGH);
  digitalWrite(d4, HIGH);
  digitalWrite(d5, HIGH);
  digitalWrite(d6, HIGH);
  digitalWrite(d7, HIGH);

  digitalWrite(x1, HIGH);
  digitalWrite(x2, LOW);
  digitalWrite(x3, HIGH);
  digitalWrite(x4, LOW);
  digitalWrite(x5, HIGH);
  digitalWrite(x6, LOW);
  
}

void vfdreset() {
  //According to an anonymous source, this needs to be done once and a while because of corrupt 
  //characters appearing on the screen. We have confirmed this. The reset is very fast, you can 
  //shorten the delays a bit, but you will have to play around to see what works for you.
  digitalWrite(x6, HIGH);
  delay(2);
  digitalWrite(x6, LOW);  
  delay(10);
}

void vfdtest() {
  //This will kick off the VFD internal test. Basically just steps through all the characters 
  //built in to the display. 
  //Procedure is, hold x5 (VFD Display pin 25) low for 100ms during a reset. Reset does not start until x6 (VFD Display pin 20) is low again. 
  digitalWrite(x5,LOW); 
  digitalWrite(x6,HIGH); 
  delay(50); //This can be shorter, but best results showed this was good.
  digitalWrite(x6,LOW);
  delay(100); //NO TOUCHY!
  delay(15000); //This counter is running while the test sequence is running. Make this longer if you like, the display will keep looping the test until you restart
  digitalWrite(x6, HIGH);
  delay(10);
  digitalWrite(x6, LOW);
  digitalWrite(x5, HIGH);  
}

void loop() {
    scrollDelay = 1;
    vfdreset();    
    delay(200);
    writeCharacter(20u);
    delay(200);
    writeCharacter(18); //Turn off Scroll Mode
    writeCharacter('P');
    writeCharacter('l');
    writeCharacter('e');
    writeCharacter('a');
    writeCharacter('s');
    writeCharacter('e');
    writeCharacter(' ');
    writeCharacter('l');
    writeCharacter('i');
    writeCharacter('f');
    writeCharacter('t');
    writeCharacter(' ');
    writeCharacter('r');
    writeCharacter('e');
    writeCharacter('c');
    writeCharacter('e');
    writeCharacter('i');
    writeCharacter('v');
    writeCharacter('e');
    writeCharacter('r');
    writeCharacter(13);
    writeCharacter(21); //Turn on scroll mode
    for (int i = 0;i < 200; i++) { //This will prevent the re-write of line one and excesive screen resets.
      scrollDelay =150; //Slow down the scroll speed.
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter('H');
      writeCharacter('e');
      writeCharacter('l');
      writeCharacter('l');
      writeCharacter('o');
      writeCharacter(' ');
      writeCharacter('W');
      writeCharacter('o');
      writeCharacter('r');
      writeCharacter('l');
      writeCharacter('d');
      writeCharacter(',');
      writeCharacter(' ');
      writeCharacter('H');
      writeCharacter('o');
      writeCharacter('p');
      writeCharacter('e');
      writeCharacter(' ');
      writeCharacter('y');
      writeCharacter('o');
      writeCharacter('u');
      writeCharacter(' ');
      writeCharacter('e');
      writeCharacter('n');
      writeCharacter('j');
      writeCharacter('o');
      writeCharacter('y');
      writeCharacter(' ');
      writeCharacter('t');
      writeCharacter('h');
      writeCharacter('i');
      writeCharacter('s');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter('P');
      writeCharacter('u');
      writeCharacter('t');
      writeCharacter(' ');
      writeCharacter('a');
      writeCharacter(' ');
      writeCharacter('l');
      writeCharacter('o');
      writeCharacter('o');
      writeCharacter('n');
      writeCharacter('i');
      writeCharacter('e');
      writeCharacter(' ');
      writeCharacter('i');
      writeCharacter('n');
      writeCharacter(' ');
      writeCharacter('t');
      writeCharacter('h');
      writeCharacter('e');
      writeCharacter(' ');
      writeCharacter('s');
      writeCharacter('l');
      writeCharacter('o');
      writeCharacter('t');
      writeCharacter(' ');
      writeCharacter('f');
      writeCharacter('o');
      writeCharacter('r');
      writeCharacter(' ');
      writeCharacter('t');
      writeCharacter('h');
      writeCharacter('e');
      writeCharacter(' ');
      writeCharacter('d');
      writeCharacter('a');
      writeCharacter('n');
      writeCharacter('c');
      writeCharacter('i');
      writeCharacter('n');
      writeCharacter('g');
      writeCharacter(' ');
      writeCharacter('g');
      writeCharacter('i');
      writeCharacter('r');
      writeCharacter('l');
      writeCharacter('s');
      writeCharacter('.');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      writeCharacter(' ');
      delay(5000);
  }
}

void writeCharacter(byte v) {
  digitalWrite(x1, LOW); //Prepare to write
  digitalWrite(d0, bitRead(v,7));
  digitalWrite(d1, bitRead(v,6));
  digitalWrite(d2, bitRead(v,5));
  digitalWrite(d3, bitRead(v,4));
  digitalWrite(d4, bitRead(v,3));
  digitalWrite(d5, bitRead(v,2));
  digitalWrite(d6, bitRead(v,1));
  digitalWrite(d7, bitRead(v,0));
  digitalWrite(x1, HIGH); //Write Complete
  delay(scrollDelay); 

}


Ċ
Jim Akeson,
Sep 23, 2016, 9:57 AM
Comments