The weather here in the UK has been pretty miserable this weekend, and rather than cycle about in it, I decided to stay in and tackle a project I’ve been meaning to get on with for a while; getting to grips with using graphic LCD displays. So this Saturday has been spent looking at how to get the very nicely featured arduino-t6963c library to do the business with this nice 240×128 graphic LCD you can see below, drawing text, bitmaps, graphic functions and even animations!

 

Graphic LCD in less-than-elegant casing...

 

To start off with, this is a panel manufactured by a company called FORDATA. Basic specs are:

  • 240 pixels wide, 128 pixels tall
  • Panel is blue, with active pixels appearing white (Negative Transmissive polarization) (white back-light)
  • LED Back-light, just feed 5V DC, on-board current limiting resistor.
  • Built in negative voltage source for contrast driving (more on this later).

and the golden bit:

  • Controller Type: T6963C

Before this project, the only displays I had ever driven were simple 16×2 character displays. There is a lot of stuff out there on the web showing how to get up and running with these displays, a lot more than there is on graphic LCDs! This is probably in part due to the fact that there are far fewer configurations of character displays, where as there are 101 varieties of graphic LCD that I’ve seen so far.

That being said, it is really only mildly more complex to get up and running with one of these panels, and really worth the effort if you are going for a project that requires user interaction!

Fired up and displaying a test pattern! It looks a lot nicer in person, the plastic adds something of a diffuser effect on camera, it's not as drastic in person.

So let’s look at the setup used here:

Hardware

Firstly, you’ll need an Arduino-compatible board. (for reference, I’m using a hand-built ATMEGA 328 board and Arduino 1.0 on OSX).

Hand-built Arduino board, ATMEGA328, 16MHz @ 5V

 

Hardware Connections

Display Pin Name Arduino Pin (168/328) Arduino Pin (MEGA) Notes
1 Vee N/C N/C Negative Voltage Source
2 Vss 0V / GND 0V / GND
3 Vdd +5V +5V
4 V0 N/C N/C Contrast Drive
5 /WR A0 37
6 /RD A1 36
7 /CE A2 35
8 C/D A3 34
9 /RST /RESET /RESET Reset Pin Tied to Arduino
10 D0 D2 49
11 D1 D3 48
12 D2 D4 47
13 D3 D5 46
14 D4 D6 45
15 D5 D7 44
16 D6 D8 43
17 D7 D9 42
18 FS N/C N/C Font Select
19 LED+ +5V +5V LED back-light Anode
20 LED- 0V / GND 0V / GND LED back-light Cathode

The setup eats pretty much all the available I/O on a 28 pin 168/328, but it does leave the hardware SPI and I2C interfaces free, so it’s not such a big deal thankfully. (Next step I’m going on to will involve the addition of a SPI radio module, allowing the screen to be used as a remote info display for my PC.)

 

Software

Take a visit to the Google Code repository for the t6963c library, and grab the file “T6963_Lib.zip” and if you’ve got access to a Windows machine, you can have some fun with animations later if you grab “bmp2c.zip” also. I’ve not yet got round to playing with the font creation utility listed there, but I plan to in another post.

Extract the t6963 library folder into your Arduino library collection, but before launching the IDE, open the files T6963.h & T6963.cpp with a notepad utility. Look for the line [#include "WProgram.h] in each file, and replace it with [#include "Arduino.h"]. This will stop some compile errors caused when the library looks for an old pre-Arduino1.0 pin definition file.

Within the library folder for the t6963, there is an example folder. The contained sketch for 240 x 128 compiled and ran first time on the target board, resulting in the 2nd photo seen in this post.

Custom Fonts

Also available from the Google Code repository is a nice little utility called GLCD Test-Env. This utility allows you to take fonts installed on your windows system, and convert them into the required C files needed for the library to use with the LCD.glcd_print1_P() and LCD.glcd_print2_P() functions.

GLCD Font Tool Example

Animations

I need to get a good deal of screenshots from my Windows machine to demonstrate this, but long story short is that you use your image editor of choice (I use the online pixlr editor) to generate a multi-layer animation, resolution should be a 1:1 pixel mapping of your display. Then bounce each layer down to a monochrome bitmap using mspaint (or other, Pixlr doesn’t have this option unfortunately!), and process each slice using bmp2c, and stitch the .c output of each slice into a larger .c file, and edit the accompanying .h file to reflect the additional slices.

Soon I’ll do a quick how-to for animations, but for now, here’s a quick video of a logo/boot-screen type thing. This took about an hour, learning along the way, I’m sure it could be made a lot faster with some clever scripting?