pic Jul. 2016 | Page 107

; **************** 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