Interfacing LCD with 8051 using Keil C – AT89C51

16x2 Character LCD

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

  • alpesh

    i can’t find header file? lcd.h

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

  • santosh

    Unable to download that header file..please check

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

  • Avong P Ayuba

    teach me process of creating different libraries

  • 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

    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..

  • 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

    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.

  • 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

    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….

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

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

  • Pragadeesan Shankar

    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

    is der any video for adding header file??

  • 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

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

  • Rakesh Menon

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

  • liyaquath

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

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

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

  • 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

    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

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

  • Rakesh Menon

    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

    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..

  • 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

    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?

  • 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

    where is header file

  • Header file is present in the above download..

  • Kishore

    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,

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

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

  • anshu

    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?

  • Just use the above header file………

  • Rama Pulagam

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

  • You can use a series of delays….

  • shishay Hiweta

    very Interesting.

  • Bimal Karki

    how to download lcd.h header file??

  • Guest

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

  • Use the above download link..

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

  • Keith Formosa

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

  • It is working fine for me..

  • Aadesh Shah

    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

    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

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

  • Nana Nananananana

    your life is meaningless

  • Nana Nananananana

    your life is worthless

  • Nana Nananananana

    die

  • Nana Nananananana

    Die

  • Nana Nananananana

    dIe

  • Nana Nananananana

    diE

  • Nana Nananananana

    kill yourself

  • Nana Nananananana

    Kill yourself

  • Nana Nananananana

    kill Yourself

  • Nana Nananananana

    kill yourself!

  • Nana Nananananana

    die!

  • Nana Nananananana

    die? YES!

  • Nana Nananananana

    suicide? WHY NOT!

  • krish

    compiling lcd.c…

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

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

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

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

    lcd.c – 1 Error(s), 3 Warning(s).

  • Ria P Oswal

    May i know how many addressable unit are there in the above LCD panel? and what are they??? Please let me know soon..

  • Saad Mahmood

    I compile the code but it doesnt work in the simulation. The lcd doesnt display anything. Please help

  • Ragool Delcien

    can i get d complete details about d ports used in tis?

  • Look at the header file lcd.h

  • paramesh

    sir i have doubt in
    void Lcd8_Write_String(char *a)

    {
    int i;

    for(i=0;a[i]!=”;i++)

    Lcd8_Write_Char(a[i]);
    }

    in what is the stored in *a?
    what is the stored in a?

  • a is the string to be displayed
    eg : Lcd8_Write_String(“Paramesh”);

  • Yash

    Sir
    I want lcd.c file in which all the functions have been defined so that i can look how functions work.

  • shiva

    Which software is this sir?

  • Download an try my file..

  • It is Proteus ISIS

  • Rupa

    hi i tried the same code which is present in the downloaded zip file .
    I have simulated the given circuit but when i run the simulation nothing is being displayed on the LCD .
    Please help me .
    thanks

  • Hello,
    The Proteus simulation for both 4 bit and 8 bit are working fine for me..

  • Rupa

    Yes , rite … i was able have it display as well . thanks . Can i please get the latest version of proteus 8.1 or 2 .

  • Sorry, we aren’t providing any software. You can buy it from Labcenter Electronics.

  • Deepak

    How to print variables?

  • convert variables to character and print it.

  • Deepak

    Ya I did that and it worked 🙂 Thanks 🙂

  • Saravann

    I really don know how to solve it. Plz help me

  • Saravann

    I really don know how to solve it. Plz help me

  • Copy the file lcd.h to your project folder and add it to Source File Group.

  • Sid Sahay

    I have been trying my best to make an LCD unit, which I’m using as part of an MCU 8051 IDE project.

    Still not able to get it to work. There is always some error or the other. It will sometimes say syntax error for tokens such as “=”, and when I change the header files and some settings, it gives me an error that file .cdb was not found.

    This is very distressing as I have literally tried almost every combination of header files, sdcc versions, and what not.

  • Please give me more details about the error..

  • Ali Waqas

    it doesnt work beacause p0 is open drain , use pull up resistors ! watch how to use P0 on google

  • pranay

    How do I print value of any variable that I have us in my program. .?

  • Just convert it to string and print it…
    You can convert a single digit number to character by adding 48;
    ‘1’ = 1 + 48
    ‘2’ = 2 + 48

  • uttam

    this code is not work

  • pranay

    Thanks

  • It is 100% working..

  • chetan sonkusale

    please tell me how to scroll string on lcd?

  • It is already shown in above example.. using left and right shift functions..

  • Rahul Acharya

    Hi, I am working on this project (Temperature Indicator using AT89C52) currently and I couldn’t find a 16×1 LCD. So got a 16×2 LCD display. Is there any workaround to get this project working using the 16×2 LCD ?

    And what hardware will be required to interface the LCD with the microcontroller(AT89C52) ?

    Much Thanks in advance!

  • Er Nitin Ahuja

    the string is not displaying in 2nd row of LCD in 4 bit mode please check it sir..

  • Hi, I corrected the header file. Please download again and check.

  • Prateek Sharma

    Do right click on micro controller, where the last option is add/remove source file. Select the hex file of your code. Make sure that in your program you use port P2 for output and connect your remaining lines of lcd (ie D0-D7) to respective ports in lcd.

  • Er Nitin Ahuja

    thanks sir,,,for your support…

  • nikita barnawal

    Lcd8_set_cursor.. missing function prototype.. how could i get rid of it?

  • Include the file lcd.h to your project.

  • kavin

    sir i wish to to see the c coding for lcd header file.

  • rajat ahuja

    how can i display an integer on LCD in 4 bit mode whose value is changing if i press a switch

  • You can open the lcd.h header file for that.

  • Try using sprintf()

  • sagar

    I compile the code but it doesnt work in the simulation. The lcd doesnt display anything. Please help

  • Kannan Ank

    #include
    sbit rs=P1^0;
    sbit rw=P1^1;
    sbit en=P1^2;

    void lcd_cmd(unsigned char a);
    void lcd_data(unsigned char b);
    void lcd_ini();
    void delaye();
    void delay();

    void main()
    {
    char d[]=”abcdefghijklmanopqrstuvwxyz”,i;
    lcd_ini();
    for(i=0;d[i]!=”;i++)
    lcd_data(d[i]);
    }

    void lcd_ini()
    {
    lcd_cmd(0x38);
    lcd_cmd(0x06);
    lcd_cmd(0x0F);
    }
    void lcd_cmd(unsigned char a)
    {
    rs=0;
    rw=0;
    en=1;
    P2=a;
    delaye();
    en=0;
    }
    void lcd_data(unsigned char b)
    {
    rs=1;
    rw=0;
    en=1;
    P2=b;
    delay();
    en=0;
    }
    void delaye()
    {
    {
    char c;
    for(c=1;c<=1;c++)
    {
    TMOD=0x02;
    TH0=0xB8;
    TL0=0x63;
    TR0=1;
    while(!TF0);
    TR0=0;
    TF0=0;
    }
    }

    } void delay() //1 second delay
    {
    {

    char c;
    for(c=1;c<=20;c++)
    {
    TMOD=0x02; //50 ms 50*20=1000ms=1 second
    TH0=0X4B;
    TL0=0xFF;
    TR0=1;
    while(!TF0);
    TR0=0;
    TF0=0;
    }
    }
    }

  • Kannan Ank

    please guys any one help me to get 1 second delay
    in this program .i cont able to find error

  • Kannan Ank

    any please help me to get 1 second delay

  • It will work. Please post more details.

  • Try adjusting it practically or calculate the cycles required.

  • Manvir Kaur

    i m facing the same problem.. please help me out.. whats the solution?

  • Just try downloading and simulating our example files.

  • Rajat Kapoor

    hi am tring to interface the lcd with 8051 microcontoller. it is showing garbage value can someone please help??

  • wajid khan

    nnnn.c(34): error C267: ‘Lcd8_Write_String’: requires ANSI-style prototype
    Target not created.
    Build Time Elapsed: 00:00:00

  • wajid khan

    it does,nt work..plz help??

  • Make sure the the LCD connections are correct.

  • Ravi Tiwari

    can you tell me the program for lcd interfacing to display full name on lcd using pointer?

  • Akshay Kummari

    hi sir how can I fix this error

  • Sorry, can you please elaborate ?

  • C function names are case sensitive.

  • Cris Tingcang

    Hi Sir,

    Everytime I build and compile my program in keil, warning C206 always pops up and says:

    LCD.C(37): warning C206: ‘Lcd8_init’: missing function-prototype

    the Lcd8_init is properly declared and defined in your header file “lcd.h” and yet this warning is displayed. What might be the solution for this?

    By the way sir, thanks for the examples. I learned a lot from you. The program is working properly both in simulation and hardware.

    Thanks,

    Cris

  • try adding prototype in your program.

  • Usama

    connect a resistor array with lcd connection thanku