PIC16F877A – LCD 4Bit Interfacing

In previous LCD tutorials we were used that LCD in 8 bit mode. But here we will see LCD 4 bit interfacing with PIC16F877A Microcontroller.

LCD 4 bit interfacing with PIC16F877A

Introduction

8 bit mode –  Using 8 data lines in LCD (totally 8 data lines are there)

4 bit mode –  Using only 4 data lines in LCD module

8 bit mode is already working and that is looks awesome. Then why we are going to 4 bit mode? This is the question comes in every mind whenever i said 4 bit mode. Yeah that 8 bit mode is nice. But but but… Just assume. I’m doing one project which requires more number of hardwares. But PIC16F877A have only 33 GPIOs. So in that time i can use this 4 bit mode and reduce the pin required for LCD module. Am i right? Great. That’s why 4 bit mode also important. Already we know the LED’s operation. If we want to enable 4 bit mode we have to do small modification in normal method. Let’s see that.

In initializing time we have to give 0x28 command. That’s all.

LCD Initializing

void lcd_init()
{
    cmd(0x02);
    cmd(0x28);
    cmd(0x0e);
    cmd(0x06);
    cmd(0x80);
}

Sending command

Here everything is same except way of data writing. Here we have only 4 bits. So we need to send nibble by nibble. So first we need to send first nibble then followed by second. See that code. I’m writing into the Port B’s last 4 bits. Because last 4 bits are connected into LCD.

void cmd(unsigned char a)
{
    rs=0; 
    PORTB&=0x0F;
    PORTB|=(a&0xf0);
    en=1;
    lcd_delay();
    en=0;
    lcd_delay();
    PORTB&=0x0f;
    PORTB|=(a<<4&0xf0);
    en=1;
    lcd_delay();
    en=0;
    lcd_delay();
}

Sending Data

Same as sending command.

void dat(unsigned char b)
{
    rs=1; 
    PORTB&=0x0F;
    PORTB|=(b&0xf0);
    en=1;
    lcd_delay();
    en=0;
    lcd_delay();
    PORTB&=0x0f;
    PORTB|=(b<<4&0xf0);
    en=1;
    lcd_delay();
    en=0;
    lcd_delay();
}

Circuit Diagram

Code

#include <pic.h>

__CONFIG( FOSC_HS & WDTE_OFF & PWRTE_OFF & CP_OFF & BOREN_ON & LVP_OFF & CPD_OFF & WRT_OFF & DEBUG_OFF);


#define rs RD2
#define en RD3

void lcd_init();
void cmd(unsigned char a);
void dat(unsigned char b);
void show(unsigned char *s);
void lcd_delay();

void main()
{
    unsigned int i;
    TRISB=TRISD2=TRISD3=0;
    lcd_init();
    cmd(0x90);
    show("www.EmbeTronicX.com");
    while(1)
    {
        for(i=0;i<15000;i++);
        cmd(0x18);
        for(i=0;i<15000;i++);
        
    }   
}

void lcd_init()
{
    cmd(0x02);
    cmd(0x28);
    cmd(0x0e);
    cmd(0x06);
    cmd(0x80);
}

void cmd(unsigned char a)
{
    rs=0; 
    PORTB&=0x0F;
    PORTB|=(a&0xf0);
    en=1;
    lcd_delay();
    en=0;
    lcd_delay();
    PORTB&=0x0f;
    PORTB|=(a<<4&0xf0);
    en=1;
    lcd_delay();
    en=0;
    lcd_delay();
}

void dat(unsigned char b)
{
    rs=1; 
    PORTB&=0x0F;
    PORTB|=(b&0xf0);
    en=1;
    lcd_delay();
    en=0;
    lcd_delay();
    PORTB&=0x0f;
    PORTB|=(b<<4&0xf0);
    en=1;
    lcd_delay();
    en=0;
    lcd_delay();
}

void show(unsigned char *s)
{
    while(*s) {
        dat(*s++);
    }
}

void lcd_delay()
{
    unsigned int lcd_delay;
    for(lcd_delay=0;lcd_delay<=1000;lcd_delay++);
}

Output

LCD 4 bit interfacing with PIC16F877A[ Please find the output image Here ]

Hope you learned something from this. You can download the whole project Here. If you have any doubt please ask us. See you in next tutorials.

0 0 vote
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x