;**************************************************
;*  Al pulsar RA0 se desencadena una secuencia de *
;*  encendido en RA1 - RA2 - RA3 que en cualquier *
;*  momento puede ser detenida por RA0            *
;**************************************************
			LIST		P=16F84A
			#INCLUDE	<p16F84A.INC>
			__CONFIG	_CP_OFF & _XT_OSC & _WDT_OFF	;Code Protect off
														;Osc XT
STATUS		EQU		03H
TRISA		EQU		85H
PORTA		EQU		05H
MIN			EQU		0CH
MED			EQU		0DH
MAX			EQU		0EH

;Inicio del programa

				ORG		00H				;Direccion 00H de memoria de programa.
										;Desde esta direccion se grabara el programa.
				BSF		STATUS,5 		;Selecciona banco 1 de registros de memoria de
										;datos, para configurar las entradas y salidas
										;del puerto A
				MOVLW	B'00001'		;Carga el registro de trabajo (W) con el literal
										;binario 00001
				MOVWF	TRISA			;Se configuran RA0 como entrada y el resto como 
										;salidas
				BCF		STATUS,5		;Selecciona banco 0 de registro de memoria de datos
				CLRF	PORTA			;Pone a 0 todo el PORTA
INICIO			BTFSS	PORTA,0			;Si RA0 es 1 se salta la siguiente instruccion
				GOTO	INICIO			;Se dirige a la etiqueta INICIO
SECUENCIA		BSF		PORTA,1			;Pone a 1 RA1
				CALL	RETRASO			;Llama a la subrutina RETRASO
				BCF		PORTA,1			;Pone a 0 RA1
				BSF		PORTA,2			;Pone a 1 RA2
				CALL	RETRASO			;Llama a la subrutina RETRASO
				BCF		PORTA,2			;Pone a 0 RA2
				BSF		PORTA,3			;Pone a 1 RA3
				CALL	RETRASO			;Llama a la subrutina RETRASO
				BCF		PORTA,3			;Pone a 0 RA3
				GOTO	SECUENCIA		;Se dirige a la etiqueta SECUENCIA donde todo vuelve 
										;a comenzar

;*******************************************************************************************
; 			SUBRUTINA RETRASO			
; consiste en contar 16 veses 255
;Cantidad ciclos usados = 
;[(MAX-1) * Ciclos bucle 1 * MED + (MED - 1) * Ciclos bucle 2]+(MIN - 1) * Ciclos bucle 3 +
;Ciclos usados en la entrada de la rutina y la salida
;Cc = [(MAX-1) * 3 * MED + (MED - 1) * 7] + (MIN - 1) * 11 + 14
;*******************************************************************************************

RETRASO			MOVLW	03H				;Carga el registro de trabajo con 10H
				MOVWF	MIN				;Carga MIN con 03H
POSICION		MOVLW	0D9H			;Carga el registro de trabajo con 0D9H
				MOVWF	MED				;Carga MED con 0D9H
POSICION1		MOVLW	0FFH			;Carga el registro de trabajo con 0FFH
				MOVWF	MAX				;Carga MAX con 0FFH
POSICION2		DECFSZ	MAX,1			;Decrementa MAX en 1, guarda el resultado en 
										;MAX si la resta da 0 se salta la siguiente 
										;instruccion
				GOTO	POSICION2		;Se dirige a POSICION2 - estas dos lineas son el
										;bucle 1
				DECFSZ	MED,1			;Decrementa MED en 1, guarda el resultado en 
										;MED si la resta es 0 se salta la siguiente 
										;instruccion
				GOTO	POSICION1		;Se dirige a POSICION1 - este es el bucle 2
				DECFSZ	MIN,1			;Decrementa MIN en 1, guarda el resultado en 
										;MIN si la resta es 0 se salta la siguiente 
										;instruccion
				GOTO	POSICION		;Se dirige a POSICION - este es el bucle 3
				RETURN					;Retorna al programa principal

;****************************************
;		FIN DE LA SUBRUTINA RETRASO
;****************************************
				END						;Fin del programa
