; **************** Inicialización de variables *********************
ORG 0X05
inicio BSF estado,banco
CLRF TRISB
BSF TRISB,int
BSF opcion,intdeg
BCF estado,banco
BCF intcon,intf
BSF intcon,GIE
BSF intcon,inte
CLRF portb
CLRF contador
CLRW
;
;
;
;
;
;
;
;
;
;
;
Cambiamos a la segunda página de memoria
Programa la puerta B como de todo salidas
Salvo la pata de interrupción PB0, que es de entrada
Interrupción PB0 cuando esté a nivel alto.
Volvemos a la página 0.
Borramos el flag de interrupción por PB0.
Habilitamos las interrupciones.
Habilitamos la interrupción por PB0.
Apaga el display, por si había residuos
Borra el contador (dirección 0x0C)
Borramos el registro W
; ************************* Cuerpo Principal **************************
Reset
CLRF digito
Siguien MOVF digito,w
CALL Tabla
; Comienza a contar por el 0
; Coloca el siguiente dígito a evaluar en W
; Llama a la subrutina para coger el dato
; y hacer la conversión decimal-7 segmentos
MOVWF portb
Pausa DECFSZ contador
GOTO Pausa
INCF digito,f
MOVF digito,w
XORLW 0x0A
BTFSC estado,Z
GOTO Reset
GOTO Siguien
;
;
;
;
;
;
;
;
Decrementa contador y repite
hasta que valga 0
Incrementa el valor del dígito al siguiente
Pone el valor del dígito en W
Chekea si el dígito sobrepasa el valor 9
Comprobando con un xor si W vale 0 (Z=1)
Si Z=1 resetea el dígito y comienza de nuevo la cuenta
En caso contrario, continua la cuenta
; ********************** La tabla queda definida aquí *********************
Tabla
ADDWF pc,f
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RSI
0x7F
0x0C
0xB6
0x9F
0xCC
0xDA
0xFA
0x0F
0xFF
0xDF
BTFSS intcon,intf
RETFIE
pulsado BTFSC portb,0
GOTO pulsado
MOVLW 0xFF
MOVWF digito
BCF intcon,intf
BSF intcon,inte
RETFIE
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Suma al contador de programa el valor de offset, es decir,
el valor del dígito. Así se genera un PC distinto
según su valor,
asegurando que vaya a la línea correcta de la tabla
0 en código 7 segmentos (desplazado a la izquierda)
1 en código 7 segmentos (desplazado a la izquierda)
2 en código 7 segmentos (desplazado a la izquierda)
3 en código 7 segmentos (desplazado a la izquierda)
4 en código 7 segmentos (desplazado a la izquierda)
5 en código 7 segmentos (desplazado a la izquierda)
6 en código 7 segmentos (desplazado a la izquierda)
7 en código 7 segmentos (desplazado a la izquierda)
8 en código 7 segmentos (desplazado a la izquierda)
9 en código 7 segmentos (desplazado a la izquierda)
; Si no es interrumpido por PB0, volver al programa
; Retenemos hasta que se suelte el pulsador
;
;
;
;
Puesto que se habrá de incrementar
Ponemos el marcador a FF
Borramos la bandera de interrupción
Y rehabilitamos la interrupción por PB0
END
105