LPC2148 – LCD 4 Bit Interfacing

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

Prerequisites

Before we will start i would suggest you to read these topics. Then only you can understand this strongly. If you already know, please go ahead.

LCD 4 bit interfacing with LPC2148

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 (sensors or etc). So we need to reduce the GPIO as possible. In that time we 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(0x0c);
    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 0 ’s 4 – 7 bits. Because that 4 bits are connected to LCD.

void cmd(unsigned char a)
{
    IO0PIN&=0xffffff03;
    IO0PIN|=(a & 0xf0) << 0;
    IO0CLR|=bit(2);              //rs=0
    IO0CLR|=bit(1);             //rw=0
    IO0SET|=bit(3);             //en=1
    lcd_delay();
    IO0CLR|=bit(3);             //en=0
    
    IO0PIN&=0xffffff03;
    IO0PIN|=((a << 4)  & 0xf0) << 0;
    IO0CLR|=bit(2);             //rs=0
    IO0CLR|=bit(1);             //rw=0
    IO0SET|=bit(3);             //en=1
    lcd_delay();
    IO0CLR|=bit(3);             //en=0
}

Sending Data

Same as sending command.

void dat(unsigned char b)
{
    IO0PIN&=0xffffff03;
    IO0PIN|=(b & 0xf0) << 0;
    IO0SET|=bit(2);         //rs=1
    IO0CLR|=bit(1);         //rw=0
    IO0SET|=bit(3);         //en=1
    lcd_delay();
    IO0CLR|=bit(3);         //en=0
    
    IO0PIN&=0xffffff03;
    IO0PIN|=((b << 4)  & 0xf0) << 0;
    IO0SET|=bit(2);         //rs=1
    IO0CLR|=bit(1);         //rw=0
    IO0SET|=bit(3);         //en=1
    lcd_delay();
    IO0CLR|=bit(3);         //en=0
}

 

Circuit Diagram

 

Code

#include<lpc214x.h>

#define bit(x) (1<<x)
 
void lcd_init();
void cmd(unsigned char a);
void dat(unsigned char b);
void show(unsigned char *s);
void lcd_delay();
 
#define delay for(i=0;i<55000;i++)
 
unsigned int range=0,i;
 
int main()
{
    VPBDIV=0x01;                 // PCLK = 60MHz
    IO0DIR=0x0FC;
    lcd_init();
    cmd(0x89);
    show("www.embetronicx.com");
 
    while(1) {
        cmd(0x18);
        delay;
    }
}

void lcd_init()
{
        cmd(0x02);
    cmd(0x28);
    cmd(0x0c);
    cmd(0x06);
    cmd(0x80);
}
 
void cmd(unsigned char a)
{
    IO0PIN&=0xffffff03;
    IO0PIN|=(a & 0xf0) << 0;
    IO0CLR|=bit(2);                //rs=0
    IO0CLR|=bit(1);                //rw=0
    IO0SET|=bit(3);                 //en=1
    lcd_delay();
    IO0CLR|=bit(3);                 //en=0
    
    IO0PIN&=0xffffff03;
    IO0PIN|=((a << 4)  & 0xf0) << 0;
    IO0CLR|=bit(2);                //rs=0
    IO0CLR|=bit(1);                //rw=0
    IO0SET|=bit(3);                 //en=1
    lcd_delay();
    IO0CLR|=bit(3);                 //en=0
}
 
void dat(unsigned char b)
{
    IO0PIN&=0xffffff03;
    IO0PIN|=(b & 0xf0) << 0;
    IO0SET|=bit(2);                //rs=1
    IO0CLR|=bit(1);                //rw=0
    IO0SET|=bit(3);            //en=1
    lcd_delay();
    IO0CLR|=bit(3);            //en=0
    
    IO0PIN&=0xffffff03;
    IO0PIN|=((b << 4)  & 0xf0) << 0;
    IO0SET|=bit(2);                //rs=1
    IO0CLR|=bit(1);                //rw=0
    IO0SET|=bit(3);            //en=1
    lcd_delay();
    IO0CLR|=bit(3);            //en=0
}
 
void show(unsigned char *s)
{
    while(*s) {
        dat(*s++);
    }
}
 
void lcd_delay()
    {
    unsigned int i;
    for(i=0;i<=1000;i++);
}

 

Output

[ Please find the output image Here ]

0 0 votes
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
Ads Blocker Image Powered by Code Help Pro
Ad Blocker Detected!!!

Dear User,

Thanks for visiting the site. Unfortunately, we have noticed that you are using an Ad Blocker extension in your browser.

We charge advertisers instead of the audience. We depend on Ad revenue to keep creating quality content for you. We guarantee clean ads. 

HERE IS HOW YOU CAN KEEP READING!

Click the AdBlock icon on your browser and click Enabled on this site to Disable AdBlock in embetronicx.com or whitelist our website.

If you still want to hide the ads, please become a Premium member. If you are a premium member already, then please log in.

Thank you for understanding.

If you are seeing this even after disabling all the ad blockers, Please report us the False Positive to [email protected]

Refresh