moving message display on LCD using 8051 microcontroller.

moving message on lcd

LCD use in many device to display message, like in printer, coffee machine, remote etc.There are a lot of type  LCD present in market, these are may be alphanumeric, graphical or any other type. Here I will discuss about the alphanumeric LCD.

Alphanumeric LCD comes in different size 8*1, 8*2, 16*1, 16*2 or 20*4 etc. These LCD only able to display characters, who have the ASCII value. Some alphanumeric LCD provide the facility to generate own custom characters.

In this article I will describe the steps to display moving message on 16*2 alphanumeric LCD, but before it I want to discuss about its pin configuration and connection.

Pin configuration of 16*2 alphanumeric LCD

lcd pins

Pin Description of Pin
1.VSS (Ground Pin).
2.VCC (+3.3 to +5V).
3.VEE (Use to adjust the contrast).
4.RS (Resistor select pin).

RS = 0; select command resistor.

RS = 1; select data resistor.

5.R/W (Read and Write Pin)

R/W = 0; write operation.

R/W = 1; Read operation.

6.E (clock enable pin).
7.D0  (I/O)
8.D1  (I/O)
9.D2  (I/O)
10.D3  (I/O)
11.D4  (I/O)
12.D5  (I/O)
13.D6  (I/O)
14.D7  (I/O)
15.Led  (+ve).
16.Led  (-ve).

Note: Interface of HD44780 supports two modes operation, 8 bit mode and 4 bit mode.In this article I will only discuss about the 8 bit mode.

Some useful commands for LCD

Command Description
0x01To clear LCD.
0x0eDisplay on and cursor blink.
0x0cDisplay on and cursor off.
0x388 bit mode and 2 line 5*8 matrix.
0x06Increment cursor (shift toward right)
0x04Decrement cursor (shift toward left)
0x80Cursor in beginning of first line.
0xc0Cursor in beginning of second line.

Steps to write display message on LCD

  • Initialize the LCD using the LCD initialization commands.
  • Set the address of DDRAM ,where you want to display the character.
  • Write the character on the data bus of LCD.
When we pass command or data on LCD then follow following steps.
  • If passing the command then make RS pin low (RS = 0) either for data make RS pin high (RS = 1).
  • Set Enable pin high (EN = 1).
  • Write the command or data on the data bus.
  • Set Enable pin low (EN = 0).

If you want to learn more about the c language, here 10 Free days (up to 200 minutes) C video course for you.

Your free trial is waiting

Source code to display moving message on 16×2 alphanumeric LCD.

moving message on lcd



7 comments

  1. Please can this code scroll more than 80 characters, up to 150 characters on the LCD, thanks in anticipation for a quick response

  2. void DisplayMessage(const char *pszMessage) //GLCD STRING WRITE FUNCTION.
    {
    //IOSET1 = RW;
    //IOCLR1 = RW;
    while(*pszMessage!=’\0′)

    {
    int column,page;
    for(page=0;page<8;page++) // PRINT 16 PAGE / PAGE OF EACH HALF OF DISPLAY.
    {
    IOSET1 = CS1;
    IOCLR1 = CS2;
    GLCD_Command(0x40); //set Y ADDRESS (COLUMN=0).
    GLCD_Command(0xB8+page);
    for (column=0;column<128;column++)
    {
    if (column==64)
    {
    IOCLR1 = CS1; // IF YES THEN CHANGE SEGMENT CONTROLLER.
    IOSET1 = CS2;
    GLCD_Command(0x40); // SET Y ADDRESS (COLUMN=0).
    GLCD_Command((0xB8+page));
    }
    GLCD_Data(*pszMessage++); // print 64 column on each page.

    }
    }
    }
    }

  3. above code is the main string msg display code. when i am using hex code instead of character then i am able to get the output . I thik that it is not converting my character to hex code , and the software i am using is the keil micro vision 5 . please do reply with the please brother . Thank you

  4. This is the complete code …..
    #include
    #include

    #define LCD_D0 (1<<24)
    #define LCD_D1 (1<<25)
    #define LCD_D2 (1<<26)
    #define LCD_D3 (1<<27)
    #define LCD_D4 (1<<28)
    #define LCD_D5 (1<<29)
    #define LCD_D6 (1<<30)
    #define LCD_D7 (1<<31)

    #define RS (1<<23)
    #define RW (1<<22)
    #define EN (1<<21)
    #define CS1 (1<<20)
    #define CS2 (1<<19)
    #define Total page 8

    void delay ();
    void DisplayMessage(const char *pszMessage);

    void GLCD_Command(int Command) //GLCD function.
    {
    IOCLR1= (LCD_D0|LCD_D1|LCD_D2|LCD_D3|LCD_D4|LCD_D5|LCD_D6|LCD_D7);
    Command = Command<<24;
    IOSET1= Command; // COPY COMMAND ON DATA PIN.
    IOCLR1 = RS; // Make RS low to select command register.
    IOCLR1 = RW; // Make RW low for right operation.
    IOSET1 = EN; // MAKE HIGH FOR TRANSMISSION ENABLE PIN.
    delay(10);
    IOCLR1 = EN;
    }

    void GLCD_Data(int Data) // GLCD DATA FUNCTION.
    {
    IOCLR1= (LCD_D0|LCD_D1|LCD_D2|LCD_D3|LCD_D4|LCD_D5|LCD_D6|LCD_D7);
    Data = Data<<24;
    IOSET1 = Data; // COPY DATA ON DATA PIN.
    IOSET1 = RS; // Make RS HIGH to select DATA register.
    IOCLR1 = RW; // Make RW low for right operation.
    IOSET1 = EN; // MAKE HIGH TO LOW FOR TRANSMISSION ENABLE PIN.
    delay(10);
    IOCLR1 = EN;
    }

    void GLCD_Init() // GLCD INITIALIZE FUNCTION
    {
    PINSEL2=0x00000000;
    IODIR1 = (LCD_D0|LCD_D1|LCD_D2|LCD_D3|LCD_D4|LCD_D5|LCD_D6|LCD_D7|RS|RW|EN|CS1|CS2);
    IOSET1 = (CS1|CS2); // SELECT BOTH LEFT AND RIGHT HALF OF DISPLAY.
    delay(10);
    GLCD_Command(0x3E); // DISPLAY OFF.
    GLCD_Command(0x40); // SET Y ADDRESS (COLOUM=0)
    GLCD_Command(0xB8); // SET X ADDRESS (PAGE=0)
    GLCD_Command(0xC0); // SET Z ADDRESS (START LINE=0)
    GLCD_Command(0x3F); // DISPLAY ON.
    }

    void GLCD_ClearAll() //GLCD ALL DISPLAY CLEAR FUNCTION
    {
    int column,page;
    for(page=0;page<8;page++) // PRINT 16 PAGE / PAGE OF EACH HALF OF DISPLAY.
    {
    IOSET1 = CS1;
    IOCLR1 = CS2;
    GLCD_Command(0x40); //set Y ADDRESS (COLUMN=0).
    GLCD_Command((0xB8+page));
    for (column=0;column<128;column++)
    {
    if (column == 64)
    {
    IOSET1 = CS1; // IF YES THEN CHANGE SEGMENT CONTROLLER.
    IOSET1 = CS2;
    GLCD_Command(0x40); // SET Y ADDRESS (COLUMN=0).
    GLCD_Command((0xB8+page));
    }
    GLCD_Data(0); // print 64 column on each page.
    }
    }
    }

    /*
    void DisplayMessage(const char *pszMessage)
    {
    IOSET1 = RW;
    IOCLR1 = RW;
    while(*pszMessage!='\0')
    {
    IOSET1 = EN;
    IODIR1 = *pszMessage;
    //GLCD_Data = *pszMessage;
    delay(10);
    IOCLR1 = EN;
    pszMessage++;
    }
    }
    */

    void DisplayMessage(const char *pszMessage) //GLCD STRING WRITE FUNCTION.
    {
    //IOSET1 = RW;
    //IOCLR1 = RW;
    while(*pszMessage!='\0')

    {
    int column,page;
    for(page=0;page<8;page++) // PRINT 16 PAGE / PAGE OF EACH HALF OF DISPLAY.
    {
    IOSET1 = CS1;
    IOCLR1 = CS2;
    GLCD_Command(0x40); //set Y ADDRESS (COLUMN=0).
    GLCD_Command(0xB8+page);
    for (column=0;column<128;column++)
    {
    if (column==64)
    {
    IOCLR1 = CS1; // IF YES THEN CHANGE SEGMENT CONTROLLER.
    IOSET1 = CS2;
    GLCD_Command(0x40); // SET Y ADDRESS (COLUMN=0).
    GLCD_Command((0xB8+page));
    }
    GLCD_Data(*pszMessage++); // print 64 column on each page.

    }
    }
    }
    }

    void delay (int k)
    {
    int a,b;
    for(a=0;a<=k;a++)
    for(b=0;b<500;b++);
    }

    int main()
    {
    GLCD_Init(); /*Lcd Initialize*/
    GLCD_ClearAll();
    short siLoop = 0;
    short siLen = 0;
    const char *pszDisplayMsg = "Welcome To Pragathi Solutions.";

    siLen = strlen(pszDisplayMsg); /*Calculate length of Message*/

    while(1) {

    GLCD_Command(0x8f); /*Address of DDRAM*/

    DisplayMessage(pszDisplayMsg);

    for(siLoop=0;siLoop < siLen;siLoop++) {

    GLCD_Command(0x40); // SET Y ADDRESS (COLOUM=0)
    GLCD_Command(0xB8); // SET X ADDRESS (PAGE=0)
    delay(25);

    }
    }
    }

Leave a Reply