Hola, Meta:
En verdad que esta vez sí tenías muchos errores. Te mencionaré unos pocos:
1. La rutina para enviar mensaje al LCD nunca borraba la pantalla. Por eso el mensaje ocupaba todo el LCD.
Aquí te pongo la subrutina corregida. Nota que la única diferencia es que esta vez sí se borra la pantalla.
M24LC256_Mensaje_a_LCD
movwf M24LC256_AddressHigh ; Apunta al inicio de la página correspondiente.
clrf M24LC256_AddressLow
call M24LC256_InicializaLectura
call LCD_Borra ; Borra la pantalla.
M24LC256_LeeOtroByte
call I2C_LeeByte ; Lee la memoria 24LC256.
movwf M24LC256_ValorCaracter ; Guarda el valor de carácter.
movf M24LC256_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
btfsc STATUS,Z ; que sea "0x00", que es código indicador final
goto M24LC256_FinMensaje ; del mensaje, sale de la subrutina.
movf M24LC256_ValorCaracter,W ; Recupera el valor leído.
call LCD_Caracter ; Lo visualiza en la pantalla del LCD.
incf M24LC256_AddressLow,F ; Apunta a la siguiente posición.
goto M24LC256_LeeOtroByte
M24LC256_FinMensaje
call M24LC256_FinalizaLectura
return
2. En tu programa principal tienes un bucle infinito:
Principal
movlw PAGINA_00
call M24LC256_Mensaje_a_LCD
call Retardo_2s
goto Principal
Si no lo quitas jamás vas a llegar a la zona de configuraciones (mejor, porque en la zona donde están las configuraciones tienes el error más grande).
3. En tu código tienes esto:
movf PORTC,W
andlw b'00111111'
addwf PCL,F
call Configuracion
Eso está bastante mal, porque la instrucción addwf PCL,F es el encabezado de las configuraciones. Esa instrucción debería estar dentro de la subrutina Configuracion.
movf PORTC,W
andlw b'00111111'
call Configuracion
Y dentro de la rutina Configuracion:
Configuracion
addwf PCL,F ; Aquí debe estar la instrucción addwf PCL,F.
goto Configuracion0 ; 0 0 0 0 0 0
goto Configuracion1 ; 0 0 0 0 0 1
goto Configuracion2 ; 0 0 0 0 1 0
.
.
.
4. Tu rutina Configuración nunca retorna (nunca ejecuta la instrucción return).
Lo que sucede es que en tu rutina Configuración pones instrucciones de brinco:
goto Configuracion0
goto Configuracíon1
.
.
y en las respectivas zonas de códigos ejecutas un goto al programa principal.
Configuracion1
goto ActivaSalida
.
.
.
ActivaSalida
goto Principal
Nunca ejecutas Return.
5. Por estética, es mejor que todos los elementos de una rutina estén todos en un mismo archivo. ¿Qué es lo que sucede con tu código?
La rutina Configuracion hace brincos (goto) hacia instrucciones que se encuentran en tu programa principal. Lo mejor es que esas instrucciones se encuentren también dentro del archivo de la subrutina de Cofiguracion.
En fín, te mandé al correo el programa corregido. Este sí debes revisarlo muy bien, porque le corregí muchas cosas.
Sigue echándole muchas ganas. Yo también empecé así. Me ocurrió casi de todo. He cometido casi todos los errores que se pueden cometer en ensamblador y es por eso que he podido resolver los tuyos.
Saludos.