;Curso básico de microcontroladores PIC. micopic@lleida.org
;prac_03.asm - Programa que efectua la rotación a la izquierda del PORTB, empezando por el bit 0

	list		p=16F84	;indica al ensamblador el modelo de PIC
	include		"P16F84.inc"	;incluye librería de definiciones para el PIC16F84
	__config	_CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;palabra de configuración

;con la directiva EQU se declaran los registros propios que va ha utilizar el programa

CONTA_0	equ	0x0C	;primer registro para el bucle de retardo 
CONTA_1	equ	0x0D	;segundo registro para el bucle de retardo

;se indica al ensamblador la primera posición del programa y se salta el vector de interrupción

	org	0x00	;primera posición de la memoria de programa
	goto	INICIO	;salto a la etiqueta incio
	org	0x05	;para pasar por encima del vector de interrupción

;se configura el PORTB como salidas (TRISB = 0)

INICIO	bsf	STATUS,RP0	;selecciona banco 1 del área de datos
	clrf	TRISB		;PORTB todo salidas
	bcf	STATUS,RP0	;vuelve a banco 0 del área de datos
	clrf	PORTB		;empieza apagando todos los Led


;bucle del programa principal

BUCLE	bsf	STATUS,C	;empieza con el "carry" a 1 
	clrf	PORTB		;borra PORTB (apaga todos los led)
SIGUE	rlf	PORTB,1		;rota a la izquierda
	call	RETARDO	;retardo
	btfss	PORTB,7		;comprueba si ya está encendido RB7
	goto	SIGUE		;no lo está, sigue la rotación
	goto	BUCLE		;vuelve a empezar, inicia carry a 1, apaga leds y vuelve a rotar.


;subrutina "RETARDO" mediante dos bucles anidados se consigue un tiempo de unos 196ms 

RETARDO	decfsz	CONTA_0,F	;decrementa conta_0, guarda en conta_0 (F) y salta si es 0
	goto	RETARDO		;si conta_0 no es 0, goto a etiqueta retardo
	decfsz	CONTA_1,F	;decrementa conta_1, guarda en conta_1 (F) y salta si es 0
	goto	RETARDO		;si conta_1 no es cero, repite el primer bucle 
	return			;regresa desde donde se llamó

	end			;a partir de aquí no hay más código de programa
