Aim:
The main aim of this project is how to interface a 16X2 LCD to 8051 micro-controller.
The main aim of this project is how to interface a 16X2 LCD to 8051 micro-controller.
Description:
The most commonly used Character based LCDs are based on Hitachi’s
HD44780 controller or other which are compatible with HD44580. In this
tutorial, we will discuss about character based LCDs, their interfacing
with various microcontrollers, various interfaces (8-bit/4-bit),
programming, special stuff and tricks you can do with these simple
looking LCDs which can give a new look to your application.
We are already know about how LCD works and atmega8 micro-controller.
Here 8051 has 4 PORTS. The bellow steps are LCD programming using 8051
microcontroller.
Instruction Register (IR) and Data Register (DR)
There are two 8-bit registers in HD44780 controller Instruction and Data
register. Instruction register corresponds to the register where you
send commands to LCD e.g LCD shift command, LCD clear, LCD address etc.
and Data register is used for storing data which is to be displayed
on LCD. when send the enable signal of the LCD is
asserted, the data on the pins is latched in to the data register and
data is then moved automatically to the DDRAM and hence is displayed on
the LCD. Data Register is not only used for sending data to DDRAM but
also for CGRAM, the address where you want to send the data, is decided
by the instruction you send to LCD.We will discuss more
on LCD instuction set further in this tutorial.
Commands and Instruction set
Only the instruction register (IR) and the data register (DR) of
the LCD can be controlled by the MCU. Before starting the internal
operation of the LCD, control information is temporarily stored into
these registers to allow interfacing with various MCUs, which operate at
different speeds, or various peripheral control devices. The internal
operation
of the LCD is determined by signals sent from the MCU. These signals,
which include register selection signal (RS), read/write signal (R/W),
and the data bus (DB0 to DB7), make up the LCD instructions . There are
four categories of instructions that:
- Designate LCD functions, such as display format, data length, etc.
- Set internal RAM addresses
- Perform data transfer with internal RAM
- Perform miscellaneous functions
LCD Initialization
Before using the LCD for display purpose, LCD has to be initialized
either by the internal reset circuit or sending set of commands to
initialize the LCD. It is the user who has to decide whether an LCD has
to be initialized by instructions or by internal reset circuit. we will
dicuss both ways of initialization one by one.
Sending Commands to LCD
To send commands we simply need to select the command register.
Everything is same as we have done in the initialization routine. But we
will summarize the common steps and put them in a single subroutine.
Following are the steps:
- Move data to LCD port
- select command register
- select write operation
- send enable signal
- wait for LCD to process the command
Sending Data to LCD
To send data we simply need to select the data register. Everything is same asthe command routine. Following are the steps:
- Move data to LCD port
- select data register
- select write operation
- send enable signal
- wait for LCD to process the data
The most commonly used Character based LCDs are based on Hitachi’s
HD44780 controller or other which are compatible with HD44580. In this
tutorial, we will discuss about character based LCDs, their interfacing
with various microcontrollers, various interfaces (8-bit/4-bit),
programming, special stuff and tricks you can do with these simple
looking LCDs which can give a new look to your application.
We are already know about how LCD works and atmega8 micro-controller.
Here 8051 has 4 PORTS. The bellow steps are LCD programming using 8051
microcontroller.
Instruction Register (IR) and Data Register (DR)
There are two 8-bit registers in HD44780 controller Instruction and Data register. Instruction register corresponds to the register where you send commands to LCD e.g LCD shift command, LCD clear, LCD address etc. and Data register is used for storing data which is to be displayed on LCD. when send the enable signal of the LCD is
asserted, the data on the pins is latched in to the data register and data is then moved automatically to the DDRAM and hence is displayed on the LCD. Data Register is not only used for sending data to DDRAM but also for CGRAM, the address where you want to send the data, is decided by the instruction you send to LCD.We will discuss more on LCD instuction set further in this tutorial.
There are two 8-bit registers in HD44780 controller Instruction and Data register. Instruction register corresponds to the register where you send commands to LCD e.g LCD shift command, LCD clear, LCD address etc. and Data register is used for storing data which is to be displayed on LCD. when send the enable signal of the LCD is
asserted, the data on the pins is latched in to the data register and data is then moved automatically to the DDRAM and hence is displayed on the LCD. Data Register is not only used for sending data to DDRAM but also for CGRAM, the address where you want to send the data, is decided by the instruction you send to LCD.We will discuss more on LCD instuction set further in this tutorial.
Commands and Instruction set
Only the instruction register (IR) and the data register (DR) of the LCD can be controlled by the MCU. Before starting the internal operation of the LCD, control information is temporarily stored into these registers to allow interfacing with various MCUs, which operate at different speeds, or various peripheral control devices. The internal operation
of the LCD is determined by signals sent from the MCU. These signals, which include register selection signal (RS), read/write signal (R/W), and the data bus (DB0 to DB7), make up the LCD instructions . There are four categories of instructions that:
Only the instruction register (IR) and the data register (DR) of the LCD can be controlled by the MCU. Before starting the internal operation of the LCD, control information is temporarily stored into these registers to allow interfacing with various MCUs, which operate at different speeds, or various peripheral control devices. The internal operation
of the LCD is determined by signals sent from the MCU. These signals, which include register selection signal (RS), read/write signal (R/W), and the data bus (DB0 to DB7), make up the LCD instructions . There are four categories of instructions that:
- Designate LCD functions, such as display format, data length, etc.
- Set internal RAM addresses
- Perform data transfer with internal RAM
- Perform miscellaneous functions
LCD Initialization
Before using the LCD for display purpose, LCD has to be initialized either by the internal reset circuit or sending set of commands to initialize the LCD. It is the user who has to decide whether an LCD has to be initialized by instructions or by internal reset circuit. we will dicuss both ways of initialization one by one.
Before using the LCD for display purpose, LCD has to be initialized either by the internal reset circuit or sending set of commands to initialize the LCD. It is the user who has to decide whether an LCD has to be initialized by instructions or by internal reset circuit. we will dicuss both ways of initialization one by one.
Sending Commands to LCD
To send commands we simply need to select the command register. Everything is same as we have done in the initialization routine. But we will summarize the common steps and put them in a single subroutine. Following are the steps:
To send commands we simply need to select the command register. Everything is same as we have done in the initialization routine. But we will summarize the common steps and put them in a single subroutine. Following are the steps:
- Move data to LCD port
- select command register
- select write operation
- send enable signal
- wait for LCD to process the command
Sending Data to LCD
To send data we simply need to select the data register. Everything is same asthe command routine. Following are the steps:
To send data we simply need to select the data register. Everything is same asthe command routine. Following are the steps:
- Move data to LCD port
- select data register
- select write operation
- send enable signal
- wait for LCD to process the data
Block Diagram
Schematic
Code
// **************************************************
// Project: Scrolling string in LCD using 8051
// Author: Code Bloges
// Module description: Operate a LCD
// **************************************************
#include<reg51.h>
//Function declarations
void cct_init(void);
void delay(int);
void lcdinit(void);
void writecmd(int);
void writedata(char);
void ReturnHome(void);
//*******************
//Pin description
/*
P2 is data bus
P1.0 is RS
P1.1 is E
*/
//********************
// Defines Pins
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
// ***********************************************************
// Main program
//
void main(void)
{
unsigned char s[]="Hack Projects India ",i,j;
cct_init(); //Make all ports zero
lcdinit(); //Initilize LCD
ReturnHome(); //Return to 0 position
while(1)
{
writecmd(0x80); // Initial starting possion
i=0;
for(;s[i]!='\0';)
writedata(s[i++]); // Print the data up to null character
i=0;
j=s[0]; // Take the 1st character in j
for(;s[i]!='\0';i++)
s[i] = s[i+1]; // Shift the characters in array
s[i-1]=j; // Take the 1st character in last
s[i]='\0'; // Finally take null character
delay(500);
}
}
void cct_init(void)
{
P0 = 0x00; //not used
P1 = 0x00; //not used
P2 = 0x00; //used as data port
P3 = 0x00; //used for generating E and RS
}
void delay(int a)
{
int i;
for(i=0;i<a;i++); //null statement
}
void writedata(char t)
{
RS = 1; // => RS = 1
P2 = t; //Data transfer
E = 1; // => E = 1
delay(150);
E = 0; // => E = 0
delay(150);
}
void writecmd(int z)
{
RS = 0; // => RS = 0
P2 = z; //Data transfer
E = 1; // => E = 1
delay(150);
E = 0; // => E = 0
delay(150);
}
void lcdinit(void)
{
///////////// Reset process from datasheet /////////
delay(15000);
writecmd(0x30);
delay(4500);
writecmd(0x30);
delay(300);
writecmd(0x30);
delay(650);
/////////////////////////////////////////////////////
writecmd(0x38); //function set
writecmd(0x0c); //display on,cursor off,blink off
writecmd(0x01); //clear display
writecmd(0x06); //entry mode, set increment
}
void ReturnHome(void) //Return to 0 location
{
writecmd(0x02);
delay(1500);
}
// **************************************************
// Project: Scrolling string in LCD using 8051
// Author: Code Bloges
// Module description: Operate a LCD
// **************************************************
#include<reg51.h>
//Function declarations
void cct_init(void);
void delay(int);
void lcdinit(void);
void writecmd(int);
void writedata(char);
void ReturnHome(void);
//*******************
//Pin description
/*
P2 is data bus
P1.0 is RS
P1.1 is E
*/
//********************
// Defines Pins
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
// ***********************************************************
// Main program
//
void main(void)
{
unsigned char s[]="Hack Projects India ",i,j;
cct_init(); //Make all ports zero
lcdinit(); //Initilize LCD
ReturnHome(); //Return to 0 position
while(1)
{
writecmd(0x80); // Initial starting possion
i=0;
for(;s[i]!='\0';)
writedata(s[i++]); // Print the data up to null character
i=0;
j=s[0]; // Take the 1st character in j
for(;s[i]!='\0';i++)
s[i] = s[i+1]; // Shift the characters in array
s[i-1]=j; // Take the 1st character in last
s[i]='\0'; // Finally take null character
delay(500);
}
}
void cct_init(void)
{
P0 = 0x00; //not used
P1 = 0x00; //not used
P2 = 0x00; //used as data port
P3 = 0x00; //used for generating E and RS
}
void delay(int a)
{
int i;
for(i=0;i<a;i++); //null statement
}
void writedata(char t)
{
RS = 1; // => RS = 1
P2 = t; //Data transfer
E = 1; // => E = 1
delay(150);
E = 0; // => E = 0
delay(150);
}
void writecmd(int z)
{
RS = 0; // => RS = 0
P2 = z; //Data transfer
E = 1; // => E = 1
delay(150);
E = 0; // => E = 0
delay(150);
}
void lcdinit(void)
{
///////////// Reset process from datasheet /////////
delay(15000);
writecmd(0x30);
delay(4500);
writecmd(0x30);
delay(300);
writecmd(0x30);
delay(650);
/////////////////////////////////////////////////////
writecmd(0x38); //function set
writecmd(0x0c); //display on,cursor off,blink off
writecmd(0x01); //clear display
writecmd(0x06); //entry mode, set increment
}
void ReturnHome(void) //Return to 0 location
{
writecmd(0x02);
delay(1500);
}
Downloads:
The code was compiled in Keil uvision4 and simulation was made in Proteus v7.7.
To download code and proteus simulation click here.
Further Reading suggestions:
You may also like,
- Interfacing keypad with 8051
- Interfacing with UART of 8051 controller
- Interfacing SPI communication with 8051
- 8051 Displaying Custom Characters on LCD
- 8051 Graphical LCD
- RTC interfacing using I2C in 8051
- Interfacing ultrasonic sensor with 8051
- Interfacing GPS Modu with 8051
- Interfacing GSM Module with 8051
- ADC Module interfacing with 8051
- Interfacing PWM in 8051
You may also like,
- Interfacing keypad with 8051
- Interfacing with UART of 8051 controller
- Interfacing SPI communication with 8051
- 8051 Displaying Custom Characters on LCD
- 8051 Graphical LCD
- RTC interfacing using I2C in 8051
- Interfacing ultrasonic sensor with 8051
- Interfacing GPS Modu with 8051
- Interfacing GSM Module with 8051
- ADC Module interfacing with 8051
- Interfacing PWM in 8051
No comments:
Post a Comment