Interfacing LCD with 8051 using Keil C – AT89C51

Interfacing LCD with 8051 using Keil C – AT89C51

Liquid Crystal Display (LCD) is very commonly used electronic display module and having a wide range of applications such as calculators, laptops, mobile phones etc. 16×2 character lcd display is very basic module which is commonly used in electronics devices and projects. It can display 2 lines of 16 characters. Each character is displayed using 5×7 or 5×10 pixel matrix.

16x2 Character LCD

16×2 Character LCD

Interfacing 16×2 LCD with 8051 using Keil C is bit complex because there is no powerful libraries in Keil C. To solve this problem we have developed a LCD library which includes commonly used features, you just need to include our header file and use it. You can download the header file at the bottom of this article.

LCD can be interfaced with microcontroller in 4 Bit or 8 Bit mode. These differs in how data is send to LCD. In 8 bit mode to write a character, 8 bit ASCII data is send through the data lines D0 – D7 and data strobe is given through E of the LCD. LCD commands which are also 8 bit are written to LCD in similar way.

But 4 Bit Mode uses only 4 data lines D4 – D7. In this mode 8 bit character ASCII data and command data are divided into two parts and send sequentially through data lines. The idea of 4 bit communication is used save pins of microcontroller. 4 bit communication is a bit slower than 8 bit communication but this speed difference can be neglected since LCDs are slow speed devices. Thus 4 bit mode data transfer is most commonly used.


Library Functions in lcd.h

Lcd8_Init() & Lcd4_Init() : These function will initialize the LCD module which is connnected to pins defined by following bit addressable variables.

For 8 Bit Mode:

//LCD Module Connections
sbit RS = P0^0;
sbit EN = P0^1;
sbit D0 = P2^0;
sbit D1 = P2^1;
sbit D2 = P2^2;
sbit D3 = P2^3;
sbit D4 = P2^4;
sbit D5 = P2^5;
sbit D6 = P2^6;
sbit D7 = P2^7;
//End LCD Module Connections

For 4 Bit Mode :

//LCD Module Connections
sbit RS = P0^0;
sbit EN = P0^1;
sbit D4 = P2^4;
sbit D5 = P2^5;
sbit D6 = P2^6;
sbit D7 = P2^7;
//End LCD Module Connections

These connections must be defined for the proper working of the LCD library.



Lcd8_Clear() & Lcd4_Clear() : These functions will clear the LCD screen when interfaced with 8051 in 8 bit and 4 bit mode respectively.

Lcd8_Set_Cursor() & Lcd4_Set_Cursor() : These functions are used to set the cursor position on the lcd screen. By using this function we can change the position of character and string displayed by the following functions.

Lcd8_Write_Char() & Lcd4_Write_Char() : These functions are used to write a character to the LCD screen.

Lcd8_Write_String() & Lcd8_Write_String() : These functions are used to write a string or text to the LCD screen.



Lcd8_Shift_Left() & Lcd4_Shift_Left() : These functions are used to shift display left without changing the data in display RAM.

Lcd8_Shift_Right() & Lcd8_Shift_Right() : These functions are used to shift display right without changing the data in display RAM.

8 Bit Mode LCD Interfacing

Circuit Diagram

LCD Interfacing with 8051 using Keil C - 8 Bit Mode Circuit Diagram

LCD Interfacing with 8051 using Keil C – 8 Bit Mode Circuit Diagram

Keil C Code

#include<reg52.h> //including sfr registers for ports of the controller
#include<lcd.h> // Can be download from bottom of this article

//LCD Module Connections
sbit RS = P0^0;
sbit EN = P0^1;
sbit D0 = P2^0;
sbit D1 = P2^1;
sbit D2 = P2^2;
sbit D3 = P2^3;
sbit D4 = P2^4;
sbit D5 = P2^5;
sbit D6 = P2^6;
sbit D7 = P2^7;
//End LCD Module Connections
void Delay(int a)
{
  int j;
  int i;
  for(i=0;i<a;i++)
  {
    for(j=0;j<100;j++)
    {
    }
  }
}
void main()
{
  int i;
  Lcd8_Init();
  while(1)
  {
    Lcd8_Set_Cursor(1,1);
    Lcd8_Write_String("electroSome LCD Hello World");
    for(i=0;i<15;i++)
    {
      Delay(1000);
      Lcd8_Shift_Left();
    }
    for(i=0;i<15;i++)
    {
      Delay(1000);
      Lcd8_Shift_Right();
    }
    Lcd8_Clear();
    Lcd8_Write_Char('e');
    Lcd8_Write_Char('S');
    Delay(3000);
  }
}

4 Bit Mode LCD Interfacing

Circuit Diagram

LCD Interfacing with 8051 using Keil C 4 Bit Mode - Circuit Diagram

LCD Interfacing with 8051 using Keil C 4 Bit Mode – Circuit Diagram

Keil C Code

#include<reg52.h> //including sfr registers for ports of the controller
#include<lcd.h> //Can be download from bottom of this article

//LCD Module Connections
sbit RS = P0^0;
sbit EN = P0^1;
sbit D4 = P2^4;
sbit D5 = P2^5;
sbit D6 = P2^6;
sbit D7 = P2^7;
//End LCD Module Connections
void Delay(int a)
{
  int j;
  int i;
  for(i=0;i<a;i++)
  {
    for(j=0;j<100;j++)
    {
    }
  }
}
void main()
{
  int i;
  Lcd4_Init();
  while(1)
  {
    Lcd4_Set_Cursor(1,1);
    Lcd4_Write_String("electroSome LCD Hello World");
    for(i=0;i<15;i++)
    {
      Delay(1000);
      Lcd4_Shift_Left();
    }
    for(i=0;i<15;i++)
    {
      Delay(1000);
      Lcd4_Shift_Right();
    }
    Lcd4_Clear();
    Lcd4_Set_Cursor(2,1);
    Lcd4_Write_Char('e');
    Lcd4_Write_Char('S');
    Delay(2000);
  }
}

How to use the Header File ?

Copy and Paste the header file lcd.h to your project folder. Then add lcd.h to your source group.

1. Right Click on Source Group

2. Click on “Add Files to ‘Group Source Group 1’

3. Select lcd.h and Click Add

Optimize Code for more Efficiency

You already seen that by using our header file lcd.h you can connect LCD to any of the output pins of the microcontroller. For this more coding is required in the header file which makes the generated hex file less efficient and large in size. You can solve this problem by making some changes in the header file according to your hardware connections. For eg : in the above sample programs I have used port P2 for sending data and command. Just replace the functions Lcd4_Port(data) and Lcd8_Port(data) with P2 = data.

Download Here

You can download header file, keil c files, proteus files etc here…

Share this post

Leave a Reply

130 Comments on "Interfacing LCD with 8051 using Keil C – AT89C51"

avatar
  Subscribe  
newest oldest most voted
Notify of
alpesh
Guest

i can’t find header file? lcd.h

Ligo George
Guest

You can download entire project file from the above download link. .it includes lcd.h header file..

santosh
Guest

Unable to download that header file..please check

Ligo George
Guest

Extract the above zif file.. Header file is in the Header File folder..

Avong P Ayuba
Guest

teach me process of creating different libraries

Ligo George
Guest

It is not that much easy as your question. You require hardware knowledge and should write functions as required. Save these functions in a header file. Then you can include that header file.. when you require that functions…

bkash
Guest

i have made a cirutial arrangement to displya message using keil …the code runs properly in proteus and the message is also diplayed well..but when i tried the same connection in hardware…nothing is showin up …only the black box are apperaing in the lcd..plz do help me with this matter..

Ligo George
Guest

Try adjusting the contrast of the LCD.
Make sure that the microcontroller program is running fine by blinking a LED.
Make sure that all pins are properly connected to LCD..

Kiran
Guest

sir, i have one doubt. in the fallowing code what is the value of ‘a’. I mean which is not assign to any value.

void Delay(int a)
if this ‘a’ is an accumulator, what is the value?

Thanks in advance.

Ligo George
Guest

in the function definition void Delay(int a), a is an argument of the function Delay(). Which means when we call the function delay, eg: Delay(1000), the argument a will be equal to 1000, a = 1000

Parth Bhatt
Guest

I am unable to compile your program in uvision 4…. showing 6 warnings… please help.. unable to open the header file also.. shows an error for that….

Ligo George
Guest

Warnings will not stop your program from compiling..
What is the error?
Try the program files in the above zif file (download)…

Pragadeesan Shankar
Guest

i need explanation for every commands….if u can,pls mail me the algorithm for the 8 bit version…
[email protected]

Ligo George
Guest

We will explain it in detail in coming articles… Read the datasheet of LCD controller HD44780 used with this LCD Module..

Pragadeesan Shankar
Guest

following warnings r der…although i added lcd.c

Build target ‘Target 1’

compiling lcdsom.c…

lcdsom.c(2): warning C318: can’t open file ‘lcd.h’

lcdsom.c(30): warning C206: ‘Lcd8_Init’: missing function-prototype

lcdsom.c(33): warning C206: ‘Lcd8_Set_Cursor’: missing function-prototype

lcdsom.c(33): error C267: ‘Lcd8_Set_Cursor’: requires ANSI-style prototype

Target not created

Pragadeesan Shankar
Guest

is der any video for adding header file??

Ligo George
Guest

Copy the header file ‘lcd.h’ to your project directory and add the header file to your source group..

. Right Click on Source Group

2. Click on “Add Files to ‘Group Source Group 1′

3. Select lcd.h and Click Add

Rakesh Menon
Guest

can you please tell me how can we read a character from lcd screen ]

Rakesh Menon
Guest

how can we make display the value of a variable here?
can we use ansi c command “%d”?????

liyaquath
Guest

sir i cant undustand the function in lcd program that #define lcd p0
pls help me giving enough infomation

Ligo George
Guest

Where is #define lcd p0?????
Can you please elaborate?

Ligo George
Guest

Convert the variable to corresponding ASCII character… then simply display it…

Ligo George
Guest

Why do you want to read data from LCD screen???
There is an option in the LCD controller to read it… by using R/W pin of LCD….

Rakesh Menon
Guest

to make a simple calculator , first user inputs digits along with operators in this format:
12*13
i want to read those operands and operators from screen and assign it to 3 variables, then proceed my calculation,…. is there any possibility??

Rakesh Menon
Guest

i’m planning the same also by using pointers..

Rakesh Menon
Guest

my code is like this,if the user presses ‘=’ key,then
void equalto()
{
if (variable2== operator) //*conditions will be written for all operators in nested if *//
{

variable4=variable1(/*here comes any operator/*variable2)variable3;
lcd8_write_char(value of variable4);
}}
the above fn will be called.
.. now how can i get the value of variable4 printed on lcd screen…
hope you are not confused and you got my logic..

Rakesh Menon
Guest

for example my code is like this,if the user presses ‘=’ key,then
void equalto()
{
if (variable2== operator) //*conditions will be written for all operators in nested if *//
{

variable4=variable1(/*here comes any operator/*variable2)variable3;
lcd8_write_char(value of variable4);
}}
the above fn will be called.
.. now how can i get the value of variable4 printed on lcd screen…
hope you are not confused and you got my logic..

Ligo George
Guest

Then you don’t need to read data from lcd… We can do it simply by storing that values in some variables.. before writing to LCD…

Rakesh Menon
Guest

i tried that way tooo but i can’t get the way to print value of the character variable to which answer is assigned.. what can i do?

Ligo George
Guest

When you assign a character to a variable.. you will get its ASCII value.. ….. to get its actual value of the digit you should convert it by subtracting 48.. try this link

http://www.asciitable.com/

jafer
Guest

where is header file

Ligo George
Guest

Header file is present in the above download..

Kishore
Guest

I too hav the same problem now bkash. Help me, if you found solution to yours. And Ligo, there is no electrical problem. Its something else. But can’t find it. Please do help me,

Ligo George
Guest

Try adjusting the contrast of the LCD using the preset… also check the connections of Enable and R/W pins of LCD..

Ligo George
Guest

Try adjusting the contrast of the LCD using the preset… also check the connections of Enable and R/W pins of LCD..,,,

anshu
Guest

i want to run a program of lcd interfacing with 8051 and display the reading of the meter in our lcd.
how to do so?

Ligo George
Guest

Just use the above header file………

Rama Pulagam
Guest

sir,
can you please suggest me what actual value we have to take to provide 1 hour delay for the stepper motor

Ligo George
Guest

You can use a series of delays….

shishay Hiweta
Guest

very Interesting.

Bimal Karki
Guest

how to download lcd.h header file??

Guest
Guest

whwre is the download link for downloading lcd.h headrefile??? i couldn’t find..

Ligo George
Guest

Use the above download link..

Ligo George
Guest

There is a download link at the end of the article above…

Keith Formosa
Guest

Hi my program is working in keil but when I run the circuit simulation the circuit stays blank !

Ligo George
Guest

It is working fine for me..

Aadesh Shah
Guest

Hey I want to display a variable value on LCD.. I am using 4 bit pattern.. I have the variable g (integer type) and I want to display the value of g on LCD as in

Lcd4_Write_Char(‘value of g’); Please help!!

abhy
Guest

what is meant by these warnings

Build target ‘Target 1’

warning l1;unresolved external symbol

symbol:?c_startup

module: start.obj(?c_startup)

warning l2; reference made to unresolved external

symbol:?c_startup

module: start.obj(?c_startup)

address;080AH

chothani amit
Guest

Hi my program is working in keil but when I run the circuit simulation LCD stays blank.
what would be the problem?

Nana Nananananana
Guest

your life is meaningless