Graphic Liquid Crystal Display (Part 1)

This series of posts will explore GLCD (Graphic Liquid Crystal Display). For demonstration purpose, I will use a standard GLCD 128×64, driven by Samsung KS KS0108B controllers:

And here is its pinout

Pin Diagram
Symbol 	Level 	Function 
Vss 	0V 	Ground 
Vdd 	+5V 	Power supply for logic 
Vo 	- 	Operating voltage for LCD (contrast adjusting) 
RS 	H/L 	Register selection H: Display data L: Instruction code 
R/W 	H/L 	Read/Write selection H: Read operation, L: Write Operation 
E 	H,H->L 	Enable Signal.Read data when E is high,Write data at the falling edge of E 
DB0 	H/L 	Data bit 0  
DB1 	H/L 	Data bit 1 
DB2 	H/L 	Data bit 2 
DB3 	H/L 	Data bit 3 
DB4 	H/L 	Data bit 4 
DB5 	H/L 	Data bit 5 
DB6 	H/L 	Data bit 6 
DB7 	H/L 	Data bit 7 
CS1 	H 	Select the right half of display if CS1 = H
CS2 	H 	Select the left half of display if CS2 = H
/RST 	L 	Reset signal, active low 
Vout 	-10V 	Output voltage for LCD driving  
LEDA 	+5V 	Power supply for LED back light 
LEDB 	0V 	GND for LED back light

Memory map

The 128×64 graphic lcd is divided into two 64X64 pixel display area. Each KS0108B driver controls a 64 column by 64 row array of pixels. The 64×64 pixel arrays are further split into 8 pages. Each page is made of 64 lines of 1 byte. Each byte is made of 8 bits, with the least significant bit at the top and the most significant bit bit is at the bottom column position.

LCD Addressing

Four types of data read/write are available. Read or write display data (in other words pixel related data), read of GLCD status (e.g. Busy) or write an instruction (e.g. addresses of pages, lines, columns).

Before getting into more details, let’s investigate the principle of operations through pseudo code examples.

Write an instruction

SELECT_CHIP
SET_READ-WRITE_PIN LOW
SET_DATA-INSTRUCTION_PIN LOW
SET_DATA_BITS HIGH/LOW
SET_ENABLE_PIN HIGH
SET_ENABLE_PIN LOW

Really so easy? Not really. A straight translation of this pseudo code in real code would not work… at all. The reason being that each step requires some time to execute. And these timing questions lead to the trickiest programming issues. Yoy will have to carefully read the specification from your vendor’s specification in order to set appropriate delays. These delays are pretty short but mandatory. Here is the same code as above complemented with the appropriate timing:

SELECT_CHIP
SET_READ-WRITE_PIN LOW
SET_DATA-INSTRUCTION_PIN LOW
SET_DATA_BITS HIGH/LOW
Timer(Address_Setup)
SET_ENABLE_PIN HIGH
Timer(High_Level_Width)
SET_ENABLE_PIN LOW
Timer(Data_Hold)

In the same way, reading an instruction could be written this way

SELECT_CHIP
SET_READ-WRITE_PIN HIGH
SET_DATA-INSTRUCTION_PIN LOW
SET_ENABLE_PIN HIGH
GET_DATA_BITS 
SET_ENABLE_PIN LOW

Adding the timing events leads to

SELECT_CHIP
SET_READ-WRITE_PIN HIGH
SET_DATA-INSTRUCTION_PIN LOW
Timer(Address_Setup)
SET_ENABLE_PIN HIGH
Timer(Data_Delay)
GET_DATA_BITS 
SET_ENABLE_PIN LOW

Write Data

Writing data does not require much difference. Just replace

SET_DATA-INSTRUCTION_PIN LOW

By

SET_DATA-INSTRUCTION_PIN HIGH

Read Data

There is a major difference in the read data procedure compared to the read instruction procedure. KS0108 passes data out through a pipe operation which requires TWO read cycle to get access to the data! (Again, not applicable to reading instructions). The dummy read may be included in the data read routine in order to optimize its execution time.

SELECT_CHIP
SET_READ-WRITE_PIN HIGH
SET_DATA-INSTRUCTION_PIN LOW
SET_ENABLE_PIN HIGH
SET_ENABLE_PIN LOW
SET_ENABLE_PIN HIGH
GET_DATA_BITS 
SET_ENABLE_PIN LOW

Once again appropriate timing should be applied as well as conditional execution of the dummy ENABLE_PIN strobe.

The nice thing about KS0108 drivers is that setting parameters is quite easy. Next is the table which will allow you to read or write every thing from/to your GLCD

One of the simplest example of use is the programming of the WAIT_WHILE_NOT_READY function. When the KS0108 is busy doing something and thus not ready to respond to external requests, it raises a busy flag that can be read at any time.

SELECT_CHIP
SET_READ-WRITE_PIN HIGH
SET_DATA-INSTRUCTION_PIN LOW
SET_ENABLE_PIN HIGH
DO
  DATA = GET_DATA_BITS
WHILE (BUSY_BIT HIGH IN DATA) 
SET_ENABLE_PIN LOW

To be continued…

Leave a Reply

You must be logged in to post a comment.