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

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
LCD 128x64 / ST7565R
« en: 29 de Noviembre de 2021, 13:45:10 »
Hola a todos.

Queria consultarles si tienen conocimiento donde puedo conseguir una libreria para CCS C  para un LCD SPI con controlador ST7565R. Lo busqué en el foro pero hay poca información al respecto.

Muchas gracias.

Saludos  a todos

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #1 en: 29 de Noviembre de 2021, 13:51:10 »
Hola a todos.

Queria consultarles si tienen conocimiento donde puedo conseguir una libreria para CCS C  para un LCD SPI con controlador ST7565R. Lo busqué en el foro pero hay poca información al respecto.

Muchas gracias.

Saludos  a todos

Podrías adaptar  este código con el  compilador que estas usando:

https://github.com/andygock/glcd/blob/master/controllers/ST7565R.c

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

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #2 en: 29 de Noviembre de 2021, 14:21:32 »
Gracias Dominus por el aporte. Lo voy a intentar y voy subiendo los avances al foro. Asi lo tenemos todos (si logro hacerlo funcionar)  :oops:

Un abrazo

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #3 en: 29 de Noviembre de 2021, 14:38:47 »
Gracias Dominus por el aporte. Lo voy a intentar y voy subiendo los avances al foro. Asi lo tenemos todos (si logro hacerlo funcionar)  :oops:

Un abrazo

Respecto a las LCD gráficas monocromáticas es que si logras encontrar un ejemplo de sólo ponga un punto en las coordenadas X,Y. Lo demás eso solo adaptar las funciones de otras librerías.

Por ejemplo del PICC yo adapte sus librerías para una pantalla gráfica KS0107 que tiene un bus en paralelo para su control a una pantalla china (LM12832HCW) con comunicación SPI. Lo adapté (o podría decirse que copie las funciones) para el compilador XC32.
« Última modificación: 02 de Diciembre de 2021, 18:01:02 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #4 en: 29 de Noviembre de 2021, 16:23:23 »
Lo máximo que legué hacer es usar dos LCD KS0107 en paralelo. Esas librerias las modifiqué para está función.
Pero con este controlador chino que hago referencia (ST7565R) nunca trabajé y lo tengo que sacar  :).

Salgo del trabajo, llego a casa y me pongo con el segundo trabajo... jajaj 

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #5 en: 29 de Noviembre de 2021, 17:05:04 »
Encontré esta referencia también. Puede ser de utilidad a la hora  de anailizar. La comparto para no perderla.

https://asf.microchip.com/docs/latest/xmega.drivers.crc.example2.xmega_a3bu_xplained/html/group__st7565r__lcd__controller__group.html#ga26cd5aaf71339531a2dff6646b4572be

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 209
Re:LCD 128x64 / ST7565R
« Respuesta #6 en: 01 de Diciembre de 2021, 01:40:50 »
pregunta, éste lcd del que hablan, tiene modelo para simular en el Isis Proteus?, desde que versión?

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #7 en: 02 de Diciembre de 2021, 01:26:47 »
Yo no puede encontrar ninguna libreria para simular en Proteus.  :5]

Ya voy a empezar a subir lo que tengo de la libreria para ccs c.

Saludos

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re:LCD 128x64 / ST7565R
« Respuesta #8 en: 03 de Diciembre de 2021, 23:53:23 »
Como estás Pchuqui_1,

Te comento, hace como 2 meses aproximadamente, me tocó tener que hacer una librería para el display ST7920. En su momento no encontré nada, tuve que ponerme a programar algo desde 0.

Mis pasos fueron los siguientes:

1 - Agarrar un arduino, conectar todo y probar la librería básica de control.
2 - Una vez funcionando, armé el mismo circuito con PIC.
3 - Me puse a copiar función por función, mirando cada tanto la hoja de datos por si algo se me pasaba por alto (más que nada por los tiempos entre comandos....)
4 - Probé las funciones básicas para el modo texto, que es escribir algo.
5 - Probé las funciones básicas para el modo gráfico, que es dibujar unos pixel.

Me habrá llevado un fin de semana intenso de trabajo, pero se puede.

Algo a tener en cuenta, para este tipo de cosas proteus no sirve, te va a tocar probar en físico.

Saludos !

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #9 en: 07 de Diciembre de 2021, 19:53:02 »
Hola a todos. Pude avanzar un poco con la libreria y comparto los avances para saber sus opiniones. El programa se compiló y no arrojó ningún error, pero tengo dudas en los PASOS 11, 12 Y 13.

La idea es ir compilando de auna función a la vez, para trabajar en el funcionamiento.
En este caso comencé con la funcion de inicialización del Display "void glcd_init()".


El datasheet del controlador se puede descargar del siguiente link.
https://pdf1.alldatasheet.com/datasheet-pdf/view/326163/SITRONIX/ST7565R.html

La inicialzación del display sigue la secuencia descripta en la figura:

https://ibb.co/7kCfHwB



#ifndef _ST7565_H_
#define _ST7565_H_

// Configuración pines SPI
#define GLCD_CS1 PIN_A5         // Selección de chip.
#define GLCD_RESET PIN_A2       // Si /RES =0 el registro seleccionado se limpia
#define GLCD_A0 PIN_A0          // A0 = 1: D0 a D7 se configuran como datos de visualización. A0 = 0: son pines de control
#define GLCD_SCL PIN_C3         // Pin de clock
#define GLCD_SDA PIN_C5         // Pin de data


#define SCREEN_WIDTH 128        // Ancho de pantalla
#define SCREEN_HEIGHT 64        // Largo pantalla


////////////////////////////////////COMANDOS//////////////////////////////////////////////////////////////////////////////////////////////

#define GLCD_CMD_DISPLAY_ON       0b10101111       // Encendemos el display
#define GLCD_CMD_DISPLAY_OFF      0b10101110       // Apagamos el display

#define GLCD_CMD_ALL_NORMAL       0b10100100       // Permite forzar todos los puntos del display en ON sin importar en contenido de la RAM. MODO NORMAL. El contenido de la RAM no se pierde.
#define GLCD_CMD_ALL_ON           0b10100101       // Permite forzar todos los puntos del display en ON sin importar en contenido de la RAM. MODO ON. El contenido de la RAM no se pierde.
// Cuando el dsiplay está OFF, ejecutando este el comando GLCD_CMD_ALL_ON el display se pondrá en modo SLEEP.

#define GLCD_CMD_DISPLAY_NORMAL    0b10100110      // Permite invertir la pantalla sin sobreescribir la memoria RAM. MODO NORMAL
#define GLCD_CMD_DISPLAY_REVERSE   0b10100111      // Permite invertir la pantalla sin sobreescribir la memoria RAM. MODO INVERTIDO


#define GLCD_CMD_BIAS_9            0b10100010      // Seleciona el voltaje requerido para el display. 1/9 th
#define GLCD_CMD_BIAS_7            0b10100011      // Seleciona el voltaje requerido para el display. 1/7 th

//Se revierte la correspondencia entre los datos de las columnas de la RAM y los segmentos de salida del driver.
//Se deberá usar la instrucció glcd_flip_screen para que el ancho se configure correctamente.
#define GLCD_CMD_HORIZONTAL_NORMAL   0b10100000     // MODO NORMAL
#define GLCD_CMD_HORIZONTAL_REVERSE   0b10100001    // MODO REVERSE

// Permite revertir la pantalla verticalmente.
#define GLCD_CMD_VERTICAL_NORMAL   0b11000000       // MODO NORMAL   
#define GLCD_CMD_VERTICAL_REVERSE  0b11001000       // MODO REVERSE

// Configura la fuente de alimentación. Tiene tres modos: 1) Booster circuits, 2) Voltage regulator, 3) Voltage follower cirtuits.
// Estos modos pueden ser usados independientente del uso del los comandos Power Control Set.
// Ver pag. 31 datasheet
#define GLCD_CMD_POWER_CONTROL      0b00101000      // Solo utiliza la fuente de alimentación externa


// Este comando configura el Vo= (1+Rb/Ra)*Vev. Puede ser utilizado para controlar por comandos (sin añadir resistencias externas) el brillo de la pantalla. Paguina 33/46 datasheet.
// Se utilizan 2 bytes para la configuración.
// El "Electronic Volume Set" se configura con "Electronic Volume Mode SET" y "Electronic Volume Register Set"
#define GLCD_CMD_RESISTOR         0b00100000       // 0b00000000 63   0b00111111 0. The "Electronic Volume Register SET"
#define GLCD_CMD_VOLUME_MODE      0b10000001       // The Electronic Volume Mode Set. Cuando se ingresa este comando se habilita el "Electronic Volume Set"

// Este comando se utiliza para especificar la posición de inicio en la memoria RAM. 0b01000000 posición 0. 0b01111111 posición 63
// Se puede utilizar para hacer screen srolling, page swapping. INTERESANTE  PAGUINA 26
#define GLCD_CMD_DISPLAY_START    0b01000000       // POSICIÓN 0

// Este comando especifica la dirección de la columna de los datos mostrados en RAM. La columna de direcciones se divide en dos secciones ( higher 4 bits y lower 4 bits). PAGUINA 42
#define GLCD_CMD_COLUMN_LOWER      0b00000000     // 0b00000000 Column address 0 0b10000011 Column address 131

#define GLCD_CMD_COLUMN_UPPER      0b00010000    // Se selecciona los 4 bits mas significantes de la columna.
#define GLCD_CMD_SET_PAGE          0b10110000     // Se selecciona la paguina actual (0..7))

// Este comando inicializa: la linea de inicio, la dirección de la columna, la dirección de la paguina, el Vo, el common output mode, the electronic volume y read/modify/write mode
// El test mode se libera
// No impacta en los datos de la RAM.
#define GLCD_CMD_RESET            0b11100010

// No realiza operación alguna. El datasheet suguiere enviar este comando periodicamente.
#define   GLCD_CMD_NOP            0b11100011
#endif // _ST7565_H_


/////////////////////////////////////////////////////////////////////////
// Funciones
/////////////////////////////////////////////////////////////////////////
void glcd_init();       // Inicializamos la pantalla. Tenemos que llamar a esta rutina primero
void glcd_command(char); // Enviamos un comando al Display. 
/////////////////////////////////////////////////////////////////////////


 // Inicialización del Display Pagina 51
   void glcd_init()
{

   output_low(GLCD_SCL);            // Initialize SCL
   output_low(GLCD_SDA);            // Initialize SD
   output_low(GLCD_CS1);            // Select the chip
   
   output_low(GLCD_RESET);                                                                  // PASO 1
   // Se estable 50 ms para estabilizar la tensión de alimentación.
   delay_ms(50);                                                                                   // PASO 2
   output_high(GLCD_RESET);                                                               // PASO 3

    // Según datasheet 1ms                                                                    // PASO 3
    delay_ms(1);                                                               

    // Se resetea el Display
     glcd_command(GLCD_CMD_RESET);                                              // PASO 4
     
     //0b10100010 // seleccionamos el voltaje requerido para el display         // PASO 5
     glcd_command(GLCD_CMD_BIAS_9);       
     
     // 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_REVERSE);    //0b11000000                    // PASO 7

    // Se selecciona el valor interno de resistencia. Por default usamos un valor medio 
    glcd_command(GLCD_CMD_RESISTOR | 0x3);      //  0b00100000                  // PASO 8

    // Volume set (brightness control).  A middle value is used here
    // also.
    glcd_command(GLCD_CMD_VOLUME_MODE | 0x31 );  //0b10000001                     // PASO 9
   
     // Solo utiliza la fuente de alimentación externa
     glcd_command(GLCD_CMD_POWER_CONTROL | 0x7); // 0b00101000                   //PASO 10
    //   DelayMs(10);

    // Posición de inicio en la memoria RAM.
    glcd_command(GLCD_CMD_DISPLAY_START);                                       // PASO 11

    // Encendemos el display
    glcd_command(GLCD_CMD_DISPLAY_ON);                                          // PASO 12

    // Deseleccionamos el chip
    output_high(GLCD_CS1);                                                      // PASO 13
}
   
 void glcd_command(char command) {
   int n;

   
    output_low(GLCD_A0);        // A0 low para que el dato enviado sea un comando

   
    output_low(GLCD_CS1);       // Necesario para seleccionar modo SPI

    for (n = 0; n < 8; n++) {

        if (command & 0x80) {       // Porque utiliza 0x80??
            output_high(GLCD_SDA);
        } else {
            output_low(GLCD_SDA);
        }
   
        // Pulse SCL
        output_high(GLCD_SCL);
        output_low(GLCD_SCL);

        command <<= 1;
    }

    // Unselect the chip
    output_high(GLCD_CS1);
}

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #10 en: 07 de Diciembre de 2021, 20:11:46 »
Código: C
  1. if (command & 0x80)  // Porque utiliza 0x80??
  2.    {      
  3.             output_high(GLCD_SDA);
  4.    }
  5.   else
  6.   {
  7.             output_low(GLCD_SDA);
  8.   }

Está utilizando un PIN como salida SPI:

EL primer bit que pone en el PIN es el 8 y mediante (command & 0x80) verificas si dicho bit es 1 ó 0, para escribir 1 o cero en SDA

Luego el bit 7 pasa al 8, el 6 al 7, etc mediante command <<= 1; es decir lo rotas a la izquierda una vez y repites de nuevo el if hasta enviar los 8 bits del byte de comando.

Claro que si tienes un módulo SPI en tu micro, es mucho mejor utilizar eso, pero para pruebas estaría bien por el momento.

« Última modificación: 07 de Diciembre de 2021, 20:15:38 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #11 en: 07 de Diciembre de 2021, 20:28:43 »
Código: C
  1. if (command & 0x80)  // Porque utiliza 0x80??
  2.    {      
  3.             output_high(GLCD_SDA);
  4.    }
  5.   else
  6.   {
  7.             output_low(GLCD_SDA);
  8.   }

Está utilizando un PIN como salida SPI:

EL primer bit que pone en el PIN es el 8 y mediante (command & 0x80) verificas si dicho bit es 1 ó 0, para escribir 1 o cero en SDA

Luego el bit 7 pasa al 8, el 6 al 7, etc mediante command <<= 1; es decir lo rotas a la izquierda una vez y repites de nuevo el if hasta enviar los 8 bits del byte de comando.

Claro que si tienes un módulo SPI en tu micro, es mucho mejor utilizar eso, pero para pruebas estaría bien por el momento.

Ha todo esto te falta una señal de reloj que de manera similar deberías ir poniendo en 1 y en 0 al ritmo de los bits que vas poniendo en SDA.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #12 en: 07 de Diciembre de 2021, 21:12:33 »
Hola DominusDRR. Gracias por la aclaración. Voy a tratar de desarrollar la librería para que se pueda utilizar tanto por software SPI y por hardware SPI.

Quedaría así  :?:

if (command & 0x80) 
   {     
            output_high(GLCD_SDA);
            output_high(GLCD_SCL);
   }
  else
  {
            output_low(GLCD_SDA);
            output_low(GLCD_SCL);
  }

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #13 en: 07 de Diciembre de 2021, 21:35:53 »
Hola DominusDRR. Gracias por la aclaración. Voy a tratar de desarrollar la librería para que se pueda utilizar tanto por software SPI y por hardware SPI.

Quedaría así  :?:

if (command & 0x80) 
   {     
            output_high(GLCD_SDA);
            output_high(GLCD_SCL);
   }
  else
  {
            output_low(GLCD_SDA);
            output_low(GLCD_SCL);
  }

Deberías conocer que modo de operación trabaja tu LCD, en SPi hay cuatro.



Debería existir un retardo al crear la señal de reloj. Ahí le estás dando a toda la velocidad que puede ejecutar el microcontrolador. O sea la pregunta es: Sin retardos a que frecuencia es la señal de reloj.

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

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #14 en: 07 de Diciembre de 2021, 21:41:04 »
Hola DominusDRR. Gracias por la aclaración. Voy a tratar de desarrollar la librería para que se pueda utilizar tanto por software SPI y por hardware SPI.

Quedaría así  :?:

if (command & 0x80) 
   {     
            output_high(GLCD_SDA);
            output_high(GLCD_SCL);
   }
  else
  {
            output_low(GLCD_SDA);
            output_low(GLCD_SCL);
  }

Deberías conocer que modo de operación trabaja tu LCD, en SPi hay cuatro.



Debería existir un retardo al crear la señal de reloj. Ahí le estás dando a toda la velocidad que puede ejecutar el microcontrolador. O sea la pregunta es: Sin retardos a que frecuencia es la señal de reloj.


Para uno de los modos de operación sería así:
Código: C
  1. output_low(GLCD_SCL); //reloj pasa a cero, debería estar inicialmente en 1
  2. if (command & 0x80)
  3. {    
  4.         output_high(GLCD_SDA);
  5.            
  6. }
  7. else
  8. {
  9.         output_low(GLCD_SDA);
  10. }
  11. delayUs(tiempoEnBajoReloj);
  12. output_high(GLCD_SCL); //reloj regresa a 1 lógico
  13. delayUs(tiempoEnAltoReloj);
  14. command <<= 1;
« Última modificación: 07 de Diciembre de 2021, 22:33:22 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything