4-Bit LCD Interfacing with PIC 16f877 -MPLABX :-
The Previous Post click Here talked about How to interface LCD in 4 bit mode with 8051 . with a little changes of the previous code, we can use it in PIC16F877a with MPLABx ..
The Previous Post click Here talked about How to interface LCD in 4 bit mode with 8051 . with a little changes of the previous code, we can use it in PIC16F877a with MPLABx ..
#includeDownload the full project including Proteus File Clik here// CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = ON // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) #define _XTAL_FREQ 8000000 #define LCDPORT PORTB #define RS RB2 #define E RB3 //#define LIINE2 lcd_cmd(0xc0) void latch(void) { E = 1; __delay_ms(1); E = 0; } void lcd_cmd(unsigned char c) // used to send the command / Instruction to the lcd port { RS = 0; // send a '0' value to select to send command __delay_ms(1); LCDPORT = c & 0xf0; // send the command c only 4 bit by masking the lower bit latch(); __delay_ms(1); LCDPORT = (c << 4); // giving the lowerbit by shifting the 4 bit to left latch(); } void lcd_data(unsigned char c) { RS =1; // send 1 to send data __delay_ms(1); LCDPORT = c & 0xf0 | 0x4; //send the data only 4 bit by masking the lower bit and also making the RS pin high by giving 0x04 . __delay_ms(1); latch(); LCDPORT = (c << 4)| 0x4; ; // giving the lower bit by shifting the 4 bit to left latch(); } void lcd_init() { __delay_ms(20); lcd_cmd(0x30); //as per data sheet __delay_ms(20); lcd_cmd(0x30); //as per data sheet __delay_ms(4); lcd_cmd(0x32); //as per data sheet __delay_ms(4); lcd_cmd(0x28); // Function set (4-bit interface, 2 lines, 5*7Pixels) lcd_cmd(0x28); // Function set (4-bit interface, 2 lines, 5*7Pixels) lcd_cmd(0x0c); // Make cursorinvisible lcd_cmd(0x6); // Set entry Mode(auto increment of cursor) } void string(const char *q) // used to send single charcter to display the lcd { while (*q) { lcd_data(*q++); } } void main() { TRISB = 0x00; lcd_init(); string("Lcd working "); lcd_cmd(0xc0); string("its displaying "); while(1); }