;
;								EJEMPLO 8
;**************************************************************************
;* FileName	: Exampl_8.ASM
;* Date 	: 2007.08.23 (ISO Time Form YYYY.MM.DD)
;* File version : v1.00
;*
;* Author	: DAVID VILMOS
;* Company	: DV Electronics
;* Homepage	: 
;* E-mail	: vilmosd@yahoo.com
;*
;*-------------------------------------------------------------------------
;Juego de luces, y temporización.
;
;Se desea realiza una rotación secuencial en el encendido de cada led contectados a la
;puerta B. Si RA0 = 0, la rotación será de derecha a izquierda 
;y viceversa. Cada led permanece encendido 0.25 segundos (250 mS)
	
		List	p=16F818		    ;Tipo de procesador
		include	"P16F818.INC"	    ;Definiciones de registros internos

;Ajusta los valores de la palabra de configuración durante el ensamblaje:
;protección de códig y datos=OFF, LVP=OFF, WDT=OFF y OSC=INTRC_IO

		__config _CP_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_INTRC_IO


Cntr		    equ		0x20	    ;Variable para la temporización
                    
				org		0x00	
				goto	Start	    ;Vector de reset
				org		0x05

;***************************************************************************************
;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. Consiste en repetir 25 veces la temporización
;de 10mS .
;Si el PIC trabaja a una frecuencia de 4MHz, el TMR0 evoluciona cada 1uS. Si se desea tempo-
;rizar 10000 uS (10mS) con un preescaler de 256, el TMR0 deberá contar 39 eventos de 1uS (39 *
;256 * 1 = 10000uS). El valor 39 se debe introducir complementado, ya que el TMR0 es un contador
;ascendente

Delay		movlw	.25
			movwf	Cntr	        ;Carga el Cntr con 25
Delay_0		bcf		INTCON,TMR0IF	;Desconecta el flag de rebosamiento del TMR0
			movlw	~.39
			movwf	TMR0		    ;carga el TMR0 con 39
Delay_1		btfss	INTCON,TMR0IF	;Rebasamiento del TMR0 ??
			goto	Delay_1		    ;No.Todavía no han pasado los 10 mS
			decfsz	Cntr,F	        ;Decrementa Cntr. Se ha repetido 25 veces ?
			goto	Delay_0		    ;Todavía no, temporiza otros 10 ms
			return				    ;Ahora si

Start	    clrf 	PORTB		    ;Borra los latch de salida
			bsf		STATUS,RP0	    ;Selecciona banco 1
			movlw	b'01100000'
			movwf	OSCCON	    	;4MHz INT OSC
			clrf	TRISB		    ;Puerta B se configura como salida
			movlw	0x06
			movwf	ADCON1		    ;Puerta A digital
			movlw	b'00011111'	
			movwf	TRISA		    ;Puerta A se configura como entrada
			movlw	b'00000111'
			movwf	OPTION_REG	    ;Preescaler de 256 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	Right		    ;No, rotación a derecha
Left		rlf		PORTB,F		    ;Si, rotación a izquierda
			goto	Loop
Right		rrf		PORTB,F		    ;Rotación a derecha
			goto	Loop
	
			end					    ;Fin del programa fuente
