It’s 128×64 monochrome pixels, with a backlight, and can display graphics and ASCII text. It can also display Chinese, Japanese, Korean, characters using built-in fonts, but I didn’t investigate those facilities.
Using the built-in ASCII font, the text resolution is fairly low – four rows with sixteen characters per row. The graphics can be switched off, or displayed at the same time as text. Of course, you can just clear the text display for graphics only.
In parallel mode, the interface is a four or eight bit data bus, with three extra control I/O needed, so you need either seven or eleven GPIO lines from your microcontroller. The display can also be driven using two SPI lines, MOSI and SCLK (plus one chip select if you also connect other SPI devices). However, in SPI (serial interface) mode the display is write only – which makes graphics programming more difficult unless your microcontroller has plenty of spare RAM to hold a graphics buffer.
|LCD module pin number: name||Arduino pin|
|3: VO||N/C (no connection)|
|7 – 14: DB0 -DB7||D2 – D9|
|16: NC||N/C (no connection)|
|18: VOUT||N/C (no connection)|
|19: BLA||VCC via 470-ohm resistor *|
* Note that without the external, current-limiting resistor on the BLA (back light anode, positive supply to backlight) pin, my LCD module only had a 30-ohm resistor (R10) fitted onboard. So without the external limiting resistor, the backlight current would be excessively high. When using the LCD module with an STC microcontroller development board, where this pin is linked directly to the 5V VCC, I shall change the onboard R10 resistor to a higher value (470-ohm or 510-ohm).
The parallel mode allows the display’s RAM (graphic, character, and custom character) to be both written and read – which makes for relatively simple graphics programming, without tying up the microcontroller’s own RAM.
The module has enough RAM (both character display and graphics) to hold double the data that can actually be displayed at one time.
Scrolling the display is possible, but because of the strange layout of pixels, horizontal scrolling of ASCII text isn’t very useful. It’s probably designed for the larger Chinese characters (16 x 16 pixels) but with ASCII characters (8 x 16 pixels) row 0 of the display wraps onto row 2, and row 1 wraps onto row 3.
Vertical smooth scrolling is possible, but I chose to implement my ‘driver’ to give two separate screens: usually text and graphics are written to the not-currently-displayed half of the RAM, and then that can be switched into view. This allows double-buffered display for drawing graphics – when the display is blanked ready to draw the next ‘frame’ to the currently off-screen RAM buffer, so the user sees no display tearing or other artifacts during the redrawing process.
I wrote a sort of ‘driver’ in C – didn’t want to use C++ and put it in a normal Arduino library, because I plan to port the code to an STC microcontroller and use the Small Device C Compiler (SDCC) which is C only, not C++. For the Arduino just unzip the sketch as normal and when you open it in the IDE you’ll see two extra tabs – gd.h and gd.cpp, which hold the ‘driver’ (gd is short for ‘graphic driver)’. It’s worth looking at the .h one because it has some comments up near the top on how to make the connections. But you can ignore the code in the .h and .cpp files, and just concentrate on the relatively simple code in the usual .ino file if you want to make use of the ‘driver’ for your own purposes. There are only a handful of functions and all their names are prefixed with GD, so you won’t accidentally create functions with the same names in your own code. You can download the Arduino sketch using this link.
Here’s a link to download a copy of the driver datasheet https://ceptimus.co.uk/LCD12864BV2_0datasheet_driver.pdf