Digole 12864ZW is a 128Γ64 pixels graphic LCD that can be found at attractive prices and this is why it started appearing in projects across the web. It is based on ST7920 chip which is not so well known and to me it wasnβt the easiest to work with.β
The documentation for this display can be found here. You can find a couple of examples on how to use this display and some attempts on making a library and most of this information is for interfacing with arduino. For PIC interfacing i couldnβt find much info.
The module has a 20 pin connection, each described below. Vout i havent used and left it unconnected. For contrast you can use V0 (pin 3) by connecting it to Vdd through a 10k variable resistor. However to get it to work you will need to enable jumper J1 from the back of the module as in figure 1.
Pin # | Function |
1 | Vss |
2 | Vdd |
3 | V0 |
4 | RS |
5 | RW |
6 | EN |
7 | DB0 |
8 | DB1 |
9 | DB2 |
10 | DB3 |
11 | DB4 |
12 | DB5 |
13 | DB6 |
14 | DB7 |
15 | PSB |
16 | NC |
17 | RST |
18 | VOUT |
19 | BLA |
20 | BLK |
As per the datasheet the display can be used in many ways and this is a strong feature. I used it the traditional way 8 bits parallel. For this, PSB pin must be connected to Vdd, i also connected RST pin to Vdd as i will reset the display in software. The rest of the connections are the same as with any 16Γ2 alphanumeric displays.
Microchip XLCD library is a great starting point to using the Digole 12864ZW with a PIC microcontroller. I used Application MaestroΒ to set up the library. As mentioned we will use 8 bits interface in delay mode. Set the ports and pins and the rest doesnβt really matter.
Once done pressing Ctrl+G will generate the library files to be included in your project. You will need the XLCD.h, XLCD.c and XLCD.def. Now this Digole display can run in text mode with this library with major issues.To get to each line though you will need to go to specific addresses.
To use the LCD in graphic mode we will need to change the XLCDinit function in XLCD.c file.
void XLCDInit(void){_vXLCDreg=1;
XLCD_DATAPORT_TRISΒ = 0x00;Β
XLCD_DATAPORT = 0;
XLCD_RSPIN_TRIS =0;Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β
XLCD_ENPIN_TRIS =0;
XLCD_RWPIN_TRIS =0;
XLCD_RSPINΒ =0;Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β
XLCD_ENPINΒ =0;
XLCD_RWPIN=0;Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β
XLCDDelay15ms();Β
XLCD_DATAPORTΒ Β = 0b00110000;Β Β Β
XLCDDelay4ms();
XLCD_DATAPORTΒ Β = 0b00110000;Β Β Β
XLCDDelay4ms();Β
XLCDCommand(0x0C);Β
XLCDDelaylcd();Β Β
XLCDCommand(0x01);Β
XLCDDelay15ms(); Β
XLCDCommand(0x06);Β
XLCDDelaylcd();
XLCDCommand(0x34);Β
XLCDDelay15ms();Β Β Β
XLCDCommand(0x36);Β
XLCDDelay15ms();Β
_vXLCDreg=0;return;}
The other two functions we will use from the XLCD library are XLCDCommand and XLCDPut, which are used to pass a command to the display and a value respectively. Using these functions you donβt have to worry about controlling RS , RW and EN.
After calling the XLCDinit() function in main() you have now setup the display in graphic mode. To start drawing you need first 2 XLCDCommand instructions that set the pixel address and then 2 XLCDPut instructions to draw the pixels.
In figure 3 you can see the address map of Digole 12864ZW in the operating mode described above. It can be observed the horizontally you cannot address pixels individually but in groups of 16 and values you can write in groups of 8. The 1st byte represents the byte in the first XLCDPut instruction and the 2nd byte the value in the 2nd instruction. You cannot make 1 byte to start at the middle of the address location. We have 8 addresses of 16 pixels each horizontally 8Γ16=128 pixels and 64 lines =>128Γ64 resolution.
For more detail: Using Digole 12864ZW LCD with PIC18F