tesla80
 
 
  Joined: 23 May 2007 Posts: 81
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| 16x1 (GDM1601) Text Lcd Driver for PIC | 
			 
			
				 Posted: Wed May 23, 2007 3:35 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Hi All,
 
 
16x1 (GDM1601) Text Lcd Driver for PIC
 
 
 
 
 
16x1_lcd_gdm1601.c
 
 	  | Code: | 	 		  /*
 
      GDM1601(16 Character, 1 Row Text LCD) Driver for PIC
 
            Eray Ozturk 'SpeedyX' - 14.09.2006 00:33
 
            Mail: erayozturk1(at)gmail.com
 
 
      lcd_init                    : init (first and once)
 
      lcd_command(x)              : send a command
 
      lcd_data(x)                 : send a character
 
      printf(lcd_data,"SpeedyX"); : send a word
 
 
      lcd_goto1                   : cursor goto home
 
      lcd_ramch                   : lcd line 2 (after 8th char)
 
      lcd_clrscr                  : clear screen
 
 
         PIC             LCD
 
         lcd_port.0      D4
 
         lcd_port.1      D5
 
         lcd_port.2      D6
 
         lcd_port.3      D7
 
         lcd_port.4      RS
 
         lcd_port.5      E      lcd RW pin -> ground
 
         
 
*/
 
 
#define lcd_port     portb
 
 
#define t 2 // enable wait time (us)
 
 
#define lcd_putc(c)  lcd_data(c)
 
#define lcd_goto1    lcd_command(0b10000000)      // lcd goto home
 
#define lcd_ramch    lcd_command(0b11000000)      // lcd line 2
 
#define lcd_clrscr   lcd_command(0b00000001);bekle_ms(2)   // lcd clear
 
 
void bekle_ms(int x) {
 
   delay_ms(x);
 
}
 
 
void bekle_us(int y) {
 
   delay_us(y);
 
}
 
 
void lcd_gonder(char alt4, int1 tip) {
 
int ust4;
 
    ust4 = alt4 & 0b11110000;
 
    ust4 = ust4 >> 4;
 
    ust4 &= 0x0F;
 
    alt4 &= 0x0F;
 
    if(tip==1) ust4 |= 0b00010000;
 
    lcd_port=ust4;
 
    bekle_us(t);
 
    lcd_port |= 0b00100000; // enable=1
 
    bekle_us(t);
 
    lcd_port &= 0b11011111; // enable=0
 
    bekle_us(t);
 
    if(tip==1) alt4 |= 0b00010000;
 
    lcd_port=alt4;
 
    bekle_us(t);
 
    lcd_port |= 0b00100000; // enable=1
 
    bekle_us(t);
 
    lcd_port &= 0b11011111; // enable=0
 
    bekle_us(t);
 
}
 
 
void lcd_data(char c) { lcd_gonder(c,1); }
 
 
void lcd_command(char c) { lcd_gonder(c,0); }
 
 
void lcd_scroll_right(){lcd_command(0x1E);}
 
 
void lcd_scroll_left(){lcd_command(0x18);}
 
 
void lcd_gotox(int x) {
 
    int adr=0x80;
 
    if(x>8) adr=0xC0;
 
   lcd_command(adr|(x-1));
 
}
 
 
void lcd_init() {
 
   bekle_ms(20);
 
   lcd_command(0b00000010);
 
   lcd_command(0b00101000);
 
   bekle_us(50);
 
   lcd_command(0b00001100);
 
   bekle_us(50);
 
   lcd_clrscr;
 
   lcd_command(0b00000110);
 
   bekle_ms(10);
 
} | 	  
 
 
main.c
 
 	  | Code: | 	 		  #include <16F88.h>
 
#FUSES INTRC_IO,NOWDT,NOMCLR,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG,NOPROTECT
 
#use delay(clock=4000000)
 
 
#use  fast_io(A)
 
#use  fast_io(B)
 
#byte porta = 5
 
#byte portb = 6
 
 
#include <16x1_lcd_gdm1601.c>
 
 
void main() {
 
   setup_oscillator(OSC_4MHZ);
 
   set_tris_a(0);
 
   set_tris_b(0);
 
   porta=0; portb=0;
 
   
 
   lcd_init();
 
 
   printf(lcd_data,"SpeedyX GDM1601");
 
   //printf(lcd_data,"SpeedyX "); lcd_ramch; printf(lcd_data,"GDM1601"); // for lcd-s with 8-8 ram structures
 
   
 
   for(;;); // loop forever
 
}
 
 | 	 
  | 
			 
		  |