Where to start with this VFD that I have...

Hi all!

I just built my Arduino/Freeduino SB last night and am excited to get started. Everything is up and running so now I'm looking around for fun things to use for parts haha.

I found a VFD that I have. It's a surplus Noritake GU128x32-311 display. There's a datasheet here:


and more info on interfacing the board here:


I can solder (I put the arduino together afterall) and I've done parallel and serial connections. I've also programmed and am versed in a few languages.

So now onto my questions :). My problem is, I don't know where to start on this. Can I power the VFD from the arduino? Is there a template that I can follow to interface the VFD? I really just want to know how to power it up and how to interface the lines...then I can get started on programming some stuff :)

Any help or suggestions are greatly appreciated! Thanks a lot! -Joe

While not for your exact VFD, there is a lot of documentation available for this one available on ebay http://cgi.ebay.com/Epson-serial-VFD-Display-Arduino-LCD-Smartie_W0QQitemZ110448153207QQcmdZViewItemQQptZLH_DefaultDomain_0?hash=item19b7391277 the documentation is posted at http://whitej.googlepages.com/arduinoextras and includes a sample program for the Arduino. I think this will get you pointed in the right direction. Have fun with your new Arduino!

Hi EE,

Thanks a lot for the reply. This should give me some examples of what I need to do.

I noticed that the VFD referenced has some sort of i2c since it only needs 1 i/o from my understanding.

Has anyone integrated any other VFDs? I'm going to search the forum again...last time, I only remember seeing the Epson VFD.


I've used some old Futaba (character display) VFD's on a few Arduino projects.

According to your VFD's spec sheet, that display will draw 950 - 1300mA. Make sure your power supply can handle that.

If your display can do serial... check out the SoftwareSerial library: http://arduino.cc/en/Reference/SoftwareSerial

If you can use I2C... check out the Wire library: http://www.arduino.cc/en/Reference/Wire

Good luck!

Great, thanks for this updated information! I can now compare the two coding examples and see what's what.

What kind of "wall wart" or power supply did you use with the Futaba display?

Just wanted to update you guys on what’s going on. I got the VFD powered-up using an old computer power supply. It works really well for now until I figure out a more compact power supply for a final project.

I successfully shorted a “test” pin on the unit and it ran through some pages of display tests that looked really good.

I’ve been researching some interfacing with the board. All of the “controllers” are on the board attached to the VFD so I really just have to control text or graphics going to the display with the Arduino.

I’ve become confused. I figured out the output of the VFD and the input that would be needed to go to the parallel port of a computer to work with various LCD displays. The problem with all of these schematics and LCD programs is that they list pins or i/o that I don’t have.

I have these pins that I need to interface:
D0 - Pin 8
D1 - Pin 7
D2 - 6
D3 - 5
D4 - 4
D5 - 3
D6 - 2
D7 - 1
nWR - 9 (Write Signal (input))
nBL - 11 (Display Blanking Signal (input))
nCS - 19 (Chip Select Signal (input))
nRESET - 20
BUSY - X (not usually used)

Most LCDs use an Enable pin, W/R pin, Register pin and a contrast pin. I wanted to use the LiquidCrystal library because it sounds like most of it could be really useful for what I have but it doesn’t match up with these pins.

Does anyone have any advice on how to code something for this VFD? I know it’s possible and have seen some example of it working out there with an arduino but no code examples. Any help would be greatly appreciated! So far the help has been great and got me this far!

Thanks a lot, -Joe

PS - this Python code helped me out a lot for anyone else looking into this:

User mode device driver for Noritake GU128x32-311 Vacuum Fluorescent Display.

Copyright (c) 2006 spacemarmot@users.sourceforge.net

This file is released under the GNU Lesser General Public Licence.
See the file LICENSE for details.

    import os
    import fcntl
    import time
    # VFD   | PARPORT
    # WR    | /strobe pin 1
    # CS    | GND
    # RESET | +5V
    # BLANK | +5V
    # BUSY  | Busy    pin 11
    # D0-7  | pins 2-9
    USE_FCNTL = False
    import sys
    if sys.platform == 'linux2':
        #USE_FCNTL = False
        USE_FCNTL = True
    class GU311(object):
        def __init__(self, dev=0):
            if USE_FCNTL:
                self.fd = os.open('/dev/parport%d' % dev, os.O_RDWR)
                fcntl.ioctl(self.fd, 0x708F) # mark parport as exclusive
                fcntl.ioctl(self.fd, 0x708B) # claim the parport
                import parallel
                p = parallel.Parallel(dev)
                self.setWR    = p.setDataStrobe # pin 1
                self.getBUSY  = p.getInBusy     # pin 11
                self.setData  = p.setData       # pins 2-9
        def init(self):
        def enable(self, on=True):
        def selectFlickerless(self, on=True):
        def selectCharPage(self, page):
            assert page in [0,1]
        def sendData(self, data):

            if USE_FCNTL:            
                os.write(self.fd, data)
                for b in data:
                    while self.getBUSY(): pass
        def clear(self):
        def sendCommand(self, cmd):
            self.sendData('\x01\x4f%c' % cmd)
        def setBrightness(self, value):
            assert 0 <= value <= 100
            value = 100 - value
            self._brightness = value
            arg = 0x61 + (value*16/100)
        def characterWrite(self, str, col=0, row=0, mode='S'):
            addr = row*22 + col
            message  = '\x01C%c%c%c%s' % (addr, len(str), mode, str)
        def graphicWrite(self, image, address, mode='S'):
            imglen = len(image)
            arg = (address/256, address%256, imglen/256, imglen%256, mode, image)
            message  = '\x01H%c%c%c%c%c%s' % arg
except: print 'GU311 parallel not available'

def pong(d, mode='O', loop=1000000):
    import random
    bits = '\x01\x02\x04\x08\x10\x20\x40\x80'
    x = 0; y = 0
    dx = dy = 1
    for i in xrange(loop):
        if x < 0-dx: dx = random.randint(1,3)
        if x > 127-dx: dx = -2
        x = (x+dx)%128
        if y < 0-dy: dy = 1
        if y > 31-dy: dy = -1
        y = (y+dy)%32
        address = x*4 + y/8
        d.graphicWrite(bits[y%8], address, mode)
        d.graphicWrite(bits[y%8], address, mode='E')
if __name__ == '__main__':

    d = GU311(dev=2)
    d.characterWrite('Noritake', 7, 0)
    d.characterWrite('GU128x32-311', 5, 2)
    pong(d, mode='O')

looks like I have a similar VFD, (GU256x64), I found the data sheet which might be of some interest, http://www.aasi.net/development/datasheets/LCD_VFD/gu256x64_372.pdf I was wondering if any working code was created or found or if this just got pushed to the side. any help is much appreciated ~Trebu

nWR - 9 (Write Signal (input)) nBL - 11 (Display Blanking Signal (input)) nCS - 19 (Chip Select Signal (input)) nRESET - 20 BUSY - X (not usually used)

Most LCDs use an Enable pin, W/R pin, Register pin and a contrast pin. I wanted to use the LiquidCrystal library because it sounds like most of it could be really useful for what I have but it doesn't match up with these pins.

PROBABLY: ENABLE == nCS W/R == nWR Contast == not applicable for VFD nBL == not needed (power saving "display off" feature.)

Polarity of signals may or may not match an LCD...