/*Rutinas para el control de un lcd con solo 4 bits para datos*/

#include "at898252.h"
#include "lcd_4bit.h"
#define  UCHAR unsigned char
#define  UINT unsigned int

/*pulso en patilla ENABLE para validar dato*/
void habilita()
  {
     ENABLE=1;
     ENABLE=0;
   /*INSERTAR ESPERA EN LOS PULSOS*/
  }  
/*Inicializar el display LCD*/
void init_lcd (void)
{
 unsigned int c;
 for(c=0;c<10000;c++);
   PORT_LCD &= 0X40;
   PORT_LCD |= 0X03; 
   habilita();
 for(c=0;c<1000;c++); 
   habilita();
 for(c=0;c<1000;c++);
   habilita();
 for(c=0;c<1000;c++);
 lcd_envia(0X28);/* bus de 4 bits */
 lcd_envia(0X0C);/* cursor apagado */
 lcd_envia(0X06);/* lcd no desplazado */
 lcd_envia(0X01);/* limpiar pantalla */
}
/*Transferir al puerto del LCD un BYTE en dos partes*/
/*el NIBBLE alto primero y luego el NIBBLE bajo*/
void lcd_envia (unsigned char d)
{  int i;
   PORT_LCD &= 0XDF;   /*selecciona modo escritura con el bit 5 a 0 */
   /*SUPRIMIR ESA LÍNEA*/
   PORT_LCD &= 0XF0;   /*parte alta*/
   PORT_LCD |= d >> 4; 
   habilita();
   PORT_LCD &= 0XF0;   /*parte baja*/
   PORT_LCD |= d & 0x0F;
   habilita(); 
    for(i=0; i<300;i++);
}
/*Mover el cursor a la fila(x) y columna(y) especificada*/
cursora_xy(UCHAR x,UCHAR y)
  {
   unsigned char d;
   DATO_COMAND=0;  /*COMANDO*/
   d = 0X80 + (x - 1) * 0X40 + y - 1;
   lcd_envia (d);
  }
/*escribir un caracter especificado a la posición del cursor*/
void lcd_caracter(unsigned char c)
 {
 DATO_COMAND=1;  /*DATO*/
 lcd_envia (c);
 }
/*escribir un "string"de caracteres en pos.consecutivas*/
display(UCHAR *msg)
 {
   while(*msg)
   {
     lcd_caracter(*msg++);
   }
  }
/*hacer visible el cursor con parpadeo*/
void lcd_cursoron (void)
{
 ENABLE=0;
 DATO_COMAND=0;  /*COMANDO*/
 lcd_envia (0X0F);
}
/*ocultar el cursor*/
void lcd_cursoroff (void)
{
 ENABLE=0;
 DATO_COMAND=0;  /*COMANDO*/
 lcd_envia (0X0C);
}
/*borrar la pantalla*/
void lcd_clrscr (void)
{
 ENABLE=0;
 DATO_COMAND=0;  /*COMANDO*/
 lcd_envia (0X01);
}
/* Llevar el cursor a la 1ºfila columna 1 */
void poner_linea_1(void)/*no se ha usado en el ejercicio*/
 {
   DATO_COMAND=0;  /*COMANDO*/
   lcd_envia (0X80);
 }
/* Llevar el cursor a la 2ºfila columna 1 */
void poner_linea_2(void)/*no se ha usado en el ejercicio*/
 {
   DATO_COMAND=0;  /*COMANDO*/
   lcd_envia (0XC0);
 }

/* Llevar el cursor al rincón de la fila actual*/
void lcd_rincon (void)
{
 ENABLE=0;
 DATO_COMAND=0;  /*COMANDO*/
 lcd_envia (0x02);
}
