;
;					EJEMPLO 2.9
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para simulación y/o MicroPIC Trainer
;
;Juego de luces, otra temporización.
;
;Se desea realiza una rotación secuencial en el encendido de cada led contectados a la
;puerta B en la Trainer. Si RA0 = 0, la rotación será de derecha a izquierda y viceversa.
;Cada led permanece encendido 0.25 segundos (250 mS)
	
		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos

Contador	equ	0x0c		;Variable para la temporización
                    
		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x05		;Salva el vector de interrupción

;***************************************************************************************
;Delay es una rutina que realiza una temporización de 250 mS que es el tiempo en que han
;de permanecer encendido cada uno de los leds.
;
;Si el PIC trabaja a una frecuencia de 4MHz, el TMR0 evoluciona cada uS. Si se desea tempo-
;rizar 25000 uS (25mS) con un preescaler de 128, el TMR0 deberá contar 195 eventos (195 *
;128 = 24960). El valor 195 equivale a 0xc3 y, como el TMR0 es ascendente, habrá que car-
;gar su complemento (0x3c). Esta temporización habrá que repetirla 10 veces para conseguir
;el total deseado (250000)

Delay		movlw	.10
		movwf	Contador	;Carga el contador con 10
Delay_0		bcf	INTCON,T0IF	;Desconecta el flag de rebosamiento del TMR0
		movlw	0x3c
		movwf	TMR0		;carga el TMR0
Delay_1		clrwdt			;Refresco del WDT
		btfss	INTCON,T0IF	;Rebasamiento del TMR0 ??
		goto	Delay_1		;Todavía no han pasado los 25 mS
		decfsz	Contador,F	;Decrementa contador. Se ha repetido 10 veces ?
		goto	Delay_0		;Todavía no, temporiza 25 ms
		return			;Ahora si

Inicio	        clrf 	PORTB		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		clrf	TRISB		;Puerta B se configura como salida
		movlw	b'00011111'		
		movwf	TRISA		;Puerta A se configura como entrada
		movlw	b'00000110'
		movwf	OPTION_REG	;Preescaler de 128 para el TMR0
		bcf	STATUS,RP0	;Selecciona banco 0			                                                                         

		bsf	STATUS,C	;Activa el carry
Loop		call	Delay		;Temporiza 250mS
		btfsc	PORTA,0		;Está a 0 RA0 ??
		goto	A_Dcha		;No, rotación a derecha
A_Izda		rlf	PORTB,F		;Si, rotación a izquierda
		goto	Loop
A_Dcha		rrf	PORTB,F		;Rotación a derechas
		goto	Loop

		end			;Fin del programa fuente
