#include <16F877A.h>
#FUSES NOWDT                 	//No Watch Dog Timer
#FUSES XT                    	//Crystal osc <= 4mhz
#FUSES NOPUT                 	//No Power Up Timer
#FUSES NOPROTECT             	//Code not protected from reading
#FUSES NOBROWNOUT            	//No brownout reset
#FUSES NOLVP                 	//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                 	//No EE protection
#FUSES NOWRT                 	//Program memory not write protected
#FUSES NODEBUG               	//No Debug mode for ICD

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,rcv=PIN_C7,bits=8)

#include <string.h>

#define Enable Pin_D7
#define RW     Pin_D6
#define RS     Pin_D5
#define Luz    Pin_D3




////////////////// Inicializacion ////////////////////
void iniciar_LCD()//**********************************
{
//---------------
delay_ms(32);
//--------------- Etapa "Function set"
output_B(0x3C);
output_low(Enable);
output_low(RW);
output_low(RS);

output_high(Enable);
output_low(Enable);
//--------------- Etapa "Display ON/OFF Control"
delay_us(40);

output_B(0x0F);
output_low(Enable);
output_low(RW);
output_low(RS);

output_high(Enable);
output_low(Enable);
//------------ Etapa "Limpiar display"
delay_us(40);

output_B(0x01);
output_low(Enable);
output_low(RW);
output_low(RS);

output_high(Enable);
output_low(Enable);
//---------- Etapa "entry Mode Set"
delay_ms(2);

output_B(0x06);
output_low(Enable);
output_low(RW);
output_low(RS);

output_high(Enable);
output_low(Enable);
delay_ms(50);
//------------ fin

 output_B('O');      //"Write on RAM"
 output_low(Enable);       //
 output_low(RW);           //
 output_high(RS);          //
                           //
 output_high(Enable);
 output_low(Enable);
 delay_ms(100);

 output_B('K');      //"Write on RAM"
 output_low(Enable);       //
 output_low(RW);           //
 output_high(RS);          //
                           //
 output_high(Enable);
 output_low(Enable);
 delay_ms(100);

 output_B('.');      //"Write on RAM"
 output_low(Enable);       //
 output_low(RW);           //
 output_high(RS);          //
                           //
 output_high(Enable);
 output_low(Enable);
 delay_ms(100);

  output_B('.');      //"Write on RAM"
 output_low(Enable);       //
 output_low(RW);           //
 output_high(RS);          //
                           //
 output_high(Enable);
 output_low(Enable);
 delay_ms(100);
}//***************************************************
////////////// Fin Inicializacion ////////////////////

///////////////////Limpieza de pantalla///////////////
void Limpia_LCD()//***********************************
{
output_B(0x01);
output_low(Enable);
output_low(RW);
output_low(RS);

output_high(Enable);
output_low(Enable);
delay_ms(50);
}//**************************************************
///////////// Fin Limpieza Pantalla /////////////////

//////////// configuracion //////////////////////////
void Config_LCD()//**********************************
{
output_B(0x14);      //"Entry Mode set"
output_low(Enable);  // 00000110
output_low(RW);      //       ^^ movimiento del display completo (no)
output_low(RS);      //       cursor derecha->

output_high(Enable);
output_low(Enable);
delay_ms(50);
//-------------
output_B(0x14);      //"Cursor or display shift"
output_low(Enable);  // 000101XX
output_low(RW);      //    ^^^ Cursor se mueve a la dercha -->
output_low(RS);      //
                     //
output_high(Enable);
output_low(Enable);
delay_ms(50);
//-------------
output_B(0x80);      //"Set DDRAM Address"
output_low(Enable);  // 10000000
output_low(RW);      //  <     >
output_low(RS);      //
                     //
output_high(Enable);
output_low(Enable);
delay_ms(50);
}//**************************************************
/////////////////////////////////////////////////////

////////////  escritura en pantalla /////////////////

//**************************************************
/////////////////////////////////////////////////////

//|||||||||||||||||||||||||||||||||||||||||||||||||||


void main()
{
unsigned int8 caracter;
int1 bandera,flag;

flag=0;

output_low(luz);
delay_ms(2000);
Iniciar_LCD();
delay_ms(500);
Limpia_LCD();
while(true)
{

if(kbhit())
{
caracter=getc();

switch(caracter){
case 0x1B:
   if(flag==0)
     {output_high(luz);
     flag=1;
     goto papa;}
   if(flag==1)
     {output_low(luz);
     flag=0;}
     papa:
   break;
case 0x08:
   limpia_LCD();
   break;
case 0x0D:
   output_B(0xC0);
   output_low(Enable);
   output_low(RW);
   output_low(RS);

   output_high(Enable);
   output_low(Enable);
   delay_ms(50);
   break;
}
if (caracter !=0x1B)
  if(caracter != 0x08)
    if (caracter != 0x0D)
         {
         output_B(caracter);
         output_low(Enable);
         output_low(RW);
         output_high(RS);

         output_high(Enable);
         output_low(Enable);
         delay_ms(50);
         }
}



}
}
