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

  • Please I have been trying to add a delete function that deletes a character when initiated please help

  • lcd.h header file should be save in new text of same project.
    There will be two files in your project case Text1.c and lcd.h

  • you didnt initilalize the basic functions like void lcd_cmd() void lcd_data() void lcd_init() after calling each function with proper statement it will work

  • 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

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

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

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

  • #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;
    }
    }
    }

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

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

  • 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!

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

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

  • 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

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

  • 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?

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

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

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

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

  • 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

  • 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!!

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

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

  • 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?

  • 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,

  • 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?

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

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

  • 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??

  • 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

  • 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

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

  • 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

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

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

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

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


  • >