;PROGRAMA REALIZA EN LOS LEDS CORRIMIENTO HACIA LA IZQUIERDA
;Y AL LLEGAR AL LED RB7, HACIA LA DERECHA Y ASÍ SUCESIVAMENTE.
;PARA EDUPIC/EVOLUPIC 16F628

	processor 16f628
	include	  <p16f628.inc>
	__config _XT_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _BODEN_OFF & _LVP_OFF

;RESERVA LOCALIDADES PARA SUBRUTINA DE RETRASO

J	equ	H'20'	 ; localidad 20 es J
K	equ	H'21'	 ; localidad 21 es K

;DEFINE NOMBRE DE LOS BITS EN LOS PUERTOS A Y B

#DEFINE	RA0	PORTA,0
#DEFINE RA1	PORTA,1
#DEFINE RA2	PORTA,2
#DEFINE RA3	PORTA,3
#DEFINE RA4	PORTA,4
#DEFINE RB0	PORTB,0
#DEFINE RB1	PORTB,1
#DEFINE RB2	PORTB,2
#DEFINE RB3	PORTB,3
#DEFINE RB4	PORTB,4
#DEFINE RB5	PORTB,5
#DEFINE RB6	PORTB,6
#DEFINE RB7	PORTB,7

;MACROS PARA LA SELECCION DE LOS BANCOS DE REGISTROS

BANCO0	MACRO
	BCF	STATUS,RP0
	BCF	STATUS,RP1
	ENDM
BANCO1	MACRO
	BSF	STATUS,RP0
	BCF	STATUS,RP1
	ENDM

;MACRO PARA INICIALIZACION DE PUERTOS PARA 16F628

PUERTOS MACRO
	BANCO1
	CLRF	VRCON	;DESHABILITA VOLTAJE DE REFERENCIA
	MOVLW	H'1E'
	MOVWF	TRISA	;RA0=SALIDA, RA1...RA4=ENTRADAS
	CLRF	TRISB	;RB0...RB7=SALIDAS
	BANCO0
	MOVLW	7
	MOVWF	CMCON	;DESHABILITA COMPARADORES ANALOGICOS
	BCF	RA0	;RA0=0, DESACTIVA RELEVADOR
	CLRF	PORTB	;LEDS APAGADOS
	ENDM

	ORG 0		;ORIGEN DEL PROGRAMA EN LA DIRECCION 0
	PUERTOS		;MACRO PARA INICIALIZAR LOS PUERTOS DE 16F628
	BSF RB0	
eti1 RLF PORTB	;corrimiento hacia la izquierda
	CALL retro
	BTFSS RB7	;verifica si ya encendió el led RB7
	GOTO eti1
	GOTO eti2
eti2 RRF PORTB	;corrimiento hacia la derecha
	CALL retro
	BTFSS RB0	;verifica si ya llegó al led RB0
	GOTO eti2
	GOTO eti1


;rutina de retraso de 200 milisegundos 
         
retro:	movlw	D'250'	; w = 250 decimal
	movwf	J	; J = w
jloop:	movwf	K	; K = w
kloop:	decfsz	K,f	; K = K-1, omite si es cero
	goto 	kloop
	decfsz	J,f	; J = J-1, omite si es cero
	goto	jloop
	return
	
	END