;Curso básico de microcontroladores PIC.  --- micropic@lleida.org
;prac_19asm - Dado electrónico en el display conectado en el 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

CONTA_0	equ	0x0C		;registro para bucle de pausa
DADO	equ	0x0D		;registro para valor del dado

	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 como entradas
	bcf	STATUS,RP0	;vuelve a banco 0 del área de datos
	clrf	PORTB		;empieza apagando display
	goto	ESPERAR		;salta la subrutina TABLA

;Tabla de código siete segmentos para el display 

TABLA	addwf	PCL,F		;se suma W al contador de programa para…
				;...desplazarse por la tabla
	retlw	b'00111111'	;0 en código siete segmentos
	retlw	b'00000110'	;1 en código siete segmentos
	retlw	b'01011011'	;2
	retlw	b'01001111'	;3
	retlw	b'01100110'	;4
	retlw	b'01101101'	;5
	retlw	b'01111101'	;6


ESPERAR	btfsc	PORTA,0		;está pulsador "jugada" activado ?
	goto	ESPERAR		;no
	call	PAUSA		;pausa antirrebotes
	btfsc	PORTA,0		;sigue pulsador "jugada" activado ?
	goto	ESPERAR		;no, falsa pulsación
	clrf	PORTB		;si, apaga display
BUCLE	incf	DADO,F		;incrementa valor DADO
	movf	DADO,W		;pasa dado a W
	sublw	.7		;resta 7 para saber si ...
	btfss	STATUS,Z	;...dado es 7 ?
	goto	NO_7		;Z=0, no es 7
	clrf	DADO
NO_7	btfss	PORTA,0		;se ha soltado pulsador "jugada" ?
	goto	BUCLE		;no, sigue dando vueltas al dado
	incf	DADO,F		;inc. dado para que no sea "0" de forma que...
				;...dado girará entre 1 y 6
	movf	DADO,W	
	call	TABLA		;llama a tabla con el valor de dado en W
	movwf	PORTB		;visualiza dígito en display
	goto	ESPERAR		;vuelve a esperar nueva "jugada"

PAUSA	decfsz	CONTA_0,F
	goto	PAUSA
	return

	end
