Pero hay que contar la limitacion de por ""ejemplo 2 "" ciclos que es lo que se tarda en cargar un nuevo byte al modulo una vez enviado .
Ya que si el spi va rapido y tardamos mucho en cargarlo , veremos en la pantalla franjas negras entre bytes .
El spi habria que configurarlo a la velocidad que se toma en cargar un byte en el .
O si nó configurar un TMR para que lo cargue en el momento justo.
Bueno ya modifiqué las librerías de Ucontrol para este bichito.
los pines se pueden cambiar en el principio de la misma.
//Pines a usar
#define GLCD_CS1 PIN_E2
#define GLCD_CS2 PIN_E1
#define GLCD_DI PIN_C3
#define GLCD_RW PIN_C2
#define GLCD_E PIN_C1
#define GLCD_RESET PIN_E0
#define GLCD_BUSY PIN_C4
#define GLCD_CHECK PIN_C5
//Lados del GLCD
#define GLCD_lado_CS1 0
#define GLCD_lado_CS2 1
BYTE GLCD_leeBYTE(int1 lado);
//-----------------------------------------------------------------------
//Escribe un byte en una de las mitades de la pantalla (lado=0:izq Lado=1:der)
//-----------------------------------------------------------------------
void GLCD_enviaBYTE(int1 lado, BYTE dato)
{
if(lado) output_high(GLCD_CS2); // Selecciono la mitad correspondiente
else output_high(GLCD_CS1);
output_low(GLCD_RW); // Modo escritura
output_d(dato); // Coloco el dato en el puerto y...
if(input(GLCD_CHECK)) while ( input(GLCD_BUSY) );
else delay_us(1); // ...espero.
output_high(GLCD_E); // Pongo el bit Enable en alto y...
if(input(GLCD_CHECK)) while ( !input(GLCD_BUSY) );
else delay_us(2); // ...espero.
if(input(GLCD_CHECK)) while ( input(GLCD_BUSY) );
output_low(GLCD_E); // Pongo el bit Enable en bajo.
output_low(GLCD_CS1); // Libero la linea CS1 y...
output_low(GLCD_CS2); // CS2.
}
//-----------------------------------------------------------------------
// Lee un byte de una de las dos mitades de la pantalla
//-----------------------------------------------------------------------
BYTE GLCD_leeBYTE(int1 lado)
{
BYTE dato;
set_tris_d(0xFF); // Puerto D como entrada
output_high(GLCD_RW); // GLCD en Modo lectura
// Selecciono la mitad del display a leer.
if(lado) output_high(GLCD_CS2);
else output_high(GLCD_CS1);
if(input(GLCD_CHECK)) while ( input(GLCD_BUSY) );
else delay_us(1); // ...espero.
output_high(GLCD_E); // Pongo en alto el pin enable y...
if(input(GLCD_CHECK)) while ( !input(GLCD_BUSY) );
else delay_us(2); // ...espero.
if(input(GLCD_CHECK)) while ( input(GLCD_BUSY) );
dato = input_d(); // Guardo en "dato" el valor devuelto y...
output_low(GLCD_E); // ...pongo en bajo el pin enable.
// Vuelvo a poner en bajo las lineas CS1 y CS2.
output_low(GLCD_CS1);
output_low(GLCD_CS2);
return dato;
}
también ya está listo el asm para el generador de video (adjuntado), con carga y lectura de datos, carga de ejes x e y en cada sector. encendido y apagado del mismo.
le falta el tema del eje Z, el pin de reset y leer el byte de status.
También se pueden cambiar los pines en los #define del principio.
mas tarde posteo el circuito recomendado, con sus resistencias y todo.
Tengo un par de dudas, la primera es que sucede en una glcd convencional cuando se pone en bajo el pin de reset, se borra toda la ram?
ya que en el datasheet no está aclarado y me gustaría saber sus experiencias para implementarlo.
Otra duda que tengo es cuando el eje y pasa del valor 63 y se vuelve a cero, ¿cambia de línea? o ¿vuelve al principio de la misma?
creo que es la segunda opción pero no estoy seguro.
saludos!