Autor Tema: LCD 128x64 / ST7565R  (Leído 5267 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #15 en: 08 de Diciembre de 2021, 17:24:18 »
Gracias DominusDRR.

En la hoja de datos se muestra el diagrama:

https://ibb.co/Z8hCxpP

Por lo tanto utiliza el MODO 3. El código quedaría así:

void glcd_command(char command) {
   int n;

   
    output_low(GLCD_A0);       
    output_low(GLCD_CS1);       
    output_high(GLCD_SCK);
   
    for (n = 0; n < 8; n++) {
       
        output_low(GLCD_SCK);
        if (command & 0x80) {                             
            output_high(GLCD_SI);
        } else {
            output_low(GLCD_SI);
        }
   
       
        delayus(tiempobajoreloj);
        output_high(GLCD_SCK);     
        delayus(tiempaltoreloj);
        output_low(GLCD_SCK);

        command <<= 1;
    }

    // Unselect the chip
    output_high(GLCD_CS1);
}

Sin retardos en el código y suponiendo que tengo el micro corriendo a 20 Mhz la frecuencia del de la señal de reloj máxima quedaría: para 20 mhz--> 20/4=5 Mbps ----> 1/5 mhz=0,0000002 seg =0,2uS  por ciclo de instrucción. Si utilizo el SPI por hardware, podré alcanzar una mayor velocidad?

Otra duda que me surge, es la siguiente:
En la hoja de datos dice que este controlador, ST7565R, tiene dos terminales para la selección de chip. /CS1 y CS2. Cuando /CS1 =L y CS2 = H se habilita la recepción de datos. La cuestión con esto es que en el Display fisico solo se puede ver /CS, lo cual me hace suponer que CS2 está siempre con un estado lógico fijo.
Luego, como se muestra en el diagrama de arriba, habla que A0 se utiliza para determinar si los datos ingresados al display son, comandos o datos. Pero esté pin tampoco está fisicamente. Estoy tratando de ver a que se refieron los pin RES (supongo reset) y RS.  Los pines 10,11,12,13 ¿?

Esta es la imagen con los pines que tiene el display:

https://ibb.co/k1mwbYk




Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #16 en: 08 de Diciembre de 2021, 17:41:29 »

Sin retardos en el código y suponiendo que tengo el micro corriendo a 20 Mhz la frecuencia del de la señal de reloj máxima quedaría: para 20 mhz--> 20/4=5 Mbps ----> 1/5 mhz=0,0000002 seg =0,2uS  por ciclo de instrucción. Si utilizo el SPI por hardware, podré alcanzar una mayor velocidad?


Esos cálculos son si trabajaras en ensamblador, en C puede que cada línea de código se ejecute en más de 2 líneas en ensamblador dependiendo del nivel de optimización.

Respecto a la velocidad eso deberías consultarlo en las hoja de datos de tu microcontrolador, siempre hay una ecuación que te permite hallar ese valor en función del oscilador (o bus de reloj de los periféricos)

También no deberías trabajar a una velocidad mayor a la máxima que el fabricante de la pantalla debe proporcionar en la información técnica. Mientras la pantalla no esté muy lejos del MCU, podrías trabajar a la máxima velocidad.


Luego, como se muestra en el diagrama de arriba, habla que A0 se utiliza para determinar si los datos ingresados al display son, comandos o datos. Pero esté pin tampoco está fisicamente. Estoy tratando de ver a que se refieron los pin RES (supongo reset) y RS.  Los pines 10,11,12,13 ¿?


Debes googlear un poco más y sobre todo en Inglés:

Citar
A0 - sometiimes called RS

Fuente:

https://www.ladyada.net/learn/lcd/st7565.html
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #17 en: 08 de Diciembre de 2021, 18:08:41 »
Otra duda que me surge, es la siguiente:
En la hoja de datos dice que este controlador, ST7565R, tiene dos terminales para la selección de chip. /CS1 y CS2. Cuando /CS1 =L y CS2 = H se habilita la recepción de datos. La cuestión con esto es que en el Display fisico solo se puede ver /CS, lo cual me hace suponer que CS2 está siempre con un estado lógico fijo.

No debes tanto fijarte en el controlador, sino en la pantalla.

El controlador posiblemente está diseñado para manejar pantallas de mayor resolución que 128x64 y por esa razón tiene dos CS. Y como tu dices por defecto debe estar deshabilitado.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #18 en: 08 de Diciembre de 2021, 19:41:29 »
Gracias DominusDRR! Voy a empezar con las pruebas de voy posteando los resultados. Créeme que busque mucho por google, no sé como diste con esa pagina... jajaja  ((:-))

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #19 en: 09 de Diciembre de 2021, 21:07:12 »
Hola otra ves,  :-/

Parte del código que estoy terminando para esta librería, tiene la siguiente función. pgm_read_byte();. Se suponia que el codigo estaba escrito en C y esto parece ser una instrucción de ardruino..  :lol: Lo que pude ver es que esta instrucción funciona como macro que lee una palabra guardada en una posición de memoria.  El código es el siguiente:

void drawchar(int8 x, int8 line, char c){
  for (int8 i =0; i<5; i++ ) {
    buffer[x + (line*128) ] = pgm_read_byte(font+(c*5)+i);
    x++;
  }
}

Mi idea es utilizar la función strcpy para reemplazarla. Esta función se utiliza para copiar una cadena de caracteres (fuente) en el lugar que ocupaba otra (destino). Pero no estoy seguro:

void drawchar(int8 x, int8 line, char c){
  for (int8 i =0; i<5; i++ ) {
    buffer[x + (line*128) ] = strcpy (font, (c*5) + i);
    x++;
  }
}




Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #20 en: 09 de Diciembre de 2021, 23:30:01 »
Creo que no se está inicializando correctamente. Tengo que buscar si hay alguna flag que me indique que el display se inicializó correctamente.
« Última modificación: 10 de Diciembre de 2021, 01:08:23 por Pchuqui_1 »

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #21 en: 10 de Diciembre de 2021, 09:28:16 »
Hola otra ves,  :-/

Parte del código que estoy terminando para esta librería, tiene la siguiente función. pgm_read_byte();. Se suponia que el codigo estaba escrito en C y esto parece ser una instrucción de ardruino..  :lol: Lo que pude ver es que esta instrucción funciona como macro que lee una palabra guardada en una posición de memoria.  El código es el siguiente:

void drawchar(int8 x, int8 line, char c){
  for (int8 i =0; i<5; i++ ) {
    buffer[x + (line*128) ] = pgm_read_byte(font+(c*5)+i);
    x++;
  }
}

Mi idea es utilizar la función strcpy para reemplazarla. Esta función se utiliza para copiar una cadena de caracteres (fuente) en el lugar que ocupaba otra (destino). Pero no estoy seguro:

void drawchar(int8 x, int8 line, char c){
  for (int8 i =0; i<5; i++ ) {
    buffer[x + (line*128) ] = strcpy (font, (c*5) + i);
    x++;
  }
}

Esa pregunta deberías, creo hacer la pregunta en el foro de Arduino, o esperar que alguien que conozca un poco más del tema.

Según leí,  pgm_read_word lee el dato del parámetro (dirección) de la función.

En este caso font+(c*5) sería la dirección,  a la cual se incrementa con i

¿Pero la pregunta es dirección de donde? (RAM, Flash)?

Y lo que retorna es una palabra (16 ó 32 bits?)

Deberías buscar en el ejemplo de Arduino donde se utiliza esto font+(c*5), pueda que sea un array.

Como te dije al inicio, podrías hacer un simple ejemplo para poner un punto en las coordenadas x, y de la LCD y luego podrías adaptar las funciones para la pantalla KS0107 de CCS.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #22 en: 10 de Diciembre de 2021, 15:11:01 »
En el manejo del display crearon un buffer "static int8 buffer[1024]" que según entiendo se utiliza para alojar los datos de la RAM del display. "The display data RAM stores the dot data for the LCD. It has a 65 (8 page x 8 bit +1) x 132 bit structure". Y por otro lado crearon un array "int8 font[]" de mayor tamaño que el buffer.
En esa instrucción creo que están copiando datos de un array a otro.

 :lol: :lol:

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #23 en: 10 de Diciembre de 2021, 15:13:56 »
Voy a seguir tu consejo de escribir una simple coordenada en el Display, haber si puedo lograrlo.

Ya voy subiendo mas avances. Tengo que encender esta cosa..  :lol:

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #24 en: 10 de Diciembre de 2021, 16:01:34 »
Voy a seguir tu consejo de escribir una simple coordenada en el Display, haber si puedo lograrlo.

Ya voy subiendo mas avances. Tengo que encender esta cosa..  :lol:


Si tomas de ejemplo el código de la KS0107, recuerda que ahí muchas veces se necesita leer un byte desde la pantalla, pero en este caso sólo puedes escribir (sólo tienes SDI y no SDO).

Es por eso que todo hacen en un buffer o arreglo en la RAM del MCU y cuando terminas de hacer cualquier proceso, envías ese buffer a la LCD.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #25 en: 11 de Diciembre de 2021, 22:06:48 »
Estoy empezando otra vez, repasando todo porque no logro inicializar el display.

Con respecto a la comunicación estoy capturando los datos del clock y data para ver como están sincronizados. El dato que estoy enviando al PIC es 0b10100011. Como puede verse en la imagen el byte está presente en el pin GLCD_SI y el clock también. Ustedes ven algo mal con respecto a esto? (quiero descartar que no sea un problema de comunicación).  El código para esto lo listo abajo.

El programa ingresa a glcd_init(); y luego ejecuta el primer comando que es el que se ve en la foto.

img Whats-App-Image-2021-12-11-at-21-42-59" border="0 /img


#include <18F46K20.h>                                 //pic a utilizar                 

#fuses HS,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOPBADEN // el fuse
#use delay(clock=4000000)

#use STANDARD_IO(B)
#use STANDARD_IO(C)
#use STANDARD_IO(D)
#use STANDARD_IO(E)

#include "ST7565R_1.h"


void main(void)
{
   
output_high(GLCD_CS);       // Seleccionamos el chip   
output_high(GLCD_SCK);     // Reloj en alto
   
glcd_init();
glcd_command(GLCD_CMD_DISPLAY_ON);
glcd_command(GLCD_CMD_ALL_NORMAL);
glcd_contrast(0x5);
   


do{
    setpixel(20, 20, WHITE);
    display();
 

}while(true);

}


void glcd_init()
{   
   output_low(GLCD_CS);            // Select the chip
   
   output_low(GLCD_RESET);                                                      // PASO 1
   // Se estable 50 ms para estabilizar la tensión de alimentación.
   delay_ms(500);                                                                // PASO 2
   output_high(GLCD_RESET);                                                     // PASO 3
                                                               
     //0b10100010 // seleccionamos el voltaje requerido para el display         // PASO 5
     glcd_command(GLCD_CMD_BIAS_7);       
     
     // Modo Horizontal de la pantalla NORMAL
    glcd_command(GLCD_CMD_HORIZONTAL_NORMAL);    //0b10100000 //                // PASO 6
   
    // Modo Vertical de la pantall NORMAL
    glcd_command(GLCD_CMD_VERTICAL_NORMAL);    //0b11000000                    // PASO 7
   
     // Posición de inicio en la memoria RAM.
    glcd_command(GLCD_CMD_DISPLAY_START);      //0b10000000
   
    // Solo utiliza la fuente de alimentación externa. Turn on voltage converter (VC=1,VR=0,VF=0)
    glcd_command(GLCD_CMD_POWER_CONTROL | 0x4); // 0b00101000   
         delay_ms(50);
    // Solo utiliza la fuente de alimentación externa. Turn on voltage converter (VC=1,VR=1,VF=0)     
    glcd_command(GLCD_CMD_POWER_CONTROL | 0x6); // 0b00101000   
         delay_ms(50);
    // Solo utiliza la fuente de alimentación externa. Turn on voltage converter (VC=1,VR=1,VF=0)     
    glcd_command(GLCD_CMD_POWER_CONTROL | 0x7); // 0b00101000   
         delay_ms(10);
         
    // Se selecciona el valor interno de resistencia. Por default usamos un valor medio 
    glcd_command(CMD_SET_RESISTOR_RATIO | 0x6);      //  0b00100000                                                                     

    output_high(GLCD_CS);

   }


void glcd_command(char command) {
   int n;

   output_low(GLCD_RS);        // A0 low para que el dato enviado sea un comando
   delay_us(5);
   output_low(GLCD_CS);       // Seleccionamos el chip
   delay_us(5);
   
   // output_high(GLCD_SCK);
   
       
       
        if (command & 0x80) {                           //Si la comparación es 1 se pone GLCD_SDA a 1 lógico, Si es 0 GLCD_SDA se pone a 0.       
            output_high(GLCD_SI);  // Pin de datos   
        } else {
            output_low(GLCD_SI);
        }
   
        output_low(GLCD_SCK);
        delay_us(100);
        output_high(GLCD_SCK);      // Reloj regresa a 1
        delay_us(50);
       
        command <<= 1;
    }

    // Unselect the chip
    output_high(GLCD_CS);
   
 }

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #26 en: 11 de Diciembre de 2021, 22:15:48 »
Estoy empezando otra vez, repasando todo porque no logro inicializar el display.

Con respecto a la comunicación estoy capturando los datos del clock y data para ver como están sincronizados. El dato que estoy enviando al PIC es 0b10100011. Como puede verse en la imagen el byte está presente en el pin GLCD_SI y el clock también. Ustedes ven algo mal con respecto a esto? (quiero descartar que no sea un problema de comunicación).  El código para esto lo listo abajo.

El programa ingresa a glcd_init(); y luego ejecuta el primer comando que es el que se ve en la foto.

img Whats-App-Image-2021-12-11-at-21-42-59" border="0 /img


#include <18F46K20.h>                                 //pic a utilizar                 

#fuses HS,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOPBADEN // el fuse
#use delay(clock=4000000)

#use STANDARD_IO(B)
#use STANDARD_IO(C)
#use STANDARD_IO(D)
#use STANDARD_IO(E)

#include "ST7565R_1.h"


void main(void)
{
   
output_high(GLCD_CS);       // Seleccionamos el chip   
output_high(GLCD_SCK);     // Reloj en alto
   
glcd_init();
glcd_command(GLCD_CMD_DISPLAY_ON);
glcd_command(GLCD_CMD_ALL_NORMAL);
glcd_contrast(0x5);
   


do{
    setpixel(20, 20, WHITE);
    display();
 

}while(true);

}


void glcd_init()
{   
   output_low(GLCD_CS);            // Select the chip
   
   output_low(GLCD_RESET);                                                      // PASO 1
   // Se estable 50 ms para estabilizar la tensión de alimentación.
   delay_ms(500);                                                                // PASO 2
   output_high(GLCD_RESET);                                                     // PASO 3
                                                               
     //0b10100010 // seleccionamos el voltaje requerido para el display         // PASO 5
     glcd_command(GLCD_CMD_BIAS_7);       
     
     // Modo Horizontal de la pantalla NORMAL
    glcd_command(GLCD_CMD_HORIZONTAL_NORMAL);    //0b10100000 //                // PASO 6
   
    // Modo Vertical de la pantall NORMAL
    glcd_command(GLCD_CMD_VERTICAL_NORMAL);    //0b11000000                    // PASO 7
   
     // Posición de inicio en la memoria RAM.
    glcd_command(GLCD_CMD_DISPLAY_START);      //0b10000000
   
    // Solo utiliza la fuente de alimentación externa. Turn on voltage converter (VC=1,VR=0,VF=0)
    glcd_command(GLCD_CMD_POWER_CONTROL | 0x4); // 0b00101000   
         delay_ms(50);
    // Solo utiliza la fuente de alimentación externa. Turn on voltage converter (VC=1,VR=1,VF=0)     
    glcd_command(GLCD_CMD_POWER_CONTROL | 0x6); // 0b00101000   
         delay_ms(50);
    // Solo utiliza la fuente de alimentación externa. Turn on voltage converter (VC=1,VR=1,VF=0)     
    glcd_command(GLCD_CMD_POWER_CONTROL | 0x7); // 0b00101000   
         delay_ms(10);
         
    // Se selecciona el valor interno de resistencia. Por default usamos un valor medio 
    glcd_command(CMD_SET_RESISTOR_RATIO | 0x6);      //  0b00100000                                                                     

    output_high(GLCD_CS);

   }


void glcd_command(char command) {
   int n;

   output_low(GLCD_RS);        // A0 low para que el dato enviado sea un comando
   delay_us(5);
   output_low(GLCD_CS);       // Seleccionamos el chip
   delay_us(5);
   
   // output_high(GLCD_SCK);
   
       
       
        if (command & 0x80) {                           //Si la comparación es 1 se pone GLCD_SDA a 1 lógico, Si es 0 GLCD_SDA se pone a 0.       
            output_high(GLCD_SI);  // Pin de datos   
        } else {
            output_low(GLCD_SI);
        }
   
        output_low(GLCD_SCK);
        delay_us(100);
        output_high(GLCD_SCK);      // Reloj regresa a 1
        delay_us(50);
       
        command <<= 1;
    }

    // Unselect the chip
    output_high(GLCD_CS);
   
 }

Me parece que te falta un pulso más en el reloj.

¿A qué comando corresponde  0b10100011?

¿Las líneas de CS y Reset también están bien? Es decir deberías revisarlas junto al reloj (o datos) con el scope
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #27 en: 11 de Diciembre de 2021, 22:18:49 »

Me parece que te falta un pulso más en el reloj.


Me retracto, parece que es correcto 7 pulsos en el reloj.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #28 en: 11 de Diciembre de 2021, 22:32:16 »

img Whats-App-Image-2021-12-11-at-21-42-59" border="0 /img


Ya noté algo mal en la imagen de los datos y el reloj.

Los datos está inicialmente en 0, cuando ya mandas el dato, al finalizar permanece en 1 lógico.

La línea o pin de datos, cuando no se está transmitiendo, esta en reposo o modo idle, esto implica que debe estar en cero o en 1 lógico, dependiendo del modo SPI que estás trabajando.

Y me parece que en el modo que lo necesitas, debe estar en 1 lógico.

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #29 en: 11 de Diciembre de 2021, 22:53:58 »
Estoy empezando otra vez, repasando todo porque no logro inicializar el display.

Con respecto a la comunicación estoy capturando los datos del clock y data para ver como están sincronizados. El dato que estoy enviando al PIC es 0b10100011. Como puede verse en la imagen el byte está presente en el pin GLCD_SI y el clock también. Ustedes ven algo mal con respecto a esto? (quiero descartar que no sea un problema de comunicación).  El código para esto lo listo abajo.

El programa ingresa a glcd_init(); y luego ejecuta el primer comando que es el que se ve en la foto.

img Whats-App-Image-2021-12-11-at-21-42-59" border="0 /img


#include <18F46K20.h>                                 //pic a utilizar                 

#fuses HS,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOPBADEN // el fuse
#use delay(clock=4000000)

#use STANDARD_IO(B)
#use STANDARD_IO(C)
#use STANDARD_IO(D)
#use STANDARD_IO(E)

#include "ST7565R_1.h"


void main(void)
{
   
output_high(GLCD_CS);       // Seleccionamos el chip   
output_high(GLCD_SCK);     // Reloj en alto
   
glcd_init();
glcd_command(GLCD_CMD_DISPLAY_ON);
glcd_command(GLCD_CMD_ALL_NORMAL);
glcd_contrast(0x5);
   


do{
    setpixel(20, 20, WHITE);
    display();
 

}while(true);

}


void glcd_init()
{   
   output_low(GLCD_CS);            // Select the chip
   
   output_low(GLCD_RESET);                                                      // PASO 1
   // Se estable 50 ms para estabilizar la tensión de alimentación.
   delay_ms(500);                                                                // PASO 2
   output_high(GLCD_RESET);                                                     // PASO 3
                                                               
     //0b10100010 // seleccionamos el voltaje requerido para el display         // PASO 5
     glcd_command(GLCD_CMD_BIAS_7);       
     
     // Modo Horizontal de la pantalla NORMAL
    glcd_command(GLCD_CMD_HORIZONTAL_NORMAL);    //0b10100000 //                // PASO 6
   
    // Modo Vertical de la pantall NORMAL
    glcd_command(GLCD_CMD_VERTICAL_NORMAL);    //0b11000000                    // PASO 7
   
     // Posición de inicio en la memoria RAM.
    glcd_command(GLCD_CMD_DISPLAY_START);      //0b10000000
   
    // Solo utiliza la fuente de alimentación externa. Turn on voltage converter (VC=1,VR=0,VF=0)
    glcd_command(GLCD_CMD_POWER_CONTROL | 0x4); // 0b00101000   
         delay_ms(50);
    // Solo utiliza la fuente de alimentación externa. Turn on voltage converter (VC=1,VR=1,VF=0)     
    glcd_command(GLCD_CMD_POWER_CONTROL | 0x6); // 0b00101000   
         delay_ms(50);
    // Solo utiliza la fuente de alimentación externa. Turn on voltage converter (VC=1,VR=1,VF=0)     
    glcd_command(GLCD_CMD_POWER_CONTROL | 0x7); // 0b00101000   
         delay_ms(10);
         
    // Se selecciona el valor interno de resistencia. Por default usamos un valor medio 
    glcd_command(CMD_SET_RESISTOR_RATIO | 0x6);      //  0b00100000                                                                     

    output_high(GLCD_CS);

   }


void glcd_command(char command) {
   int n;

   output_low(GLCD_RS);        // A0 low para que el dato enviado sea un comando
   delay_us(5);
   output_low(GLCD_CS);       // Seleccionamos el chip
   delay_us(5);
   
   // output_high(GLCD_SCK);
   
       
       
        if (command & 0x80) {                           //Si la comparación es 1 se pone GLCD_SDA a 1 lógico, Si es 0 GLCD_SDA se pone a 0.       
            output_high(GLCD_SI);  // Pin de datos   
        } else {
            output_low(GLCD_SI);
        }
   
        output_low(GLCD_SCK);
        delay_us(100);
        output_high(GLCD_SCK);      // Reloj regresa a 1
        delay_us(50);
       
        command <<= 1;
    }

    // Unselect the chip
    output_high(GLCD_CS);
   
 }

También me parece mal como reinicias a la LCD.

O sea CS, RESET y A1 deben pasar a 1 lógico.

esperar un tiempo, por ejemplo 1 ms

RESET pasar a 0 lógico

esperar un tiempo (500ms me parece exagerado)


RESET pasar a 1 lógico

esperar 10 ms (según las hojas de datos del controlador de la LCD)

Y ahí empiezas a enviar los comandos de configuración de la LCD.



Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything