pkipyy
 
 
  Joined: 21 Nov 2013 Posts: 25
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| lcd 16*2 driver | 
			 
			
				 Posted: Sat Nov 30, 2013 7:26 am     | 
				     | 
			 
			
				
  | 
			 
			
				This is lcd driver for demo2 plus board.
 
If you a bit modify,you can use this.
 
 
 	  | Code: | 	 		  
 
 
 
// As defined in the following structure the pin connection is as follows:
 
//     D0  enable RD6
 
//     D1  rs  RD4
 
//     D2  rw  RD5
 
//     D4  D4 RD0
 
//     D5  D5 RD1
 
//     D6  D6 RD2
 
//     D7  D7 RD3
 
struct lcd_pin_map {                 // This structure is overlayed
 
           boolean rd0;
 
           boolean rd1;
 
           boolean rd2;
 
           boolean rd3;
 
           boolean rs;
 
           boolean rw; 
 
           boolean en;           // on to an I/O port to gain
 
           boolean pwr;           // low order up.  ENABLE will
 
        } lcd;
 
struct lcd_pin_map trisd;
 
struct lcd_pin_map latd;
 
 
#byte lcd = 0x0f //PORTD
 
#byte trisd = 0x8f
 
#byte latd = 0x10f
 
 
#define INP 1
 
#define OUTP 0
 
 
#define ENABLE 1
 
#define DISABLE 0
 
#define READ 1
 
#define WRITE 0
 
#define CLEAR 0
 
#define SET 1
 
#define MAX_LINE 2
 
#define MAX_COL 16
 
void nop()
 
{
 
}
 
char read_byte()
 
{
 
   int res,dat;
 
   trisd.rd0=INP;
 
   trisd.rd1=INP;
 
   trisd.rd2=INP;
 
   trisd.rd3=INP;
 
   
 
   lcd.en=ENABLE;
 
   nop();
 
   nop();
 
   dat=latd;
 
   lcd.en=DISABLE;
 
   res=dat<<4;
 
 
   lcd.en=ENABLE;
 
   nop();
 
   nop();
 
   dat=latd;
 
   dat=dat&0x0f;
 
   res=res|dat;
 
   
 
   trisd.rd0=OUTP;
 
   trisd.rd1=OUTP;
 
   trisd.rd2=OUTP;
 
   trisd.rd3=OUTP;
 
   return res;
 
}
 
void wait_lcd()
 
{
 
   char status;
 
   lcd.rs=CLEAR;
 
   lcd.rw=READ;
 
 
   do{
 
      status=read_byte();
 
   }while(status&0x80);
 
}
 
   
 
void write_nibble(char cmd,char dat)
 
{
 
   char buf;
 
   if(cmd) lcd.rs=CLEAR;
 
   else lcd.rs=SET;
 
   lcd.rw=WRITE;
 
   lcd.en=ENABLE;
 
   buf=latd;
 
   buf=buf &0xf0;
 
   latd=buf |(dat&0x0f);
 
   nop();
 
   nop();
 
   lcd.en=DISABLE;
 
}
 
void write_byte(char cmd,char dat)
 
{
 
   write_nibble(cmd,dat>>4);
 
   write_nibble(cmd,dat);
 
}
 
void lcd_put_char(char dat)
 
{
 
   write_byte(FALSE,dat);
 
   wait_lcd();
 
}
 
void lcd_put_str(str[])
 
{
 
   int i=0;
 
   while(str[i])
 
      lcd_put_char(str[i++]);
 
}   
 
void lcd_goto(char line,char col)
 
{
 
   if((line >MAX_LINE-1)||(col>MAX_COL-1))  return;
 
   if(line==1) write_byte(TRUE,0xc0|col);
 
   if(line==0) write_byte(TRUE,0x80|col);
 
   wait_lcd();
 
}
 
void lcd_clear()
 
{
 
   write_byte(TRUE,0x01);
 
   wait_lcd();
 
}
 
void init_lcd()
 
{
 
   trisd=0;
 
   lcd.pwr=0;
 
   lcd.pwr=1;
 
   lcd.rs=CLEAR;
 
   lcd.rw=WRITE;
 
   lcd.en=DISABLE;
 
   lcd.en=ENABLE;
 
   
 
   wait_lcd();
 
   write_nibble(TRUE,0x02);
 
   wait_lcd();
 
   write_byte(TRUE,0x28);
 
   wait_lcd();
 
   write_byte(TRUE,0x01);
 
   wait_lcd();
 
   write_byte(TRUE,0x02);
 
   wait_lcd();
 
   write_byte(TRUE,0x0c);
 
   wait_lcd();
 
 
   wait_lcd();
 
}
 
 
 
 | 	  
 
Here is test program
 
 	  | Code: | 	 		  
 
#include <16f1937.h>
 
#include "lcd.c"
 
#use delay(clock = 500000)
 
 
 
 
void main()
 
{
 
   init_lcd();
 
 
   while(1) {
 
      lcd_goto(0,0);
 
      lcd_put_char("a");
 
   }
 
}
 
 
 | 	  
 
 
Happy to you. | 
			 
		  |