Cargo el programa al PIC16F877A pero no hace lo que debe hacer, no hace nada

Es un contador con dos displays (Puertos B & C) y un push-button en el pin RD0 (Puerto D),
del 00 - 99 que arranca al presionar un push-button y termina al presionarse nuevamente, se queda congelado sin hacer nada mostrando el digito en el que se quedó durante un rato y después regresa a mostrar 00, en espera de que sea presionado el push-button nuevamente.

Este es mi programa. Ojalá puedan ayudarme.

-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°

Código:
    LIST P=16F877A
    #include <P16F877A.inc>
                    
                    
    __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF;

;variables
cont_inc1    equ 0x20; Auxiliar de unidades para subrutina que regresa valor de digito en 7 seg
cont_dec1    equ 0x21; Aux unidades, se decrementa
cont_inc2    equ 0x22; Aux decenas para subrutina que regresa valor de digito en 7 seg
cont_dec2    equ 0x23; Aux decenas, se decrementa
cont_ret    equ 0x24; Aux por si el boton fue presionado durante la subrutina de retardo
conta_1        equ 0x25; Auxiliares para las subrutinas de retardo
conta_2        equ 0x26;
conta_3        equ 0x27;
conta_4        equ 0x28;

;constantes
car_0    equ b'00111111'; Codigo de caracteres en 7 segmentos
car_1    equ b'00000110';
car_2    equ b'01011011';
car_3    equ b'01001111';
car_4    equ b'01100110';
car_5    equ b'01101101';
car_6    equ b'01111101';
car_7    equ b'00000111';
car_8    equ b'01111111';
car_9    equ b'01101111';
M    equ .10; Para las subrutinas de retardo 
N    equ .125;
L    equ .250;
O    equ .10;
RD0    equ .0; Pin RD0 del puerto D
;===================================

    org 0000h;

vec_reset    clrf    PCLATH;
    goto    prog_prin;

;===================================
                                        
    org 0004h;
vec_int    nop;
                    
    retfie;
;==================================

prog_ini    bsf    STATUS,RP0; Ve al banco 1
    clrf    TRISB ^0x80; Display de decenas
    clrf    TRISC ^0X80; Display de unidades
    movlw    b'11111111';
    movwf    TRISD ^0X80; RD0 para el push-button
    movlw    b'111111';
    movwf    TRISA ^0x80; Pto sin uso
    movlw    b'111';
    movwf    TRISE ^0x80; Pto sin uso
    bcf    STATUS,RP0; Ve al banco 0

    return;

;=================================

prog_prin    call     prog_ini;  Inicializa puertos

hola    movlw    car_0; Carga el caracter 0 en 7 segmentos
    movwf    PORTB; Mandalo al puerto B
    movwf    PORTC; y puerto C

feliz    btfsc    PORTD,RD0; Checa el pin del push-button
    goto    feliz; No fue presionado en boton
    call    contador; Fue presionado el boton
    goto    hola; Empieza otra vez
                    
;================================
                    
contador    nop;            

denuevo    movlw    .10; 
    movwf    cont_dec2; Mueve un 10 al aux decenas que se decrementa
    clrf    cont_inc2; Deja en ceros el aux decenas que se incrementa        

decenas    movf    cont_inc2,0; Manda el contenido de cont_inc2 a W
    call    tablon; 
    movwf    PORTB; El valor encontrado en "tablon" mandalo al Puerto B

unidades    movlw    .10; 
    movwf    cont_dec1; Mueve un 10 al aux unidades que se decrementa
    clrf    cont_inc1; Deja en ceros el aux unidades que se incrementa

aunno    movf    cont_inc1,0; Manda el contenido de cont_inc1 a W
    call    tablon;
    movwf    PORTC; El valor encontrado en "tablon" mandalo al Puerto C        
    call    retardo1s;
    decfsz    cont_ret; Decrementa en 1 el aux del retardo
    goto    nofue; El boton NO fue presionado durante la subrutina de retardo
    goto    termina; El boton fue presionado durante la subrutina de retardo

nofue    btfsc    PORTD,RD0; Vuelve a checar el estado del boton
    goto    sigue; No fue presionado, sigue contando
    goto    termina; Fue presionado

sigue    incf    cont_inc1; Incrementa en 1 el aux unidades (siguiente valor en 7 seg de "tablon")
    decfsz    cont_dec1; Decrementa en 1 el aux de unidades
    goto    aunno; Aun no es cero, sigue con las unidades
    incf    cont_inc2; Fue cero, incrementa en 1 el aux decenas (siguiente valor en 7 seg de "tablon")
    decfsz    cont_dec2; Decrementa en 1 el aux de decenas
    goto    decenas; Aun no es cero, sigue la cuenta
    goto    denuevo; Fue cero, inicia la cuenta desde el inicio 

termina    call    retardo10s;

    return;
                
;==================================

retardo1s    movlw     M; 
    movwf     conta_3; Carga valor predeterminado en aux para subrutina de retardo   

loop3    movlw     N;
    movwf     conta_2; 

loop2    movlw     L;
    movwf     conta_1; 

loop1    btfsc    PORTD,RD0; Checa el estado del boton
    goto     loopau; No fue presionado, sigue haciendo la subrutina
    goto     vealla; Fue presionado, no sigas haciendo el retardo

loopau    decfsz     conta_1,f; 
    goto     loop1;
    decfsz     conta_2,f;
    goto     loop2;
    decfsz     conta_3,f;
    goto     loop3; 
    movlw     .2;
    movwf     cont_ret; Termino el retardo, carga 2 en el aux del retardo
    goto     finish; 

vealla    movlw     .1; 
    movwf     cont_ret; Fue presionado el boton, carga 1 en el aux del retardo

finish    nop;

    return;
                        
;==============================
                    
retardo10s    movlw     O;
    movwf     conta_4; 

loop7    movlw     M;
    movwf     conta_3;    

loop6    movlw     N;
    movwf     conta_2; 

loop5    movlw     L;
    movwf     conta_1; 

loop4    decfsz     conta_1,f;
    goto     loop4;
    decfsz     conta_2,f;
    goto     loop5;
    decfsz     conta_3,f;
    goto     loop6; 
    decfsz     conta_4,f;                    
    goto     loop7;
                    
    return;
    
;=============================


tablon    addwf    PCL,f; 
    retlw    car_0;
    retlw    car_1;
    retlw    car_2;
    retlw    car_3;
    retlw    car_4;
    retlw    car_5;
    retlw    car_6;
    retlw    car_7;
    retlw    car_8;
    retlw    car_9;

;==============================                    
        
    end
 
Última edición por un moderador:
Atrás
Arriba