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
/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);
}