/*-------------------------------------------*\
  |Por rober_gv@hotmail.com para 16f84
\*-------------------------------------------*/



//  lcd_init()   Debe ser llamada antes que las otras funciones.
//
//  lcd_putc(c)  Visualiza c en la siguiente posición del display.
//               Caracteres especiales de control:
//                      \f  Borrar display
//                      \n  Saltar a la segunda linea
//                      \b  Retroceder una posición.
//
//  lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el display.
//                  (la esquina superior izquierda es 1,1)
//
//  lcd_getc(x,y)   Devuelve el caracter de la posicion x,y del display.


#bit  lcd_enable = 5.2
#bit  lcd_rw     = 5.1
#bit  lcd_rs     = 5.0
#byte lcd_a = 5
#byte lcd_b = 6

#define LCD_LINEA2 0x40   // Direccion de memoria para la segunda linea
#define LCD_DATO    1
#define LCD_COMANDO 0

#define LCD_CLEAR  0x01
#define LCD_HOME    0x02

#define LCD_DISPLAY_OFF  0x08
#define LCD_DISPLAY_ON   0x0C
#define LCD_CURSOR_ON    0x0E
#define LCD_CURSOR_BLINK 0x0F

#define LCD_CURSOR_SHIFT_RIGHT  0x10
#define LCD_CURSOR_SHIFT_LEFT   0x14
#define LCD_DISPLAY_SHIFT_RIGHT 0x18
#define LCD_DISPLAY_SHIFT_LEFT  0x1C

//int lcd_leer()
//{
//  int valor;

//  set_tris_a(0x1A);
// set_tris_b(0xF0);

//  lcd_rw = 1;
// delay_cycles(1);
//  lcd_enable = 1;
//  delay_cycles(1);
//  valor = lcd_b;
//  lcd_enable = 0;
//  delay_us(40);
//  return valor;
//}




void lcd_enviar(int dir, int valor)
{
  set_tris_a(0x1A);
  set_tris_b(0x00);

  lcd_rs = 0;
  lcd_rs = dir;
  delay_cycles(1);
  delay_us(200);
  lcd_rw = 0;
  delay_cycles(1);
   delay_us(200);
  lcd_enable = 0;
  lcd_b = (lcd_b & 0x0f) | (valor & 0xf0);
   delay_us(40);
  lcd_enable = 1;
  lcd_enable = 0;
   delay_us(200);
  lcd_b = (lcd_b & 0x0f) | (valor << 4);
  lcd_enable = 1;
  delay_us(2);
  lcd_enable = 0;
  delay_us(40);
}


void lcd_init()
{
  int i;

  set_tris_a(0x1a);
  set_tris_b(0x00);

  lcd_enable = 0;
  lcd_rw = 0;
  lcd_rs = 0;
  delay_ms(15);
  lcd_b= 0x30;
  lcd_enable =1;
  delay_us(100);
  lcd_enable =0;
  delay_ms(5);
  lcd_enable =1;
  delay_us(100);
  lcd_enable =0;
  delay_us(200);
  lcd_enable =1;
  lcd_enable =0;
  delay_ms(5);
  lcd_b= 0x20;
  lcd_enable =1;
  delay_us(100);
  lcd_enable =0;
  delay_us(100);
  lcd_enviar(LCD_COMANDO,0x28); // 4 bit 2 lineas 5x8
  lcd_enviar(LCD_COMANDO,0x08);
  lcd_enviar(LCD_COMANDO,0x06);
  lcd_enviar(LCD_COMANDO,0x0E);
}


void lcd_gotoxy( byte x, byte y)
{
   byte dir;

   if(y!=1)
     dir=LCD_LINEA2;
   else
     dir=0;
   dir+=x-1;
   lcd_enviar(LCD_COMANDO,0x80|dir);
}


void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_enviar(LCD_COMANDO,0x01);
                   delay_ms(2);
                   break;
     case '\n'   : lcd_gotoxy(1,2);               break;
     case '\b'   : lcd_enviar(LCD_COMANDO,0x10);  break;
     default     : lcd_enviar(LCD_DATO,c);        break;
   }
}
void lcd_numero(long int b){
long int a;
      a=0;
      if (b>=100)
      {
      a=(b/100);
      lcd_putc('0'+a);
      lcd_putc('0'+(b-(a*100))/10);
      lcd_putc('0'+b%10);
      }
      else{
           lcd_putc('0'+b/10);
           lcd_putc('0'+b%10);
      }
}
