; ZONA DE DATOS ***************************************************

LIST P=16F876			;Procesador
INCLUDE <P16F876.INC>	;Cabecera con los operandos empleados aquí
ERRORLEVEL -205, -302 	;QUITAMOS LOS ERRORES DE BANCO EN MPLAB 

; ZONA DE VARIABLES ***********************************************

CBLOCK 0x20				;Zona de memoria de usuario en RAM
	aux
	dato
	contador_4
	PDel0
	PDel1
	PDel2
ENDC


; ZONA DE CÓDIGO **************************************************

	org 0x00
	goto configurar_entradas

configurar_entradas		;si el valor es 0 entonces es salida si el valor es 1 es entrada
	bcf STATUS, RP1		;acceso a los bancos 0 y 1
	bsf STATUS, RP0		;accedemos al banco 1 para configurar PORTA y PORTB
	movlw 0xE0
	movwf TRISB		;las patillas RB0-RB4 quedan configuradas como salida
	movlw 0x10
	movwf TRISA		;la patilla RA4 queda configurada como entrada
	bcf STATUS, RP0		;regresamos al banco 0
		
inicio
	clrf PORTB		;limpio el PORTB por si tubiera algo "activo"
	btfss PORTA, 4		;Hasta que no entre un 1 no continuo con el programa
	goto inicio
	call demora_15µs	;una vez detectado el 1 tengo que sincronizar el programa
	movlw 0x04		;preparo el contador que voy a usar
	movwf contador_4
	movlw 0x00		;limpio la variable que almacenará el dato
	movwf dato
	bsf PORTA, 3		;este va a la línea de busy del puerto paralelo
			
principal
	movlw 0x10
	btfss PORTA, 4		;el último valor a añadir dependerá de si se envia un 1 ó 0
	movlw 0x00
	addwf dato, 1
	rrf dato, 1		;desplazo lo que había antes a la derecha	
	call demora_200µs	;esta es la separación entre un envio de datos y otro
	decfsz contador_4	;hasta que no finalize el envio se continua testeando las entradas
	goto principal
	movfw dato		;ya tengo el dato
	movwf PORTB
	goto inicio

; RUTINAS DE RETARDO **********************************************
demora_200µs
	movlw     .48		; 1 set numero de repeticion 
    movwf     aux     		; 1 |
    goto PLoop0
demora_15µs
	movlw     .2		; 1 set numero de repeticion 
    movwf     aux     		; 1 |
    nop
PLoop0  
	nop              	; 1 delay
    decfsz    aux, 1  		; 1 + (1) es el tiempo 0  ?
    goto      PLoop0    	; 2 no, loop
	nop			; 1 último ciclos delay
return              		; 2+2 Fin.
; FIN DE RUTINAS DE RETARDo ***************************************
end
