Wednesday, 3 December 2014

3 wire interface for 16x2 or 8x2 or any other HD44780 based LCDs.


When interfacing with Micro-controllers a LCD display could be a very useful tool either for debugging or displaying messages or to show result of a calculation or some other information.

In embedded World the most popular LCD is a 16x2 display i.e. 16 characters per line and 2 lines on the display. However there are other variants like 8x2 or 20x4 etc. These Displays are run by the very popular lcd controller Hitachi HD44780.



This display controller is the most widely used one and has lot of documentation available on the web. However while interfacing it with micro-controllers one problem arises very often. The scarcity of pins.

The HD44780 operates on a 8bit or 4bit wide bus and requires at-least 2 extra control pins(3 to be exact). So the minimum number of pins required to interface such a display is 6.

So to add a lcd to our micro-controller system we will have to sacrifice at-least 6 pins of our micro-controller. If we are using 40pin ICs like ATMEGA32 or 89C51/89S51 or 40 pin PIC then it is not much of a concern.




But if our chip has about 20 or less than that pins for IO? lets take Arduino UNO for example we have only 14 digital + 6 Analog/Digital pins. Reserving 6 pins for LCD is very tragic.

But what if we could reduce the number of pins required. This can be achieved by a very simple and effective digital logic chip : A Serial in Parallel out shift Register.

So by using a shift register either CD4094 or 74HC595 we can interface the Lcd with the help of only 3 pins.

A serial-in-parallel-out shift-register takes data-in using essentially one pin only(however another pin CLK is required to synchronise the transfer) and it has in general a 8 bit output(i.e. 8 output data pins).




So we send the data using only one pin of the micro-controller and then as usual the 4bit or 8bit data is given to the LCD controller by the Shift-register.

However another pin Strobe is required to enable or disable the output of data on the pins. Because if we keep continuously sending the data and data keeps travelling on the shift-register's output pins continuously then the lcd controller can get mad.

So what we do is we actually hold the outputs until the whole 8 bits are sent into the shift register. Then we release the output pins and data goes into the lcd controller.


But remember since we still need to control the RS(register select) and E(enable) pins of the LCD controller and that is also accomplished by the help of shift-register. 

So what i did was that i connected the RS and EN pins of the LCD to the shift-register output pins and sent the same data or control byte twice; once with EN set(1) and again the same data content and RS value but EN pin value cleared(0).

In this way the EN pin was provided with CLK.

Since i was using 4bit data bus so i had to send 4 nibbles while using Shift-register as opposed to the 2 nibbles when directly connected.

I have made a project to demonstrate this on AVR micro-controller you can get it here. This project also contains an arduino sketch with the same functionality. 

However i have also made a ready made library to to integrate it with your existing programs. Here is the link to the library. You just need to keep two files sipolcd.h and ds.h in the folder of your <main_program>.c file and and before including sipolcd.h  you need to define SIPO_PORT possible values are A,B,C,D or whatever ports your AVR has.

And then SPIN which is the DATA pin of Shift-register, STB i.e. strobe, and CLK is CLOCK.

Let me put an example here.

You can find other keywords in the keywords.txt file in the above mentioned library.

And finally here is the code in action.




We know that to be able to use the LCD with only 3 wires is cool but there are some people who have made it possible to use a lcd with Only 1 wire, That's right only 1 wire is enough. But it is a little tricky and you will have to go a little deeper with R-C time constants and frequencies etc. Here is the link to the Shift1_System.

So as usual guys if you have any suggestions or questions feel free to post a comment.
Unknown An Electronics and Tech Enthusiast

I am a Tech enthusiast who loves to build stuff like new gadgets and tinker around with electronic devices doing some DIY stuff, writing some code and in the process providing something back to the community.

No comments :

Post a Comment