/******************************************************************************* 
   \file LCD_30.c
   \version: 1.0
   
   \author Suky. 
   \web www.infopic.comlu.com
   \mail inf.pic.suky@live.com.ar
   \date 18/01/10
********************************************************************************/
#include "LCD_C30.h"

unsigned char BusyLCD(void){

#ifdef USE_RW
	 DATA_PIN_7 = 0;
	 DATA_PIN_6 = 0;
	 DATA_PIN_5 = 0;
	 DATA_PIN_4 = 0;

     TRIS_DATA_PIN_7 = 1;
     TRIS_DATA_PIN_6 = 1;
     TRIS_DATA_PIN_5 = 1;
     TRIS_DATA_PIN_4 = 1;

     RW_PIN = 1;    
     RS_PIN = 0; 
	 E_PIN=1;         
     __delay_us(2);

     if(READ_PIN_7==1){
          E_PIN = 0; 
		  __delay_us(2);
		  E_PIN = 1;
		  __delay_us(2);
		  E_PIN = 0;
      	  RW_PIN = 0; 
          return 1;
     }else{
          E_PIN = 0;
		  __delay_us(2);
		  E_PIN = 1;
		  __delay_us(2);
		  E_PIN = 0;
		  RW_PIN = 0;       
          return 0;
     }
#else
	 __delay_ms(1);
	 return 0;
#endif
}

void WriteCmdLCD(unsigned char cmd){

#ifdef USE_3PINES
	unsigned char i;
	unsigned char cmd_temp;
#endif

	while(BusyLCD());

	#ifndef USE_3PINES
		#ifdef USE_RW
			RW_PIN = 0;
		#endif   
		RS_PIN = 0;  
		
		TRIS_DATA_PIN_7 = 0;
		TRIS_DATA_PIN_6 = 0;
		TRIS_DATA_PIN_5 = 0;
		TRIS_DATA_PIN_4 = 0;
		
		DATA_PIN_7 = (unsigned int)((cmd & 0x80)>>7);
		DATA_PIN_6 = (unsigned int)((cmd & 0x40)>>6);
		DATA_PIN_5 = (unsigned int)((cmd & 0x20)>>5);
		DATA_PIN_4 = (unsigned int)((cmd & 0x10)>>4);
	#else
		cmd_temp=(cmd>>4);  // Rs es bit 4
		for(i=0;i<8;i++){
			DATA_PIN=(unsigned int)((cmd_temp & 0x80)>>7);
			cmd_temp<<=1;
			CLOCK_PIN=1;
			__delay_us(1);
			CLOCK_PIN=0;
		}
	#endif
	Nop();
	E_PIN = 1;
	__delay_us(2);
	E_PIN = 0;
	#ifndef USE_3PINES	
		DATA_PIN_7 = (unsigned int)((cmd & 0x08)>>3);
		DATA_PIN_6 = (unsigned int)((cmd & 0x04)>>2);
		DATA_PIN_5 = (unsigned int)((cmd & 0x02)>>1);
		DATA_PIN_4 = (unsigned int)(cmd & 0x01);
	#else
		cmd_temp=(cmd&0x0F);  // Rs es bit 4
		for(i=0;i<8;i++){
			DATA_PIN=(unsigned int)((cmd_temp & 0x80)>>7);
			cmd_temp<<=1;
			CLOCK_PIN=1;
			__delay_us(1);
			CLOCK_PIN=0;
		}
	#endif
	Nop();	
	E_PIN = 1;
	__delay_us(2);
	E_PIN = 0;
	
} 

void OpenLCD(unsigned char LcdType){
char i;
#ifdef USE_3PINES
	unsigned char temp;
#endif
	__delay_ms(15);
	
#ifndef USE_3PINES
/* ** Configuración de pines ** */	
	DATA_PIN_7 = 0;
	DATA_PIN_6 = 0;
	DATA_PIN_5 = 0;
	DATA_PIN_4 = 0;
	#ifdef USE_RW
		RW_PIN = 0;
	#endif
	RS_PIN = 0;
	E_PIN = 0;
	
	TRIS_DATA_PIN_7 = 0;
	TRIS_DATA_PIN_6 = 0;
	TRIS_DATA_PIN_5 = 0;
	TRIS_DATA_PIN_4 = 0;
	#ifdef USE_RW	
		TRIS_RW = 0;
	#endif
	TRIS_RS = 0;
	TRIS_E = 0;
#else
	DATA_PIN = 0;
	CLOCK_PIN = 0;
	E_PIN = 0;

	TRIS_DATA = 0;
	TRIS_CLOCK = 0;
	TRIS_E = 0;
	
	for(i=0;i<8;i++){
		DATA_PIN=0;
		CLOCK_PIN=1;
		__delay_us(1);
		CLOCK_PIN=0;
	}
#endif
/* ** INICIALIZACION ** */     
#ifndef USE_3PINES
	DATA_PIN_5 = 1;
	DATA_PIN_4 = 1;
#else
	temp=0x03;
	for(i=0;i<8;i++){
		DATA_PIN=(unsigned int)((temp & 0x80)>>7);
		temp<<=1;
		CLOCK_PIN=1;
		__delay_us(1);
		CLOCK_PIN=0;
	}
#endif
	for(i=0;i<3;i++){
		E_PIN = 1;
		__delay_ms(2);
		E_PIN = 0;
	 	__delay_ms(5);
	}
#ifndef USE_3PINES
	DATA_PIN_4 = 0;
#else
	temp=0x02;
	for(i=0;i<8;i++){
		DATA_PIN=(unsigned int)((temp & 0x80)>>7);
		temp<<=1;
		CLOCK_PIN=1;
		__delay_us(1);
		CLOCK_PIN=0;
	}
#endif
	E_PIN = 1;
	__delay_us(2);
	E_PIN = 0;

    WriteCmdLCD(0x20 | LcdType);  // Tipo display.-       
    WriteCmdLCD(0x01);	// Borramos display.-             
	WriteCmdLCD(0x06);	// Incrementa cursor.-
	WriteCmdLCD(0x0C);	// Encendemos display.-
}


void WriteDataLCD(char data){
#ifdef USE_3PINES
	unsigned char i;
	char data_temp;
#endif

	while(BusyLCD());

	switch(data){
		case '\f':
			WriteCmdLCD(0x01);
		break;
		case '\n':
			GotoxyLCD(1,2);
		break;
		default:
			#ifndef USE_3PINES
				#ifdef USE_RW
			    	RW_PIN = 0;  
				#endif
			    RS_PIN = 1;  
			 
			    TRIS_DATA_PIN_7 = 0;
			    TRIS_DATA_PIN_6 = 0;
			    TRIS_DATA_PIN_5 = 0;
			    TRIS_DATA_PIN_4 = 0;
			
			    DATA_PIN_7 = (unsigned int)((data & 0x80)>>7);
			    DATA_PIN_6 = (unsigned int)((data & 0x40)>>6);
			    DATA_PIN_5 = (unsigned int)((data & 0x20)>>5);
			    DATA_PIN_4 = (unsigned int)((data & 0x10)>>4);
			#else
				data_temp=(data>>4);  // Rs es bit 4
				data_temp|=0x10;
				for(i=0;i<8;i++){
					DATA_PIN=(unsigned int)((data_temp & 0x80)>>7);
					data_temp<<=1;
					CLOCK_PIN=1;
					__delay_us(1);
					CLOCK_PIN=0;
				}
			#endif
			Nop();
		    E_PIN = 1;
			__delay_us(2);
		    E_PIN = 0;
			#ifndef USE_3PINES
			    DATA_PIN_7 = (unsigned int)((data & 0x08)>>3);
			    DATA_PIN_6 = (unsigned int)((data & 0x04)>>2);
			    DATA_PIN_5 = (unsigned int)((data & 0x02)>>1);
			    DATA_PIN_4 = (unsigned int)(data & 0x01);
			#else
				data_temp=(data&0x0F);  // Rs es bit 4
				data_temp|=0x10;
				for(i=0;i<8;i++){
					DATA_PIN=(unsigned int)((data_temp & 0x80)>>7);
					data_temp<<=1;
					CLOCK_PIN=1;
					__delay_us(1);
					CLOCK_PIN=0;
				}
			#endif
			Nop();
		    E_PIN = 1;
			__delay_us(2);
		    E_PIN = 0;
	}

} 

void GotoxyLCD(unsigned char x,unsigned char y){
unsigned char Direccion;
	if(y!=1){ Direccion=0x40;}
	else{ Direccion=0x00;}

	Direccion+=x-1;
	while(BusyLCD());
	WriteCmdLCD(0x80|Direccion);
}

void putsLCD(char *buffer){

    while(*buffer != '\0')    {
        WriteDataLCD(*buffer++);
    }
}