        LIST 		p=16F84A
		processor 	PIC16F84A
		#include 	"P16F84A.INC"
		__CONFIG 	_CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC
	
		ERRORLEVEL	-302


#DEFINE	rx	2		; bit de recepcion de datos en serie


	CBLOCK	0x0C
		r0d		; registro de proposito general
		r0e		; registro de proposito general						           
		conta		; registro de proposito general(contador)
		recep		; buffer de entrada
	ENDC

       org    00h            ;vector de reset
       goto   inicio         ;salta al comienzo del programa
       org    05h            ;saltea el vector de interrupcion
      
start  movlw  .124           ;retardo para generar bit de arranque
       goto   startup
       
delay  movlw  .83            ;retardo para generar bit de datos

startup movwf  r0e
redo    nop                  ;pierde 12 microsegundos
        nop
        decfsz r0e,F          ;resta 1 al retardo
        goto   redo          ;si falta el tiempo itera

        retlw  0             ;si termino retorna limpiando w
        
recibir nop                  ;recibe un byte por RS232
        clrf   recep         ;limpia el buffer de recepcion
        btfss  PORTA,rx      ;mira el estado de la linea serie
        goto   $-1	     ;si esta inactiva queda a la espera

        call   start         ;retardo para bit de arranque
rec     movlw  .8            ;carga cantidad de bits a recibir
        movwf  conta
rnext   bcf    STATUS,C      ;limpia el carry
        btfss  PORTA,rx      ;mira la linea de recepcion
        bsf    STATUS,C      ;si esta en alto sube el carry

        rrf    recep,W       ;rota el buffer de recepcion
        call   delay         ;retardo entre bits
        decfsz conta,F       ;resta 1 a la cantid. de bits a recibir
        goto   rnext         ;si faltan bits para recibir itera

        retlw  0             ;si termino sale y limpia w
        
inicio  bsf    STATUS,RP0    ;selecciona la pagina 1 de memoria  
        movlw  0ffh          ;programa el puerto "a" como entradas 
        movwf  TRISA
        movlw  00h           ;programa el puerto "b" como salidas
        movwf  TRISB
        bcf    STATUS,RP0    ;selecciona la pagina 0 de memoria
        clrf   recep         ;limpia el buffer de recepcion
        clrf   PORTB         ;apaga todas las salidas
        
ciclo   call   recibir       ;queda a la espera de recibir datos
        movf   recep,w       ;carga en w el dato recibido
        movwf  PORTB          ;manda el dato a las salidas
        goto   ciclo         ;itera indefinidamente
        
        end                                    
