;Curso básico de microcontroladores PIC. micropic@lleida.org
;prac_01.asm - Programa que hace parpadear un led conectado a RB0

	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 inicio
	org	0x05	;para pasar por encima del vector de interrupción

;se configura el PORTB como salidas (TRISB = 0)
;Recuerde: el resistro TRISB está en el banco 0, por eso debe efectuarse el cambio de banco.


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
;Recuerde: el número que está depués de la "," indica el BIT del registro a que se refiere la ;instrucción.

BUCLE	bsf	PORTB,0	;pone a 1 bit 0 de PORTB, enciende el led de RB0
	call	RETARDO	;llama a la subrutina retardo
	bcf	PORTB,0	;pone a 0 bit 0 de PORTB, apaga el led de RB0
	call	RETARDO	;llama a la subrutina retardo
	goto	BUCLE	;vuelve a empezar 	


;subrutina "RETARDO" mediante dos bucles anidados se consigue un tiempode unos 196ms 
;Recuerde: la ",F" después del registro, indica que el resultado de la operación se guarda en el 
;propio registro. 


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 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
