Problema con contador y PIC16F887 - (Ensamblador)

Buenas. Estoy haciendo un código sencillo donde:
1. Se asigna un valor a un DIP-SW
2. Se debe activar un pulsador NA
3. Se deben mostrar los valores asignados en 2 diplays 7 segmentos.

Al activar el pulsador 1 o 2 veces se deben mostrar los valores en los display la tercera vez, se debe borrar todo.
Mi problema está en que pregunto por el estado del pulsador, y luego asigno .3 a un contador que decremento hasta que llegue a 0 y borre todo, pero no está llegando a cero.
¿Alguna idea? Estoy empezado con esto de la programación en ensamblador, así que su ayuda será de gran utilidad.

Estoy trabajando con el PIC16F887
Más o menos así es lo que tengo:
PHP:
    list P=16F887
    #include p16f887.inc

    __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
    __CONFIG _CONFIG2, _WRT_OFF & _BOR21V
    CBLOCK 20H
        VALOR
        VALOR1
        CONTNA
        CONT1
        CONT2
    ENDC
    
    ORG 0

    BANKSEL    ANSEL
    CLRF    ANSEL
    CLRF    ANSELH
    BANKSEL TRISA
    MOVLW    B'11111111'
    MOVWF    TRISA
    MOVWF    TRISB
    CLRF    TRISC
    CLRF    TRISD
    BANKSEL PORTA
    CLRF    PORTA
    CLRF    PORTB
    CLRF    PORTC
    CLRF    PORTD

INICIO
    BTFSS    PORTB,0
    GOTO    INICIO
    MOVLW    .3
    MOVWF    CONTNA
    DECFSZ    CONTNA
    GOTO    MOSTRAR
    GOTO    BORRAR

;SI SE PULSO NA
MOSTRAR
    MOVFW    PORTA        ;MANDAR BITS DEL DIPS8 A LOS PINES
    ANDLW    0x0F        ;PARA SOLO USAR LOS 4BITS MAS BAJOS(CONTROLAR DISPLAY1)
    CALL    TABLA        ;ASIGNAR VALORES SEGUN LA ENTRADA DE 4BITS
    MOVWF    PORTC        ;MOVER AL DISPLAY 1
    MOVFW    PORTA        ;MANDAR BITS DEL DIPS8 A LOS PINES
    ANDLW    0xF0        ;PARA SOLO USAR LOS 4BITS MAS ALTOS(CONTROLAR DISPLAY2)
    MOVWF    VALOR        ;GUARDO EL VALOR DE LA ENTRADA
    SWAPF    VALOR,W        ;INTERCAMBIO VALORES DE LOS BITS DE ALTA Y LOS DE BAJA
    CALL    TABLA        ;SELECCIONAR NUMERO
    MOVWF    PORTD        ;MOVER AL DISPLAY 2
    GOTO    INICIO

BORRAR
    CLRF PORTA
    CLRF PORTC
    CLRF PORTD
    GOTO INICIO

TABLA
    ADDWF    PCL,F
    RETLW    B'00111111'    ;    0 3F
    RETLW    B'00000110'    ;    1 06
    RETLW    B'01011011'    ;    2 5B
    RETLW    B'01001111'    ;    3 4F
    RETLW    B'01100110'    ;    4 66
    RETLW    B'01101101'    ;    5 6D
    RETLW    B'01111101'    ;    6 7D
    RETLW    B'00000111'    ;    7 07
    RETLW    B'01111111'    ;    8 7F
    RETLW    B'01100111'    ;    9 67
    RETLW    B'01110111'    ;    A 77
    RETLW    B'01111100'    ;    B 7C
    RETLW    B'00111001'    ;    C 39
    RETLW    B'01011110'    ;    D 5E
    RETLW    B'01111001'    ;    E 79
    RETLW    B'01110001'    ;    F 71

    END
 

Adjuntos

  • Imagen1.jpg
    Imagen1.jpg
    144.9 KB · Visitas: 15
Última edición por un moderador:
Cuando acabas de mostrar el segundo display vuelves a inicio
Cuando estas en inicio vueves a cargar la variable CONTA con 3
 
En tu primera comparacion al inicio del programa.... se crea un loop infinito que no hace nada
cuando esta oprimido el switch.

Cuando no esta oprimido siempre se ajusta CONTNA a 2 y cada vez que regresas a Inicio.
Pero como no te detienes para mostrar el display ...el procesador muestra muy rapidamente su valor
y claro regresa a INICIA ... asi que solo vez 2 en el valor de CONTNA


Cuando vi tu dibujo, pense que ivas a usar el pin del PuertoB-0 como entrada externa de interrupción, pero no tienes definido ni vector de interrupción ni rutina para manejar la interrupción.
 
Última edición:
Arriba