Introduction: Using Older Noritake Itron VFD Modules

About: - everything for the maker and electronics enthusiast, with free delivery worldwide

Now and again you come across interesting parts on ebay, from friends or just rooting around in second-hand stores. One example of this was a huge Noritake Itron 40 x 2 character vacuum-fluorescent display from 1994 (or earlier) which was passed on from a client.

Originally it looked quite complex, however after spending some time the data sheets were found and it was discovered to have a simple serial interface – and with a little work we’ve got it working, so read on if you’re interested in classic VFDs or have a similar unit.

Step 1:

The serial interface baud rate is determined by the jumper pads on the PCB.

Step 2:

So comparing the table above against the jumpers on our module gives us a data speed of 19200 bps with no parity. Great – we can easily create such a connection with a microcontroller with a serial output and 5V logic levels; for our examples we’ll use an Arduino-compatible board.

Step 3:

Wiring up the VFD is simple – see the white jumpers labelled CN2 as shown previously. Pin 1 is 5V (you need an external supply that can offer up to 700 mA), pin 2 to Arduino digital pin 7, and pin 3 to Arduino and power supply GND.

We use Arduino D7 with software serial instead of TX so that the display doesn’t display garbage when a sketch is being uploaded. Then it’s a matter of simply sending text to the display, for example here’s a quick demonstration sketch:

// Working with Noritake Itron VFD modules - model CU40026SCPB-T20A
#include <softwareserial.h> SoftwareSerial VFD(6,7); // RX, TX

void setup() { VFD.begin(19200); }

void loop() { VFD.print("Hello, world. This is a Noritake VFD "); // You can blast out text do {} while (1); }

Step 4:

Which results with the following...

Step 5:

If you’re not keen on the colour or intensity of the display, try some Perspex over the top – for example...

Step 6: Controlling the Display

At this point you’ll need the data sheet data sheet. As you saw previously, writing text is very simple – just use .print functions. However you may want to send individual characters, as well as special commands to control aspects of the display. These are outlined in the data sheet – see the “Software Commands” and “Character Fonts” tables.

If you need to send single commands – for example “clear display” which is 0x0E, use a .write command, such as:

VFD.write(0x0E); // clear display

Some commands are in the format of escape codes (remember those?) so you need to send ESC then the following byte, for example to change the brightness to 50%:

VFD.write(0x1B); // ESC
VFD.write(0x4C); // brightness VFD.write(0x40); // 50% brightness

Armed with that knowledge and the data sheets you can now execute all the commands. According to the data sheet it is possible to change fonts however no matter what the hardware jumper or command we tried it wouldn’t budge from the Japanese katakana font. Your screen may vary. If you use the “screen priority write” function heed the data sheet with respect to the extended “busy” time by delaying subsequent writes to the display by a millisecond.

Step 7: Putting It All Together

Instead of explaining each and every possible command, I’ve put the common ones inside documented functions in the demonstration sketch below, which is followed by a quick video of the sketch in operation.

// Working with Noritake Itron VFD modules - model CU40026SCPB-T20A
// John Boxall 2013

#include <softwareserial.h> SoftwareSerial VFD(6,7); // rx, tx

void setup() { VFD.begin(19200); // set speed for software serial port resetVFD(); VFDclearsceen(); // VFD.write(0x12); // vertical scroll mode (on) }

void resetVFD() // performs a software reset on the VFD controller { VFD.write(0x1B); // ESC VFD.write(0x49); // software reset }

void VFDnewline() // moves cursor to start of next line { VFD.write(0x0D); // carriage return VFD.write(0x0A); // line feed }

void VFDclearsceen() // moves cursor to top-left and clears display { VFD.write(0x0E); // clear display VFD.write(0x0C); // form feed - cursor to top-left }

void VFDbrightness(int amount) // sets VFD brightness - 25/50/75/100% // uses ESC sequences { switch(amount) { case 25: VFD.write(0x1B); // ESC VFD.write(0x4C); // brightness VFD.print(0); // 25% brightness break; case 50: VFD.write(0x1B); // ESC VFD.write(0x4C); // brightness VFD.write(0x40); // 50% brightness break; case 75: VFD.write(0x1B); // ESC VFD.write(0x4C); // brightness VFD.write(0x80); // 75% brightness break; case 100: VFD.write(0x1B); // ESC VFD.write(0x4C); // brightness VFD.write(0xC0); // 100% brightness } }

void VFDchars() // run through characters for selected font { for (int i = 21 ; i < 256; i++) { VFD.write(0x16); // underline cursor off VFD.write(i); delay(100); } }

void moveCursor(byte position) // moves the cursor - top row is 0~39, bottom row is 40~79 // vertical scroll mode must be turned off if used { VFD.write(0x1B); // ESC VFD.write(0x48); // move cursor VFD.write(position); // location }

void loop() { VFD.write(0x16); // underline cursor off VFD.print("Hello, world - line one."); // You can blast out text delay(1000); VFDnewline(); VFD.print("Hello, world - line two."); delay(1000); VFDclearsceen(); VFDbrightness(25); VFD.print("*** 25% brightness ***"); delay(1000); VFDclearsceen(); VFDbrightness(50); VFD.print("*** 50% brightness ***"); delay(1000); VFDclearsceen(); VFDbrightness(75); VFD.print("*** 75% brightness ***"); delay(1000); VFDclearsceen(); VFDbrightness(100); VFD.print("*** 100% brightness ***"); delay(1000); VFDclearsceen();

VFDchars(); VFDclearsceen();

for (int i = 0; i < 80; i++) { VFD.write(0x16); // underline cursor off moveCursor(i); VFD.print("X"); delay(100); moveCursor(i); VFD.print(" "); } VFDclearsceen(); }

We hope you found this interesting and helpful.

This post is brought to you by – everything for makers and electronics enthusiasts, with free delivery worldwide.