Como te comentaba hay varios problemas, por ejemplo estas modificando tu "CONTEO" pero lo ubicaste sobre la direccion del registro PIR1 lo cual en realidad estas modificando PIR1...
Este no es un error, pero no se que sentido tiene cambiarle el nombre al PCL definido en el .inc, por CONTADOR, dejale los nombres a los registros que vos uses. O usar D'14' en ves de B'1110' que es mas entendible o 0xFE en hexa que tambien es mas entendible que 14. Los NOP en la tabla no tienen sentido, podes usar un indice que comience desde 0. los NOP para que se estabilice la señal tampoco
Usa las definiciones que te da el .inc, por ejemplo INCF CONTADOR, F usar el F en ves de 1, o W en ves de 0, es mas simple de recordar, PCL y no CONTADOR, etc..
Pero el error mas grande es querer hacer todo junto.. y me refiero a todo.. multiplexar, leer teclado,etc
Al hacer esto y encima esperar que se suelte la tecla lo estas haciendo mal, ya que no vas a poder multiplexar asi. Si tenes presionada la tecla te vas a encontrar conque no muestra mas nada el display de forma correcta.
Te propongo realizar algo parecido pero un poco mas separado.
PRINCIPAL:
CALL LEER_TECLADO
CALL CARGAR_REGISTROS
CALL MOSTRAR_DISPLAY
CALL DELAY
GOTO PRINCIPAL
Voy a explicar que va a hacer cada una de las funciones.
LEER_TECLADO:
Esta subrutina debe:
- Leer el teclado, es decir el multiplexado, sin demoras entre medio, pasar y leer, apenas detecta un boton presionado sale y carga el boton presionado en algun registro, supongamos TECLA.
- Si se presiona algo debera devolver de 0x00 a 0x0F que son las teclas. Si no se presiona nada un valor ilogico como 0xFF
CARGAR_REGISTROS:
Esta subrutina va a tomar el valor de TECLA (producido en la etapa anterior) y verifica que no sea 0xFF, esto es para indicar que si debe hacer algo o no, si detecta un 0xFF sale sin hacer nada. Tambien esta subrutina debe verificar que la tecla presionada no sea la misma que la anterior!
Si detecta un numero procede a cargar el registro que corresponde, propongo tener 4 registros, uno para cada display. De esa forma poder cargar el valor a donde corresponde, tal ves aca sea bueno usar el FSR.
MOSTRAR_DISPLAY:
Esta subrutina se encarga de tomar los registros generados por CARGAR_REGISTROS, es decir los 4 numeros y mostrarlos, pero OJO, no mostrarlos todos, en cada paso muestra 1 de ellos. Es decir, la primera ves que pasa muestra el digito uno y sale, al pasar de vuelta, desactiva el digito 1 y activa el digito 2, y asi hasta el 4 y volver a comenzar. Tambien si detecta algun valor mayor a 0xF que no muestre nada.
DELAY:
Este es el secreto del programa, poner un delay que afecte a todos por igual, como el teclado no es prioritario ni necesita que se ejecute a gran velocidad, ni tampoco las otras subrutinas entonces lo unico que importa es el tiempo del multiplexado, aca pones el delay del multiplexado.
¿Cual es la ventaja de hacer esto como te lo digo?
- Independencia de las subrutinas
- Enfocadas en un solo punto.
- Facil mantenimiento y mejora la legibilidad.
Ahora lo del teclado va estar en lo del teclado. No funciona la rutina del teclado? no hay problema con lo demas, todo lo demas va a funcionar. Y sabes que tu problema esta contenido en un solo lugar.
Otra cosa... supongamos que tenemos 4 regitros DIGITO1,DIGITO2,DIGITO3 DIGITO4. Esos registros carga la subrutina CARGAR_REGISTROS. Pero todavia no la hice a esa subrutina ni tampoco la del teclado, pero quiero probar mi subrutina MOSTRAR_DISPLAY la cual usa esos 4 registros. entonces puedo modificar PRINCIPAL para que quede asi:
PRINCIPAL:
;CALL LEER_TECLADO
;CALL CARGAR_REGISTROS
MOVLW 0x01
MOVWF DIGITO1
MOVLW 0x02
MOVWF DIGITO2
MOVLW 0x03
MOVWF DIGITO3
MOVLW 0x04
MOVWF DIGITO4
CALL MOSTRAR_DISPLAY
CALL DELAY
GOTO PRINCIPAL
Y ya con ese codigo puedo probar la subrutina de multiplexacion, en ves de esperar que la subrutina sea quien cargue los valores, procedi a darle valores fijos para ver como funcionaba. Entonces puedo probar subrutina a subrutina...
Suponete que pobaste MOSTRAR_DISPLAY y funciona perfectamente con todos los valores.
Ahora es tiempo de hacer CARGAR_REGISTROS. Supongamos que escribiste la misma, recorda que esta subrutina tomaba lo que le da la subrutina de teclado y que depositaba en el registro TECLA. Entonces podemos probar que pasa si se presiona esta tecla podemos hacer:
PRINCIPAL:
;CALL LEER_TECLADO
MOVLW 0x06
MOVWF TECLA
CALL CARGAR_REGISTROS
CALL MOSTRAR_DISPLAY
CALL DELAY
GOTO PRINCIPAL
Ahora en ves de esperar que LEER_TECLADO nos devuelva la tecla, procedemos a darle una tecla fija, y ver como reacciona CARGAR_REGISTROS.
Con esto logras una "independencia", cada subrutina posee registros de entrada y de salida.
LEER_TECLADO: Entrada: PORTx Salida: TECLA
CARGAR_REGISTROS: Entrada: TECLA , Salida: DIGITO1,DIGITO2,DIGITO3,DIGITO4
MOSTRAR_DISPLAY: Entrada: DIGITO1,DIGITO2,DIGITO3,DIGITO4, Salida:PORTx
Espero que se entienda.