4 bit interfacing of a 16X2 LCD display to PIC16F877A, Atmega16/32 & MSP430

LCD display

16×2 LCDs are most commonly used display units in microcontroller based projects. I got much information about LCD, LCD commands, LCD initialization etc from the below link and I hope, it will be very much helpful for beginners.

LCD display

http://www.dinceraydin.com/lcd/intro.htm
Below is my final working code for 4 bit mode LCD with PIC16F877A: (HI-TECH C)

#include<pic.h>
#define _XTAL_FREQ 20e6
__CONFIG(0x3F3A);
#define RS RB2
#define EN RB1
#define databits PORTD
/*----------------PIC INITIALIZATION------------*/
void pic_init()
{
    TRISB2 = 0;
    TRISB1 = 0;
    TRISD = 0;
}

/*-------------LCD FUNCTIONS BEGIN--------------*/
void LCD_STROBE(void)
{
    EN = 1;
    __delay_us(1);
    EN = 0;
}

void data(unsigned char c)
{
    RS = 1;
    __delay_us(50);
    databits = (c >> 4);
    LCD_STROBE();
    databits = (c);
    LCD_STROBE();
}

void cmd(unsigned char c)
{
    RS = 0;
    __delay_us(50);
    databits = (c >> 4);
    LCD_STROBE();
    databits = (c);
    LCD_STROBE();
}

void clear(void)
{
    cmd(0x01);
    __delay_ms(2);
}

void lcd_init()
{
    __delay_ms(15);
    cmd(0x38);
    __delay_ms(1);
    cmd(0x38);
    __delay_us(100);
    cmd(0x38);
    cmd(0x28);            // Function set (4-bit interface, 2 lines, 5*7Pixels)
    cmd(0x28);            // Function set (4-bit interface, 2 lines, 5*7Pixels)
    cmd(0x0c);            // Make cursorinvisible
    clear();            // Clear screen
    cmd(0x6);            // Set entry Mode(auto increment of cursor)
}

void string(const char *q)
{
    while (*q) {
        data(*q++);
    }
}

/*-------------LCD END--------------------*/

main()
{
    __delay_ms(50);
    pic_init();
    lcd_init();
    TRISC = 0;
    while (1) {
        cmd(0x80);
        string("HELLO WORLD");
        cmd(0xc0);
        string("IT IS WORKING:-)");
        
    }
}

Leave a Comment

Your email address will not be published. Required fields are marked *