;Curso básico de microcontroladores PIC. --- micropic@lleida.org
;prac_12.asm - Activa RB0 tantas veces como valor de PORTA.

	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

CONTA_0	equ	0x0C		;primer registro para el bucle de retardo 
CONTA_1	equ	0x0D		;segundo registro para el bucle de retardo
CONTA_2	equ	0x0E		;tercer registro para el bucle de retardo
CONTADOR	equ	0x0F		;registro contador de pitidos zumbador

	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

INICIO	bsf	STATUS,RP0	;selecciona banco 1 del área de datos
	clrf	TRISB		;configura PORTB todo salidas
	movlw	b'00011111'
	movwf	TRISA		;configura PORTA todo entradas
	bcf	STATUS,RP0	;vuelve a banco 0 del área de datos
	clrf	PORTB		;empieza apagando todos los Led
		
;programa principal

BUCLE	movf	PORTA,W	;mueve valor PORTA a W
	btfsc	STATUS,Z	;comprueba que PORTA no sea 0
	goto	BUCLE		;Z = 1, PORTA es 0, no genera pitidos
	movwf	CONTADOR	;pasa W al registro contador
SIGUE	bsf	PORTB,0		;activa zumbador	
	call	PAUSA		;tiempo de pitido
	bcf	PORTB,0		;desactiva zumbador
	call	PAUSA		;tiempo entre pitidos
	decfsz	CONTADOR,F	;decrementa contador, brico si es 0
	goto	SIGUE		;no es cero, otro pitido
	call	DELAY_3S	;retardo largo de unos 3seg.
	goto	BUCLE 

;----subrutinas de retardo 

DELAY_3S	
	movlw	.15		;se carga CONTA_2  con 15 para que el bucle retardo 
	movwf	CONTA_2  	;se repita  26 veces (196ms x 15 = 2.940ms)
	goto	RETARDO

PAUSA	movlw	.1		;se carga CONTA_2 con 1 para que el bucle retardo
	movwf	CONTA_2	;solo se ejecute una vez (196ms)
	goto	RETARDO	
		
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		; 
	decfsz	CONTA_2,F
	goto	RETARDO
	return			;regresa desde donde se llamó

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