Normalmente es por problemas de programacion, Cada CALL deberia llegar a 1 RETURN, Si hay un CALL y existe la posibilidad de que NO llegue a un RETURN ocurre ese problema que comentas. Tenes que entender que los CALLs es poner una direccion en el stack, y el RETURN es quitarlo, El stack de los PICs es limitado.
Entonces apenas viendo el programa me encuentro con esto:
VERIFICAR
CALL TECLADO ; Rutina que me ubica el número de la matriz
CALL CONTADOR_1 ; Rutina que me cuenta el primer o segundo dígito para formar la letra
;COORDENADAS DE LA MATRIZ - COMIENZO DE LA RUTINA DE MATRICIAL
TECLADO
CLRF PORTB
Supongamos por el momento que los primeros CALL, es decir a Teeclado y contador_1 llegan a un RETURN y vuelven ( Es decir cancelarian esos 2 CALL - 2 ingresan, 2 egresan- ), Luego de volver del Contador_1 lo proximo a ejecutarse es el CLRF de Teclado, Si suponiamos que llegaba si o si a un RETURN la rutina Teclado , lo cual es obvio que esta vez NO posee un CALL. Y estamos en presencia de un "
stack underflow", un problema que debe ser arreglado, distinto de seria esto:
[code=asm]VERIFICAR
CALL TECLADO ; Rutina que me ubica el número de la matriz
CALL CONTADOR_1 ; Rutina que me cuenta el primer o segundo dígito para formar la letra
GOTO VERFICAR
;COORDENADAS DE LA MATRIZ - COMIENZO DE LA RUTINA DE MATRICIAL
TECLADO
CLRF PORTB
Ese es uno de los problema con el stack que tenes.
--------------
Ahora suponiendo que esta arreglado el tema y es como lo puse al ultimo, es decir el loop principal ejecutaria esos CALL nomas y volveria hacerlo una y otra ves. Nos encontramos con el siguiente problema..
Contador_1 permite que siempre se ejecuten CALL pero nunca RETURN. Supongamos que se ejecuta la rutina Verificar, realiza el primer CALL y sale, Luego realiza el segundo CALL y va a CONTADOR_1, el codigo es el siguiente:
CONTADOR_1 ; Verifica cuántas teclas se han pulsado para arrojar la tecla
DECFSZ DOSDIG
GOTO DIG_1
GOTO DIG_2
DIG_1 ; Primer dígito me manda de nuevo
MOVF VALOR,W ; a la rutina del
MOVWF DIG1 ; matricial para
CLRF VALOR ; que busque el
GOTO VERIFICAR ; otro dígito
Suponete ahora que entra a DIG_1, se ejecutan todos las instrucciones y... tenes un GOTO VERIFICAR , es decir que no existio nunca un RETURN, por lo tanto ese CALL se queda sin RETURN, ahora si esto se ejecuta varias veces te encontras con un "
stack overflow" Por que estas poniendo en el stack y nunca sacando.
----------------
Ahora veamos otro lugar donde hay problemas...
DIG_2 ; Ya se ingresó el segundo
MOVF VALOR,W ; dígito
MOVWF DIG2 ; preparo
CLRF VALOR ; para que
CALL SUMA_DIG ; me forme la suma de los dos dígitos, si es 40,41..., 50, 51... , 60, 61...
CALL BUSCAR_LETRA ; rutina que me ubica exactamente qué letra es con los dígitos que se ingresaron,
;MOVLW 1 ;en este ejemplo, la tabla se encuentra en la página 1.
;MOVWF PCLATH ;carga el número de página en PCLATH
CALL ASIG_LETRA ; ¡¡¡RUTINA CON PROBLEMAS!!!
En ves de ir a DIG_1 ahora vamos a DIG_2, el primer CALL ( SUMA_DIG) Posee RETURN si o si, por lo tanto es correcto, el Segundo CALL que es BUSCAR_LETRA miramos el codigo y:
BUSCAR_LETRA ;COMPARO BIT POR BIT EL NÚMERO FORMADO EN ASCII PARA QUE ME MANDE A LA LETRA QUE DESEO
CLRF BUSCA
BTFSS RESULT,6
GOTO VERIFICAR
Observamos que puede existir la posibilidad que si el bit 6 de RESULT es 0 Vuelva a VERIFICAR, SIN usar un RETURN, y tendriamos otra posibilidad mas de
stack overflow-----------------------------
Respecto a como hiciste el tema de las letras, te aconsejo el uso de tablas, queda de forma mucho mas legible.