/******************************************************************************* 
   \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 = 0x80;}
   else if(y == 2){Direccion = 0xC0;}
   else if(y == 3){Direccion = 0x94;}
   else if(y == 4){Direccion = 0xD4;}

   Direccion+=x-1;
   while(BusyLCD());
   WriteCmdLCD(0x80|Direccion);
}

void putsLCD(char *buffer){

    while(*buffer != '\0')    {
        WriteDataLCD(*buffer++);
    }
}
