LCD INTERFACING WITH PIC16F877A MICROCONTROLLER

LCD INTERFACING WITH PIC MICROCONTROLLER,In this tutorial, you will learn to interface an LCD with a microcontroller. It is a very simple and easy to understand project for the beginners and is commonly used in several electronic products. LCD (Liquid Crystal Display)provides user interface and can be very useful for debugging purpose. After completion of this tutorial, you will be able to display data on an LCD using mikro C compiler. You should know how to use microcontroller and how to program pic microcontroller. You should also check how to use Mikro c for pic, if you have a beginner in Mikro c for pic programming.



TASK of LCD interfacing

To interface LCD with PIC16F877A and display the text ‘LCD INTERFACE’ on it. LCDs comes in different sizes and shapes. For this project, we have selected a 16×2 character, alphanumeric LCD. It contains 2 rows of 16 character.

Its pin configuration is given as follows:



Pin NumberNameUse
1VssGround
2VddPower
3VeeTo adjust the contrast
4RS1=Data input
0=Instruction input
5R/W1=Read from LCD
0=Write to LCD
6Enable (EN)From 1 to 0 = Data is written to the LCD
7DB0Data Bus Lines
8DB1
9DB2
10DB3
11DB4
12DB5
13DB6
14DB7
15LED+Backlight
16LED-

The LCD can work in two modes, 4-bit and 8-bit. In this tutorial, we have used the 4-bit mode which uses only 4 data lines, thus saving pins of the microcontroller. So It is recommended to use LCD in four bits mode to save pins of microcontroller for other purpose.

LCD Display Commands in Mikro c for pic

We have used 16×2 LCD which means there are 2 rows and 16 characters in each row. So we can display a total of 32 characters at a time in two rows with 16 characters in each row.

  1. Void Lcd_Out (char row, char column, char*text);

This is the main command which prints our text on LCD. It also gives privilege to specify the position of text. In horizontal direction we count rows number and in vertical direction we count the column number. In above command

  • row specifies the starting position of text in row. We specify the number of row like 1 or 2 according to our requirement in which row we want to print text.
  • column specifies the starting position of text in column. We specify the number of column like (1,2,3,..16) according to our requirement in which row we want to print text.
  • text specifies the text we want to display on LCD

For example the command Lcd_Out (1, 1, “LCD”); will print the text LCD starting from position of row 1 and column 1.

Lcd_Out (2, 1, “LCD”); will print the text LCD starting from position of row 2 and column

Lcd_Out (1, 5, “LCD”); will print the text LCD starting from position of row 1 and column 5.

However if your string is longer than the number of characters that could be displayed in a row from starting position, the last characters will not be displayed. E.g. Lcd_Out (1, 6 “LCD Interface”); will display text in row 1 starting from column position 6 and will display only LCD Interfa the rest of the characters will not be displayed as there is no room for them.

  1. void Lcd_Out_Cp(char *text); will start printing the text from current cursor position. For example after printing Lcd_Out (1, 1, “LCD”); if you write Lcd_Out_Cp(“Hello”);  it will display “Hello” at position from column position of 4 in row 1.
  2. void Lcd_Chr(char row, char column, char out_char); allows only single characters to be displayed at specified positions. E.g. Lcd_Chr(2, 5, ‘A’);  will print only A on column 5 row 2.
  3. void Lcd_Chr_Cp(char out_char); allows to print only single character from current cursor position like after Lcd_Chr(2, 5, ‘A’); if your write Lcd_Chr_Cp(‘B’); it will be printed at row 2 column 6.

CIRCUIT DIAGRAM OF LCD INTERFACE WITH PIC16F877A:

circuit diagram of LCD interfacing with PIC16F877A microcontroller

circuit diagram of LCD interfacing with PIC16F877A microcontroller

LCD Connections

  • Connect pin1 of LCD to ground and pin2 to Vdd.
  • Pin3 of LCD is used to adjust the contrast of the display. Leave it unconnected.
  • RS (pin4) of LCD is connected to RB2 of PORTB. It distinguishes between data input and command input.
  • RW (pin5) is grounded, since we have to write the data on LCD.
  • E (pin6) is connected to RB3 of PORTB. It is a control line to inform the LCD that data has been sent.
  • D0-D3 of the LCD are grounded, since we are using a 4-bit mode. D4-D7 are connected to the PORTB pins (RB4-RB7) of the controller.

C-CODE FOR LCD INTERFACE WITH MCU

Write the following code in mikroC Compiler

/* LCD INTERFACING WITH PIC16F877A */



// LCD Module connections

sbit LCD_RS at RB2_bit;

sbit LCD_EN at RB3_bit;



sbit LCD_D7 at RB7_bit;

sbit LCD_D6 at RB6_bit;

sbit LCD_D5 at RB5_bit;

sbit LCD_D4 at RB4_bit;

// End LCD module connections

// LCD Pin direction

sbitLCD_RS_Direction at TRISB2_bit;

sbitLCD_EN_Direction at TRISB3_bit;

sbit LCD_D7_Direction at TRISB7_bit;

sbit LCD_D6_Direction at TRISB6_bit;

sbit LCD_D5_Direction at TRISB5_bit;

sbit LCD_D4_Direction at TRISB4_bit;

// End of LCD Pin direction

void main() {

Lcd_Init();// Initialize LCD

Lcd_Cmd(_LCD_CLEAR);// Clear Display

Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor Off

Lcd_Out(1,1,"LCD INTERFACE");// Write "LCD INTERFACE" in the first row

}

When using PIC microcontroller, the mikroC compiler has a built-in LCD library that supports the commands to carry out LCD initialization. The library consists of a number of functions to control LCDs with 4-bit data interface.

The main program first clears the LCD screen and then displays “LCD INTERFACE” in the first row of LCD. The LCD pin directions are all set as outputs. The RS pin of LCD is set to 1, which indicates that the information received from DB4-DB7 is a valid text to be printed on LCD screen. The EN pin is also set to 1 which indicates that data is send to the LCD.

LCD display with cursor position control

This code will be used to display characters on cursor location and specific location on LCD.

// LCD Module connections
sbit LCD_RS at RB1_bit; // it can only access a pin not a port
//sbit LCD_RS at LATB1_bit; //same as "sbit LCD_RS at RB1_bit;"
//sbit LCD_RS at LATB.B1; //SAME AS "sbit LCD_RS at RB1_bit;"
//sbit LCD_RS at LATB;
//sbit LCD_RS at PORTB1_bit;
//sbit LCD_RS at PORTB.B1;
//sbit LCD_RS at PORTB;
sbit LCD_EN at RB0_bit;
sbit LCD_D7 at RB5_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D4 at RB2_bit;
// End LCD module connections
// LCD Pin direction
sbit LCD_RS_Direction at TRISB1_bit;
sbit LCD_EN_Direction at TRISB0_bit;
sbit LCD_D7_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB2_bit;
// End of LCD Pin direction
void main() 
{
 ANSELH = 0X00;
 TRISB=0X00;
 PORTB=0X00;
 Lcd_Init();// Initialize LCD
 Lcd_Cmd(_LCD_CLEAR);// Clear Display
 Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor Off

while (1)
 {
 Lcd_Out(1,6,"LCD");// Write “LCD INTERFACE” in the first row
 Delay_ms(1000);
 Lcd_Out_Cp("Hello");
 Delay_ms(1000);
 Lcd_Chr(2, 7, 'i');
 Delay_ms(1000);
 Lcd_Chr_Cp('A');
 Delay_ms(1000);
 Lcd_Cmd(_LCD_RETURN_HOME);
 Delay_ms(1000);
 Lcd_Chr_Cp('B');
 Delay_ms(1000);
 Lcd_Cmd(_LCD_CURSOR_OFF) ;
 Lcd_Chr_Cp('C');
 Delay_ms(1000);
 Lcd_Cmd(_LCD_UNDERLINE_ON) ;
 Lcd_Chr_Cp('D');
 Delay_ms(1000);
 Lcd_Cmd(_LCD_BLINK_CURSOR_ON) ;
 Lcd_Chr_Cp('E');
 Delay_ms(1000);
 Lcd_Cmd(_LCD_TURN_OFF) ;
 Lcd_Chr_Cp('F');
 Delay_ms(1000);
 Lcd_Cmd(_LCD_TURN_ON) ;
 Lcd_Chr_Cp('G');
 Delay_ms(1000);
 Lcd_Cmd(_LCD_SHIFT_LEFT) ;
 Delay_ms(1000);
 Lcd_Cmd(_LCD_CLEAR);
 Delay_ms(1000);
 }
}

APPLICATIONS

Programmed LCDs are vastly used for industrial as well as commercial applications. LCDs are used in UPSs or inverters, where voltage and current readings are displayed on the screen. Instructions to be followed are displayed on an LCD screen in airports, banks, hospitals etc.If you still have any issue after reading this article, feel free to comment on this post with your issues. To dowlaod code and circuit diagram click on following link :



17 Comments

  1. komen July 14, 2015
    • BILAL Malik July 15, 2015
    • melkamzer March 6, 2017
  2. muthu.m February 4, 2016
  3. niraj singh rauthan March 12, 2016
  4. Nasim June 2, 2016
  5. FARA November 7, 2016
  6. Abdulhamid December 1, 2016
  7. Mani February 14, 2017
  8. parakkath .p February 17, 2017
  9. fares March 3, 2017
  10. libin paul June 4, 2017
    • Bilal Malik June 4, 2017
  11. Dan June 20, 2017
  12. ISAH BASHIRU July 5, 2017
  13. dare August 11, 2017
  14. Nasim Khaliqhey September 3, 2017

Add Comment

Subscribe to our blog to get updates in your email

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Join 1,406 other subscribers