Getting an arduino nano to talk to an old Vacuum Flourescent Display

Hello all,

Im trying to get my arduino talking to a VFD display module from the 80s. Fortunately I have found the datasheet here:

But unfortunately the communications protocol is all parallel instead of serial and its a little clunky. So far I have powered up the module and it draws the amount of current that is detailed in the data sheet. I also tested the supply voltages on the microchips on the back of the module and everything looks fine. I have not been able to test that the display in fact lights up, so it's possible that I am in fact communicating correctly with the module but that the tube itself is no longer working.

Anyways my code is below. Im working with an Arduino Nano.

int D7 = 5;
int D6 = 6;
int D5 = 7;
int D4 = 8;
int D3 = 9;
int D2 = 10;
int D1 = 11;
int D0 = 12;

int WR = 26;
int CD = 25;
int RD = 24;
int CS = 23;
int BL = 22;
int FRP = 19;

void setup() {
  // initialize digital pins as an output.
  
  pinMode(LED_BUILTIN, OUTPUT);
  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(WR, OUTPUT);
  pinMode(CD, OUTPUT);
  pinMode(RD, OUTPUT);
  pinMode(CS, OUTPUT);
  pinMode(BL, OUTPUT);

  pinMode(FRP, INPUT);
  
}

void loop() {

  VFD_setup_char_mode();    //send commands to VFD for correct display mode

  VFD_print_test();              //send commands to print an exclamation point at position 0,0

  digitalWrite(LED_BUILTIN, HIGH);  //led high lets us know that the code has completed
}

void VFD_setup_char_mode() {

//set display to receive commands
      digitalWrite ( CS, LOW );
      digitalWrite ( WR, HIGH );
      digitalWrite ( RD, HIGH );
      digitalWrite ( CD, HIGH );
      digitalWrite ( BL, HIGH );

      delay(1);   //way too much delay just in case

//send command to select screen 2
      digitalWrite ( D0, LOW );
      digitalWrite ( D1, HIGH );
      digitalWrite ( D2, LOW );
      digitalWrite ( D3, LOW );
      digitalWrite ( D4, LOW );

      delay(1);

//enter command
      digitalWrite ( WR, LOW );
      digitalWrite ( WR, HIGH );

//set screen 2 as character mode
      digitalWrite ( D0, LOW );
      digitalWrite ( D1, HIGH );
      digitalWrite ( D2, HIGH );
      digitalWrite ( D3, LOW );
      digitalWrite ( D4, LOW );

      delay(1);

      //enter command
      digitalWrite ( WR, LOW );
      digitalWrite ( WR, HIGH );

//set cursor to automatically increment
      digitalWrite ( D0, LOW );
      digitalWrite ( D1, LOW );
      digitalWrite ( D2, HIGH );
      digitalWrite ( D3, LOW );
      digitalWrite ( D4, LOW );

      delay(1);

      //enter command
      digitalWrite ( WR, LOW );
      digitalWrite ( WR, HIGH );

      
 }


void VFD_print_test() {

//setup for a command
      digitalWrite ( WR, HIGH );
      digitalWrite ( RD, HIGH );
      digitalWrite ( CD, HIGH );

      delay(1);

//write to cursor lower address
      digitalWrite ( D0, LOW );
      digitalWrite ( D1, HIGH );
      digitalWrite ( D2, HIGH );
      digitalWrite ( D3, HIGH );
      digitalWrite ( D4, LOW );

      delay(1);

//enter command
      digitalWrite ( WR, LOW );
      digitalWrite ( WR, HIGH );
      digitalWrite ( CD, LOW ); //setup for reading data

      delay(1);

//start at cursor position 0
      digitalWrite ( D0, LOW );
      digitalWrite ( D1, LOW );
      digitalWrite ( D2, LOW );
      digitalWrite ( D3, LOW );
      digitalWrite ( D4, LOW );
      digitalWrite ( D5, LOW );
      digitalWrite ( D6, LOW );
      digitalWrite ( D7, LOW );

      delay(1);

//enter data
      digitalWrite ( WR, LOW );
      digitalWrite ( WR, HIGH );
      digitalWrite ( CD, HIGH ); //setup for command

      delay(1);

//write to cursor higher address
      digitalWrite ( D0, HIGH );
      digitalWrite ( D1, HIGH );
      digitalWrite ( D2, HIGH );
      digitalWrite ( D3, HIGH );
      digitalWrite ( D4, LOW );

      delay(1);

//enter command
      digitalWrite ( WR, LOW );
      digitalWrite ( WR, HIGH );
      digitalWrite ( CD, LOW ); //setup for reading data

      delay(1);

//start at cursor position 0
      digitalWrite ( D0, LOW );
      digitalWrite ( D1, LOW );
      digitalWrite ( D2, LOW );
      digitalWrite ( D3, LOW );
      digitalWrite ( D4, LOW );
      digitalWrite ( D5, LOW );
      digitalWrite ( D6, LOW );
      digitalWrite ( D7, LOW );

      delay(1);

//enter data
      digitalWrite ( WR, LOW );
      digitalWrite ( WR, HIGH );
      digitalWrite ( CD, HIGH ); //setup for command

      delay(1);

//write data read command

      digitalWrite ( D0, LOW );
      digitalWrite ( D1, LOW );
      digitalWrite ( D2, LOW );
      digitalWrite ( D3, HIGH );
      digitalWrite ( D4, LOW );

      delay(1);

//enter command
      digitalWrite ( WR, LOW );
      digitalWrite ( WR, HIGH );
      digitalWrite ( CD, LOW ); //setup for reading data

      delay(1);

      digitalWrite ( WR, LOW );

      delay(1);

//write a byte "!"

      digitalWrite ( D0, HIGH );
      digitalWrite ( D1, LOW );
      digitalWrite ( D2, LOW );
      digitalWrite ( D3, LOW );
      digitalWrite ( D4, LOW );
      digitalWrite ( D5, HIGH );
      digitalWrite ( D6, LOW );
      digitalWrite ( D7, LOW );

      delay(1);

      digitalWrite ( WR, HIGH );    
      
}

Going down the likely suspects of what might be going wrong, I am pretty much positive that I have the wiring done correctly as I am familiar with analog circuits, less so with coding.

I set up the on board LED to light up when it has finished sending the commands to light up a test character and this usually happens about a second after power up.

I put a delay of 1ms between just about every write command because this device has no baud rate but the timing table shows that it needs time between commands. Not sure how quickly an arduino nano updates its digital pins so I tried to be on the safe side.

Chip select had virtually nothing in the entire datasheet about it except when it shows up in a truth table/ writing instructions towards the bottom of the datasheet but since it is inverted I assumed that keeping this pin low would do the trick.

There is no clock so commands are executed after a transition of the WR pin from low to high. It's hard to tell exactly when write is supposed to go low during a command so I have tried it in a couple different places with no luck. I will most likely be focusing on this area when I tackle this project again tomorrow, maybe adding some delay between WR being low and then transitioning high or having WR go low before I set the command bits. I also tried toggling the CS pin with the write pin as shown in the "read command" timing diagram but with no luck.

Does anyone see anything else that I might have missed? I don't tackle this kind of project very often so I'm not quite sure how to debug my problem beyond this point.

Thank you!