Slide 1: The 2 Line LCD Display and its HD44780 Controller
The 2 Line LCD Display and its HD44780 Controller
Uli Raich
UCC semester 2017/2018
Slide 2: Why a simple 2 line display?
Often embedded systems do not have a screen, keyboard and mouse associated with them.
Small devices in the field may nevertheless need to display some values to the user
Small and cheap LCD displays can take over this task
Our display can be used for many purposes (see the open day):
- Name display
- Weather station
- Voltmeter
and there are many more applications
Slide 3: Our Display
Slide 4: Interfacing the display
Slide 5: The PCF8574 I2C interface
The PCF8574
I2C I/O expander allows to limit the number of connection wires to just four.
It is a kind of a shift register: serial in, parallel out
Slide 6: How to program the display
We need to know:
How to program the PCF8574
Understand the HD44780 display controller
Understand the interface between the two
Since the display can be used for many different purposes,
writing a library is the thing to do!
Slide 7: Interfacing signals
The display needs a large number of interface signals to be able to work:
|
|
Slide 8: A data byte to be sent
We will therefore need a great deal of bit fiddling
to create this data byte and to modify it to
- Set the back light on or off
- To send a pulse on the E (strobe) line
Hope you remember the
- bitwise or operator: |
- bitwise and operator: &
- bit inversion: ~
Slide 9: The I/O expander
As you can see from the block diagram, the central part of the device
is a shift register. It can actually do both:
- serial to parallel conversion (write)
- and parallel to serial conversion (read)
Slide 10: From the data sheet
This means that when reading, we will read back
what has been written before, if the signals are pure output signals.
Since the device will put all pins high with a low pull-up current,
external signals can easily pull the pins low
and thus you can read the state of these signals
Slide 11: Writing the to HD4780 controller via the PCF8574
Slide 12: Writing to PCF8574 via pigpio
Even though it looks complicated at first sight,
writing a data byte to the hd44780 controller via the
pcf8574 I/O extender is actually pretty simple:
After this instruction the 8 data bits of bVal lie at the input of the hd44780 controller.
Slide 13: The HD44780
The controller must generate the signals needed to driver the
LCD display and it must provide instructions to
- Reset the display
- Clear it
- Have cursor functions
- Enable/disable the cursor
- Move it, “Home” it ..
- Make it blink.
- Have character generators in ROM or
provide RAM memory to download character matrices (or both)
- Allow to send characters and convert the ASCII code to
dot matrices understood by the display
- Switch from one line to the next
Slide 14: HD44780 block diagram
Slide 15: The HD44780 library
As already explained several times, a library must supply:
- The binary code: libhd44780.so
- The include file hd44780.h
Slide 16: The function prototypes
Slide 17: Using the library
In addition to the prototypes, have a look at the
doxygen documentation
and you should be able to program the display.
Of course you have to include
-I/opt/ucc/include in your CFLAGS
-L/opt/ucc/lib in your LDFLAGS
and -lhd4780 in your LDLIBS
However, we want to understand what is happening behind the scene!
Slide 18: Testing access
Before starting to write the library we must first test if
- We can initialize the device ?
- We can write something to it and read it back ?
- Or can we find any other function showing us that the device responds?
Slide 19: Back light
To give us some confidence, let’s try to switch the back light on and off:
This one is easy as it does not access the hd44780.
It does test the PCF8574 though!
Switching bit 7 in the data word does the trick.
Later we will read a byte from the display and and/or bit seven
into the byte read before writing it back.
Slide 20: HD44780 registers
The HD44780 has a single register select pin (RS)
indicating that there must be writable 2 registers:
- IR: the instruction register
- DR: the data register
In addition the controller has a busy flag that can be read,
indicating that it performs an internal operation
and cannot take another command a this very moment.
Then there is an address counter which increments each time
the DR is written, thus pointing to the display data RAM (DDRAM)
location where the next character will be written.
Slide 21: The DDRAM
The
Display
Data
RAM stores data in 8 bit character codes.
It has a size of 80 characters which in our case corresponds
to 2 lines of 40 chars (of which only 2*16 will be used.
Slide 22: 2*16 character display
Slide 23: Converting the 8bit code to a dot matrix
The hd44780 contains a character ROM which will convert the
8 bit character code (mainly ascii code) to
- a 5*8 dot matrix with 208 predefined characters
(this is what we will use)
- a 5*10 dot matrix with 32 characters
There is also a Character Generator RAM where you can
create up to 8 5*8 dot matrices yourself
Slide 24: Character Generator
Slide 25: Dot matrix and the display
Slide 26: Interfacing to the MPU
The HD44780 can be controlled with 8 or with 4 data bits.
In 4 bit mode (this is what we use) with the higher 4 MPU bits
connected to d4-d7. The hd44780 data lines d0 – d3 are disabled
The lower four bits are used to drive
- RS (register select)
- RW (read / write)
- Strobe (E=enable)
- and back light
In this case the four highest significant data bits are sent first.
Slide 27: Instruction Summary
Slide 28: Instruction Summary (2)
Slide 29: Writing to the HD44780 in 4-bit mode
In order to write to the IR or DR of the HD44780 in 4-bit mode we must:
- Prepare an 8 bit value and put the highest significant
- 4 bits of the data to be written into its lower 4 bits
- Set the R/W bit to low
- Setup the RS bit (0 for IR, 1 for DR)
- Strobe the data into the controller
- Repeat the same thing for the lower significant
8 bits of the data we want to write
- Keep the BL bit constant
Slide 30: Strobe function
Slide 31: Writing a command and writing data
In my library I define 2 functions:
- hd44780WriteCmd (unsigned char cmd)
- hd44780PutC (char c)
As you would guess, the first command writes the IR register,
while the second one writes a single character to the DR
Of course these two calls use the strobe function explained before.
In these functions I hide all the details of the 4-bit interface
All subsequent functions will pass through these two basic functions.
Slide 32: hd44780WriteCmd
Slide 33: Timing diagrams 4 bit mode
Slide 34: The initialization procedure
Slide 35: Initialization Procedure (2)
Slide 36: Initialization procedure (code)
These are the instructions:
First we define the function set command
(0x20) with bit 4 set to zero (4 bit interface)
This is written as an 8 bit command (the lower 4 bits are not seen)
Now the controller switches to 4 bit format and
from now on we have to write twice for each
8 bit word sent to the controller.
We re-write the same command in 4 bit mode specifying
the font (5*8 dots) and the no of lines = 2 in addition
These bits were lost in the first (8 bit) transfer
--
Uli Raich - 2017-11-06
Comments