PIC and LCD

852 views

Published on

to drive LCD in 4 bit function.

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
852
On SlideShare
0
From Embeds
0
Number of Embeds
67
Actions
Shares
0
Downloads
28
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

PIC and LCD

  1. 1. /********PIC16F887******* HI-Tech C compiler Programmer : http://vto22012.blogspot.com/************************************/#include <htc.h>#define _XTAL_FREQ 20000000 //crystal speed 20Mhz__CONFIG(0X3F32); //set configuration bits. Refer to PIC datasheet.#include <stdio.h> // standard I/O c language/********LCD Driver start ************************************************//* LCD controller// (max characters is 40)// Initialization: lcd_init();// To print a string: printf("Hello World");// A few more formatting subroutines are available.// See towards the end of this page.// macros to isolate interface dependencies// LCD is connected to PORTD */#define LCDPort PORTD#define LCDTris TRISD#define Epin 6#define RWpin 5#define RSpin 4#define BUSYpin 3#define DATA0pin 0#define DATA1pin 1#define DATA2pin 2#define DATA3pin 3#define EHIGH bitset(LCDPort, Epin)#define ELOW bitclr(LCDPort, Epin)#define E_OUTPUT bitclr(LCDTris, Epin)#define RSHIGH bitset(LCDPort, RSpin)#define RSLOW bitclr(LCDPort, RSpin)#define RS_OUTPUT bitclr(LCDTris, RSpin)#define RWHIGH bitset(LCDPort, RWpin)#define RWLOW bitclr(LCDPort, RWpin)#define RW_OUTPUT bitclr(LCDTris, RWpin)#define BUSY_FLAG bittst(LCDPort, BUSYpin)#define DATA_DIR_RD{bitset(LCDTris,DATA3pin);bitset(LCDTris,DATA2pin);bitset(LCDTris,DATA1pin);bitset(LCDTris,DATA0pin);}#define DATA_DIR_WR{bitclr(LCDTris,DATA3pin);bitclr(LCDTris,DATA2pin);bitclr(LCDTris,DATA1pin);bitclr(LCDTris,DATA0pin);}#define OUTPUT_DATA(x) {int aval=LCDPort&0xF0; x = x & 0x0F; LCDPort=aval+x;}// some common defines#define bitset(var,bitno) ((var) |= (1 << (bitno)))#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))#define bittst(var,bitno) (var & (1 << (bitno)))void epulse(void){ __delay_us(1);
  2. 2. EHIGH; __delay_us(1); ELOW; __delay_us(1);}void lcd_write( unsigned char cmd, unsigned char data_flag, unsigned char chk_busy,unsigned char dflag){ char bflag,c; if (chk_busy) { RSLOW; //RS = 0 to check busy // check busy DATA_DIR_RD; //set data pins all inputs RWHIGH; // R/W = 1, for read do { EHIGH; __delay_us(1); // upper 4 bits bflag = BUSY_FLAG; ELOW; __delay_us(1); epulse(); } while(bflag); } else { __delay_ms(10); // dont use busy, just delay } DATA_DIR_WR; if (data_flag) RSHIGH; // RS=1, data byte else RSLOW; // RS=0, command byte // device is not busy RWLOW; // R/W = 0, for write c = cmd >> 4; // send upper 4 bits OUTPUT_DATA(c); epulse(); if (dflag) { c = cmd & 0x0F; //send lower 4 bits OUTPUT_DATA(c); epulse(); }}void lcd_init(void) { // configure, see control pins as outputs // initialize as low E_OUTPUT; RS_OUTPUT; RW_OUTPUT; ELOW; RSLOW; RWLOW; __delay_ms(25); //wait for device to settle __delay_ms(25); lcd_write(0x20,0,0,0); // 4 bit interface lcd_write(0x28,0,0,1); // 2 line display, 5x7 font lcd_write(0x28,0,0,1); // repeat lcd_write(0x06,0,0,1); // enable display lcd_write(0x0C,0,0,1); // turn display on; cursor, blink is off lcd_write(0x01,0,0,1); // clear display, move cursor to home __delay_ms(3); // wait for busy flag to be ready}// send 8 bit char to LCD void putch (char c) { lcd_write(c,1,1,1);}
  3. 3. void lcd_clear(void){ lcd_write(0x01,0,0,1); // clear display, move cursor to home}/* go to the specified position */void lcd_goto(unsigned char row, unsigned char pos){switch(row){case 1:{lcd_write(0x80+pos,0,1,1);break;}case 2:{lcd_write(0xC0+pos,0,1,1);break;}case 3:{lcd_write(0x94+pos,0,1,1);break;}case 4:{lcd_write(0xD4+pos,0,1,1);break;} }}void lcd_shiftleft(void){ lcd_write(0x18,0,1,1); // shift left}void lcd_shiftright(void){ lcd_write(0x1C,0,1,1); // shift right}void lcd_blinkcursor(void){ lcd_write(0x0F,0,1,1); // displays and blink a cursor}void lcd_printbar(int bar){ for(int i=0; i<bar; i++){ lcd_write(0xFF,1,1,1); // print bars on the LCD }}void lcd_string(const char *s) //send a string to displayin the lcd{ unsigned char i=0; while (s && *s)lcd_write(*s++,1,1,1);}/********************LCD DriverEnd****************************************************//*******************start main program *************************************/void main(void){ TRISD = 0b00000000; // configure all RD pin as output PORTD = 0b00000000; // reset all RD pin to 0 or offcondition ANSEL = 0; // Configure AN pins as digital ANSELH = 0; C1ON = 0; // Disable comparators C2ON = 0; lcd_init(); // initialise LCDwhile(1){ // loop forever lcd_goto(1,0); //Display start at line 1 and position 0 printf("Tutorial PIC"); //display lcd_goto(2,0); //Display start at line 2 position 0 printf("visit:vto22012");
  4. 4. //can use normal printf function like printf("Convert number %d",temp);}}/***********************main programend****************************************/

×