2-Wire LCD Interface For The PICMicro

Download as pdf or txt
Download as pdf or txt
You are on page 1of 4

2-Wire PIC LCD Interface by Myke Predko Page 1 of 4

Build your own "2 -Wire LCD Interface" using the PIC16C84 microcontroller

A Special "Thanks" to Myke Predko for submitting the following project/article.

About the Author

Myke Predko is the author of "Programming and Customizing the PIC Microcontroller ", the "Handbook of
Microcontrollers" and "Programming and Customizing the 8051 Microcontroller" as well as the soon to
be released "PC PhD" and "PC Interfacing Pocketbook" which are all published by McGraw-Hill.

As well as writing books on electronics and programming, Myke works for Celestica, Inc. in the area of
New Products Test Engineering. His wife, Patience, and he have three children, Joel, Elliot and Marya.
You can contact Myke by E-mail at: [email protected] or visit his web site at: http://www.myke.com/

2-Wire LCD Interface for the PICMicro

Alphanumeric LCD displays have become very popular for microcontroller applications because they
can add a lot to a project in a variety of different ways. A text message giving the user instructions as
well as feedback can make the application seem much more "professional" and easy to use. I like to use
LCD's to help debug applications, with breakpoints set to display variable and I/O conditions and they
are a lot cheaper than using a microcontroller emulator. To top it off, surplus LCD's can be found for a
dollar or less.

The most popular LCD interface is the Hitachi 44780 based LCD controller chip which provides a fairly
easy to work with interface and low power consumption. The major drawback of the interface is the
perceived complexity of working with the interface. This perception has been promoted by the lack of
good (i.e. well translated) and accurate datasheets and web site information.

This has been largely mitigated by the availability of a new data sheet from Hitachi; (available at here
and user sites (such as my own at LCD Page with accurate information and example code that can be
downloaded.

Often the biggest stumbling block to using alphanumeric LCD displays is the number of pins required to
control them. For the Hitachi 44780, twelve pins are required from the microcontroller to interface to the
display for it to work in eight bit mode. For many smaller microcontrollers, twelve pins are not available
or will be better served in the application. To be fair, this can be reduced to six by using the 44780's
"Four Bit" mode, but this can still be more than acceptable for most applications.

A popular solution that only requires one pin from the microcontroller to the LCD is the use of "Serial
LCD Interfaces" (such as Wirz Electronics "SLI -OEM" - http://www.wirz.com/) which convert "NRZ" serial
data (either CMOS/TTL or RS-232 voltage levels) to the data and signals necessary for the Hitachi
44780 controllers.

Many of these products (such as the SLI -OEM) are excellent and can provide useful product interface
and debugging information. The only drawback to them is the need for properly timed NRZ serial data
which may be difficult or even impossible to guarantee in some applications.

In this case, different approaches have to be made. The most popular one is to use synchronous serial
data (requiring a "clock" and "data") pin to load a serial-in/parallel-out shift register with the data bits and
"R/S" pin information. The "E" Strobe Pin is driven directly by the microcontroller to latch in the data from
the LCD. This is shown in the diagram below:

file://D:\PGD\2-Wire%20PIC%20LCD%20Interface%20by%20Myke%20Predko.htm 8/5/2003
2-Wire PIC LCD Interface by Myke Predko Page 2 of 4

The project presented in this article is an enhancement of this circuit. By combining the shift register's
"Data Line" with the most significant bit of the shift register, the "E" Strobe can be implemented without
resorting to a separate line for the function. The 1 K resistor and diode act as an "AND" gate. A
schematic of the circuit is shown below.

The operation of the resistor/diode "AND" gate may not be immediately obvious. When the shift register
bit is low, the diode pulls the connection to the "E" pin low. When the shift register bit is high, the diode
will not cause any current flow from the connection at the "E" pin to the shift register. The resistor from
"Data" to the "E" pin is a current limiting resistor. When the shift register bit is low and the data bit is
high, then the current through the resistor will be limited to 5 mA (for a 5 Volt logic application). At the
"Data" side of the resistor, the voltage will still be high, even though the diode is pulling the "E" pin low.

When both the "Data" line and the shift register bit are high, the "E" pin will be high. The "AND" circuit
could be a TTL two input AND gate (such as a 7408), if you have an extra one available for your
application. When I originally created this circuit, I used the same two transistor and two resistor circuit
that I used for the 89C2051 emulator in "Programming and Customizing the 8051 Microcontroller". I saw
this "AND" equivalent circuit in an old copy of "Electronics Now" and found that it worked well in this
application.

To load the shift register, it first has to be cleared to ensure that the "E" will not be strobed to the LCD
inadvertently. This is done by first shifting in six "0"s to make sure that while the correct data is being

file://D:\PGD\2-Wire%20PIC%20LCD%20Interface%20by%20Myke%20Predko.htm 8/5/2003
2-Wire PIC LCD Interface by Myke Predko Page 3 of 4

loaded into the shift register, no "high" voltage level is passed to the "E" pin of the LCD.

Once this is done, the data can be shifted in. The diagram below shows how the shift register is initially
cleared and then loaded with the data to be strobed (using "E") into the LCD:

The application code, "2wirelcd.asm " is an assembler source file written for the PIC16C84. The file is
written to be used with the "MPASM" assembler built into Microchip's "MPLAB". I wrote the code with the
idea that it should be easily portable to any low -end or mid-range PICMicro without modification.

For the two I/O pins ("Data" and "Clock"), I "defined" them to allow you to use virtually any pins in your
PICMicro application. I say "virtually any" because PORTA pin 4 (also known as "RA4") is of "open
drain" configuration and cannot source a positive voltage. The code itself is a very straightforward
example of writing a 4-bit LCD application which displays the string "Hello" on the LCD display. The
important difference between this code and a straight 4-bit LCD output is the "NybbleOut" subroutine,
which is called twice by each of the "SendCHAR" and "SendINS" subroutines (which send characters
and instructions, respectively, to the LCD).

"NybbleOut" first drops the "Data" line and then strobes the "Clock" bit six times to clear the shift
register. Next, a "1" is strobed in, followed by the "R/S" pin value, which is stored in the PICMicro's
"Carry" flag. I used Carry for this purpose because in this application I used RA0 and RA1 as the output
pins and to simplify the operation of the code, I shift PORTA with Carry loaded with the "Data" Pin
Value.

If this is not possible in your application, then "NybbleOut" should be changed to the following code. I
have marked changed lines with "####' in comments.

NybbleOut2 ; Send a Nybble to the LCD


movwf NOTemp ; Save the Nybble to Shift Out
swapf NOTemp ; Setup to Output to the High Part of the Byte
movlw 6 ; Clear the Shift Register
movwf Dlay

NO2Loop1
ClockStrobe
decfsz Dlay

file://D:\PGD\2-Wire%20PIC%20LCD%20Interface%20by%20Myke%20Predko.htm 8/5/2003
2-Wire PIC LCD Interface by Myke Predko Page 4 of 4

goto NO2Loop1
movlw 5 ; #### - Now, Shift out the Data with the "RS" Bit
movwf Dlay
bsf Data ; Put out the Gate Bit
ClockStrobe

NO2Loop2
bcf Data ; #### - Clear the Data Bit (which is the Clock)
btfsc STATUS, C ; #### - If the Bit to be output is a "1", Shift it Out
bsf Data
ClockStrobe
rlf NOTemp ; #### - Shift the Next Bit into the Carry Flag
decfsz Dlay
goto NO2Loop2

EStrobe ; Strobe out the LCD Data

return

The only point to notice with this code is that the "E" strobe will become active on the last bit if the least
significant data bit is high. This lack of "settling time" before "E" is active does violate the "true" 44780
specification, but I haven't found it to be a problem when I've built this circuit.

Good luck with building this circuit. If you have any problems, please send me an email and I'll see what
I can do to point out where the problem is. Click HERE to download the code for this project.

Myke

Copyright and Warranty Statement

This article is presented on an "AS IS" basis. I have tested the circuit and code that I have presented
here and I am confident that it works on the hardware that I have used. Different hardware may result in
different results.

If you have problems with the circuit or software, I would be happy to talk with you about it, but I cannot
guarantee that it will work for you under all circumstances. The text, drawings, circuit and software are
Copyright Myke Predko, 1999.

For technical support with this project please contact Myke Predko at: [email protected]

The information contained here cannot be reproduced without the author's permission.

Program the PIC in simple BASIC using the PicBasic Compiler. Visit:
http://www.rentron.com/PicBasic2.htm

file://D:\PGD\2-Wire%20PIC%20LCD%20Interface%20by%20Myke%20Predko.htm 8/5/2003

You might also like