Hola, que tal? Tal vez algo de esto te pueda ayudar...
Yo no utilizo pic, utilizo freescale, programando en assembler...
La primer vez que quise utilizar un LCD, me pasaba lo mismo, solo se veía la primer línea y de ahí no mostraba nada mas que eso...
Busque y busque y no encontraba fallo en la rutina (una rutina para controlar LCD que me habían pasado)...
Entonces cansado de renegar, hice mi propia rutina y ahí recién me di cuenta de lo que le faltaba a la otra rutina...
Para mostrar los caracteres en el LCD, utilizo un registro con direccionamiento indexado, el cual apunta a una tabla, donde ahí están escritos los caracteres a mostrar...
Termina de mostrar toda la primer línea, cundo el caracter que carga es cero (no el número cero, ya que este en la tabla ASCII posee el valor 30 en hexadecimal)...
Cuando es cero el caracter cargado, y voy a mostrar la segunda línea, incremento el puntero del registro para que salga del cero, porque sino, quedará siempre en un lazo cerrado.
Código:
DISPLAY_L1 LDA #$80 ; ME POSICIONO EN EL COMIENZO DE LA PRIMERA LINEA
JSR W_CTRL ; ENVIO COMANDOS AL LCD
JSR DELAY40U ; ESPERO 40 uSeg
BRA CARACTER
DISPLAY_L2 LDA #$C0 ; ME POSICIONO EN EL COMIENZO DE LA SEGUNDA LINEA
JSR W_CTRL ; ENVIO COMANDOS AL LCD
JSR DELAY40U ; ESPERO 40 uSeg
CARACTER LDA T_MSJS,X ; ACC->1ER CARAC. DE TABLA T_MSJS, APUNTO CON X
BEQ OUT
JSR W_DATA ; ESCRIBO CARACTER EN LCD
INCX ; INCR. PUNTERO AL PROX. CAR.
BRA CARACTER ; BUSCO OTRO CARACTER
OUT INCX ; PARA SALIR DE 0
RTS ; Retorno
*************************
* MENSAJES *
*************************
T_MSJS
DB ' HOLA!! '
DB 0
DB ' PROBANDO '
DB 0