//------Directivas para el compilador--------

#Include <16F628A.h>                                                                  //PIC utilizado
#Fuses XT, NOWDT, NOLVP , NOPUT, NOBROWNOUT, NOCPD, NOPROTECT               //Configuramos los fuses
#Use Delay (Clock=4000000)                                                            //Oscilador a 4Mhz
#Use Fast_Io(B)                                                                       //Optimizamos E/S del PORTB
#Use Fast_Io(A)                                                                 //Optimizamos E/S del PORTA
#use rs232(baud=9600, xmit=PIN_b2, rcv=PIN_b1) 
#byte portb = 0x06

void Enviar_b(void);
void Enviar_byte(void);

char EnviarB=0;
char digito='A';                                          
char Dato[]={0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int1 Enviar=0;
int1 Flag_Enviar=0;
int i=0;
int cien_useg=0;
char Data=0;
char k=0;
char aux_data=0;

#int_rda
void serial_isr()
{	
	disable_interrupts(global);
	char dat;
	dat=getch();           //almaceno dato serial(rs232) en digito
	Data=dat;
	enable_interrupts(global); 
	EnviarB=1;
}


#int_timer2               //la interrupcion por timer2
void timer2_isr(void)
{
	if(Enviar==1)
	{
		if(Dato[i]==0)
		{
			output_low(PIN_A1) ;
		}	
		if(Dato[i]==1)
		{
			output_high(PIN_A1);
		}
		i++;
	}	
	cien_useg++;
}


void main(void) 
{
	set_tris_a(0b00000000); 
	set_tris_b(0b00000010);  
    output_high(PIN_A1);

		

	//-----------------------configuramos la interrupciones-----------------------     
	disable_interrupts(global);                                          //desactivo todas las interrupciones
	
	//-----------------------configuro el timer 2-----------------------        
	setup_timer_2 ( T2_DIV_BY_1, 249,8);   						//Interrumpe cada 2ms, en teoria PR2 tendria que ser 99, pero lo ajustamos a 103
	enable_interrupts(int_timer2);                              //activo el timer0
	set_timer2(0);                                            //cargo el timer0 para que desborde en un 1ms
	
	enable_interrupts(int_rda);               					//activo interrupcion serial rs-232  
	
	//---------------------------//activo las interrupciones---------------------------------------   
	enable_interrupts(global);           

	while(true)
	{  	
		if(EnviarB==1)
		{
			putc(Data);
			Enviar_byte();
			EnviarB=0;
		}
	}
   
} 

void Enviar_byte()
{
	int j;
	k=0;
	for(j=2;j<18;j++)
 	{
		if(j%2==0)
		{
			aux_data= Data>>k ;
			Dato[j]=aux_data &  0x01;
			k++;
		}
		else
		{
			if(Dato[j-1]==0)
			{
				Dato[j]=1;
			}
			else
			{
				Dato[j]=0;
			}
 		}
	}
	Enviar_b();
}

void Enviar_b()
{
	i=0;
	Enviar=1;
	while(i<21);
	Enviar=0;
	output_high(PIN_A1);
}