;Curso básico de microcontroladores PIC.  --- micropic@lleida.org
;prac_20asm - Contador del sensor óptico en el display con suma del valor de RA0 y RA1 

	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		;registro para bucle de pausa
DISPLAY	equ	0x0D		;registro valor display (en binario)

	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		;PORTA todo entradas
	bcf	STATUS,RP0	;vuelve a banco 0 del área de datos
	clrf	PORTB		;empieza apagando display
	clrf	DISPLAY		;empieza con dato display = 0
	goto	EMPEZAR		;salta la subrutina TABLA

;subrutina Tabla de código siete segmentos para el display 

TABLA	addwf	PCL,F		;suma W al contador de programa para…
				;...desplazarse por la tabla
	retlw	b'00111111'	;0 en código siete segmentos
	retlw	b'00000110'	;1
	retlw	b'01011011'	;2
	retlw	b'01001111'	;3
	retlw	b'01100110'	;4
	retlw	b'01101101'	;5
	retlw	b'01111101'	;6
	retlw	b'00000111'	;7
	retlw	b'01111111'	;8
	retlw	b'01100111'	;9
	retlw	b'01110111'	;A
	retlw	b'01111100'	;B
	retlw	b'00111001'	;C
	retlw	b'01011110'	;D
	retlw	b'01111001'	;E
	retlw	b'01110001'	;F

;rutina de programa principal

EMPEZAR	btfsc	PORTA,4		;flanco desde sensor óptico ?
	goto	EMPEZAR		;no
	call	PAUSA		;si, pausa antirrebotes
	btfsc	PORTA,4		;se mantiene pulso ?
	goto	EMPEZAR		;no, falso flanco pulso
ESPERA	btfss	PORTA,4		;si, espera a que termine pulso
	goto	ESPERA		;no, sigue esperando
	movf	PORTA,W		;terminado pulso, carga PORTB a W
	andlw	b'00000011'	;"mascara" pone los 6 bit de más peso
	addwf	DISPLAY,F	;suma RA0-RA1 a DISPLAY
	movlw	0x10  
	subwf	DISPLAY,W	;resta 16 al valor del display
	btfss	STATUS,C	;es 16 o mayor ( => 0x10) ?
	goto	VISUALIZA	;Z=0, no, goto visualiza
	clrf	DISPLAY		;Z=1, pone a 0 display
VISUALIZA
	movf	DISPLAY,W	;pasa valor display a W para ir a la tabla
	call	TABLA		;convierte a código siete segmentos
	movwf	PORTB		;y visualiza en el display
	goto	EMPEZAR		;vuelve a esperar próximo pulso
							
;subrutina pausa

PAUSA	decfsz	CONTA_0,F
	goto	PAUSA
	return
		 
	end
