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.htmlLa 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);
}