;Curso básico de microcontroladores PIC. --- micropic@lleida.org
;prac_02.asm - Programa que envía varios patrones binarios al PORTB

	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)

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	movlw	b'00011000'	;carga 00011000 en W
	movwf	PORTB		;mueve W al PORTB
	call	RETARDO	;llama a la subrutina de retardo
	movlw	b'00111100'	;carga 00111100 en W
	movwf	PORTB		;mueve W al PORTB
	call	RETARDO	;llama a la subrutina de retardo
	movlw	b'01111110'	;carga 01111110 a W
	movwf	PORTB		;mueve W al PORTB
	call	RETARDO	;llama a la subrutina de retardo
	movlw	b'11111111'	;carga 11111111 a W
	movwf	PORTB		;mueve W al PORTB
	call	RETARDO		;etc.
	movlw	b'01111110'	;etc.
	movwf	PORTB		;etc.
	call	RETARDO
	movlw	b'00111100'
	movwf	PORTB
	call	RETARDO
	movlw	b'00011000'
	movwf	PORTB
	call	RETARDO
	clrf	PORTB		;apaga todos los leds (PORTB = 0)
	call	RETARDO	;llama a la subrutina de retardo
	goto	BUCLE		;vuelve a empezar 	


;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

