TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Diego E. en 01 de Abril de 2011, 00:06:19

Título: LCD gráfico con T6913C
Publicado por: Diego E. en 01 de Abril de 2011, 00:06:19
Hola amigos, les pido colaboración por lo siguiente, llevo ya varios días tratando de hacer funcionar esta pantalla, he consultado la mayoría de ejemplos de foro y me enredo con las librerías que ofrecen,
Quiero ponerla a funcionar de la manera más comprensible para mi y hasta ahora sólo logro encender el cursor,
Alguno de ustedes me puede ayudar a presentar siquiera una sola letra ?.

Este es el código que llevo adelantado.

Muchas gracias.

Código: [Seleccionar]
#include <C:\Archivos de programa\PICC\devices\16f876A.h>

#use delay(clock=4000000)
#fuses xt,put,brownout,nowdt

#byte porta=5 //Definicion de variables del pic
#byte portb=6
#byte portc=7

#define cd porta,0 //Definicion de bits
#define ce porta,1
#define rs porta,2
#define port_lcd portb

void enviar_a_lcd(short bit_cd, int dato);

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#zero_ram //Borrado de la memoria ram

void main() //Rutina principal
{
set_tris_a(0b000000); //Configuracion de entradas y salidas del puerto A
set_tris_b(0b00000000); //Configuracion de entradas y salidas del puerto B
port_b_pullups(true); //Habilitación de las resistencias pull-ups
porta = 0;
portb = 0;

setup_adc(adc_off);

///////////////////////////////////////////////////////////////////////////////
bit_clear(rs);  //reset a la pantalla
delay_ms(1);
bit_set(rs);

//enviar_a_lcd(1,0b10000100); //atributo texto
enviar_a_lcd(1,0b10010100); //lcd como texto
//enviar_a_lcd(0,0b00000000); //direccion alta
//enviar_a_lcd(0,0b00000000); //direccion baja
//enviar_a_lcd(1,0b01000000); //direccion del texo
//enviar_a_lcd(0,0b00000000); //codigo 0x00
//enviar_a_lcd(0,0b00000001); //columnas
//enviar_a_lcd(1,0b01000001); //area de texto
enviar_a_lcd(1,0b10000000); //se utiliza patrones internos cg-rom
//enviar_a_lcd(1,0b10011000); //lcd como grafico
enviar_a_lcd(1,0b10100111); //cursor de 8 lineas
enviar_a_lcd(1,0b10010011); //cursor parpadeo
enviar_a_lcd(0,0b00000000); //posicion vertical del cursos
enviar_a_lcd(0,0b00000000); //posicion horizontal del cursos
enviar_a_lcd(1,0b00100001); //configurar posicion del cursor

enviar_a_lcd(0,16); //caracter de la cg-rom
enviar_a_lcd(1,0xc0); //enviar dato

enviar_a_lcd(0,16); //caracter de la cg-rom
enviar_a_lcd(1,0xce); //enviar dato

//////////////////////////
while(true) //Rutina general
{

}
}
///////////////////////////////////////////////////////////////////////////////
void enviar_a_lcd(short bit_cd, int dato) //rutina que escribe dato en el lcd
{
if(bit_cd) {bit_set(cd);}
else {bit_clear(cd);}
bit_set(ce);
delay_us(100);
port_lcd = dato;
delay_us(100);
bit_clear(ce);

delay_ms(1);
}
///////////////////////////////////////////////////////////////////////////////

(http://img225.imageshack.us/img225/8819/lcd128x128.jpg)

Título: Re: LCD gráfico con T6913C
Publicado por: MLO__ en 01 de Abril de 2011, 22:32:41
Hola

Yo he trabajado con una de 128x128 (aqui (http://www.todopic.com.ar/foros/index.php?topic=23122.msg213070#msg213070)) ... pero no es el mismo controlador tuyo ... es el t6963C ... no se si será compatible .....

Saludos
Título: Re: LCD gráfico con T6913C
Publicado por: Diego E. en 01 de Abril de 2011, 23:24:18
Hola Miguel gracias por responderme, si creo que sean compatibles pues la verdad yo estoy probando primero en proteus antes de comprar la pantalla, he tratado de seguir esa secuencia de comandos que he extractado de varios data-sheet pero no logro hacer que aparezca ni un solo caracter.

Saludos.
Título: Re: LCD gráfico con T6913C
Publicado por: irukza en 02 de Abril de 2011, 20:06:13
Hola
Yo trabajo con un T6963C.
En la practica anda muy bien, pero en proteus, solo funciona bien con FS1 puesto a masa.
suerte
Título: Re: LCD gráfico con T6913C
Publicado por: Diego E. en 02 de Abril de 2011, 21:14:14
Hola amigo, utilizas alguna librería o creaste todo el código ?
Lo has utilizado presentado los caracteres que trae por defecto en la CG-ROM ?

Saludos.
Título: Re: LCD gráfico con T6913C
Publicado por: MLO__ en 02 de Abril de 2011, 23:16:28
Hola.

Tengo una librería para el uso de esa GLCD y uso unas fuentes creadas en el LCD Font Creator. En estos días estoy algo ocupado .. pero a ver si saco un tiempo y posteo algo sobre ello.

Saludos
Título: Re: LCD gráfico con T6913C
Publicado por: Diego E. en 03 de Abril de 2011, 21:10:13
Gracias Miguel
Título: Re: LCD gráfico con T6913C
Publicado por: Diego E. en 01 de Agosto de 2011, 22:59:40
Hola amigos, les pido colaboración nuevamente con este tema, no he podido mostrar un sólo caracter ni prender siquiera un punto, he tratado de seguir las indicaciones del datasheet pera ha sido fallido, alguno de ustedes me puede dar una mano.

Muchas gracias

Código: [Seleccionar]
#include <16f876A.h>

#use delay(clock=4mhz)
#fuses xt,put,brownout,nowdt

#byte porta=5 //Definicion de variables del pic
#byte portb=6
#byte portc=7

#define cd porta,0 //Definicion de bits
#define ce porta,1
#define rs porta,2
#define rd porta,3
#define wr porta,5

#define port_lcd portb


void enviar_a_lcd(short bit_cd, int dato);

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#zero_ram //Borrado de la memoria ram

void main() //Rutina principal
{
set_tris_a(0b000000); //Configuracion de entradas y salidas del puerto A
set_tris_b(0b00000000); //Configuracion de entradas y salidas del puerto B
port_b_pullups(true); //Habilitación de las resistencias pull-ups
porta = 0;
portb = 0;

setup_adc(adc_off);

///////////////////////////////////////////////////////////////////////////////
bit_clear(rs);  //reset a la pantalla
delay_ms(10);
bit_set(rs);

enviar_a_lcd(1,0b10010100); //lcd como texto
enviar_a_lcd(1,0b10000100); //atributo texto
enviar_a_lcd(1,0b10000000); //se utiliza patrones internos cg-rom
enviar_a_lcd(1,0b10100111); //cursor de 8 lineas
enviar_a_lcd(1,0b10010011); //cursor parpadeo
enviar_a_lcd(0,0b00000100); //posicion vertical del cursos
enviar_a_lcd(0,0b00000100); //posicion horizontal del cursos
enviar_a_lcd(1,0b00100001); //configurar posicion del cursor

enviar_a_lcd(0,16); //caracter de la cg-rom
enviar_a_lcd(1,0xc0); //enviar dato


//////////////////////////
while(true) //Rutina general
{

}
}
///////////////////////////////////////////////////////////////////////////////
void enviar_a_lcd(short bit_cd, int dato) //rutina que escribe dato en el lcd
{

bit_set(rd);
bit_clear(wr);

delay_ms(5);

if(bit_cd) {bit_set(cd);}
else {bit_clear(cd);}
delay_us(100);
output_b(dato);
bit_set(ce);
delay_us(100);
bit_clear(ce);

delay_ms(5);
}
///////////////////////////////////////////////////////////////////////////////

Saludos.
Título: Re: LCD gráfico con T6913C
Publicado por: pablomanieri en 26 de Agosto de 2011, 19:17:13
No se si puede ser el problema pero te aconsejo usar la directiva #fast_io en los puertos que utilices.
Título: Re: LCD gráfico con T6913C
Publicado por: Diego E. en 26 de Agosto de 2011, 22:52:52
Hola Pablo, he avanzado un poco pero tengo muchos vacíos, con este código pude mostrar un cero

Código: [Seleccionar]
enviar_a_lcd(0,40); //area de texto de cada caracter
enviar_a_lcd(0,0); //
enviar_a_lcd(1,0x41); //codigo para area de texo

enviar_a_lcd(0,0); //area de texto de cada caracter
enviar_a_lcd(0,0); //
enviar_a_lcd(1,0x40); //codigo para area de texo

enviar_a_lcd(0,40); //area de grafico por cada dato
enviar_a_lcd(0,0); //
enviar_a_lcd(1,0x42); //codigo para area de grafico

enviar_a_lcd(1,0b10010011); //cursor con parpadeo
//enviar_a_lcd(1,0b10011000); //pantalla solo grafico
enviar_a_lcd(1,0b10010100); //pantalla solo texo
enviar_a_lcd(1,0b10100111); //grosor del cursos

enviar_a_lcd(0,0);
enviar_a_lcd(0,0);
enviar_a_lcd(1,0x21); //configurar addres pointer set

enviar_a_lcd(0,0);
enviar_a_lcd(0,0);
enviar_a_lcd(1,0x22); //configurar posicion offset

enviar_a_lcd(0,2);
enviar_a_lcd(0,0);
enviar_a_lcd(1,0x24); //configurar addres pointer set

enviar_a_lcd(0,16); //dato para escribir
enviar_a_lcd(1,0xc0); //comando para escribir e incrementar

pero no comprendo bien como es que cambia la dirección, si le configuro lo siguiente:

Código: [Seleccionar]
enviar_a_lcd(0,2);
enviar_a_lcd(0,0);
enviar_a_lcd(1,0x24); //configurar addres pointer set

el cero aparece 2 a la derecha y en la línea cero; pero si le doy

Código: [Seleccionar]
enviar_a_lcd(0,2);
enviar_a_lcd(0,1);
enviar_a_lcd(1,0x24); //configurar addres pointer set

esperaría que apareciera en la columna 2 fila 1, pero se desaparece.

Saludos.
Título: Re: LCD gráfico con T6913C
Publicado por: nediamolbap en 27 de Agosto de 2011, 03:48:26
saludos,

Adjunto una prueba con el 18F452 y un LCD 240x64 con controlador T6963C. ( el ejemplo lo encontre en el foro de CSS en este  enlace  (http://www.ccsinfo.com/forum/viewtopic.php?t=19957)) No se  :huh: si se pueda tratar de cuadrar para que funcione con el controlador T6913C para el LCD de 128x128?? dicho esto para no tener que crear desde 0 la libreria. :)

Título: Re: LCD gráfico con T6913C
Publicado por: Diego E. en 27 de Agosto de 2011, 09:15:13
Gracias amigo por el ejemplo.

Saludos
Título: Re: LCD gráfico con T6913C
Publicado por: Diego E. en 25 de Noviembre de 2012, 23:36:44
Hola amigos, alguien me puede explicar un poco los comandos

Cursor pointer set:
Offset register set:
Addres Pointer Set:

La verdad he leído algunas explicaciones de la web pero no logro aterrizar con esto.

Mil gracias.
Título: Re: LCD gráfico con T6913C
Publicado por: Diego E. en 27 de Noviembre de 2012, 16:37:58
Hola amigos, por fin logré entender un poco la distribución de memoria del T6963, hice esta tabla a prueba y error

(http://img525.imageshack.us/img525/7352/distribuciondememoria12.jpg)

este es el resultado

(http://img805.imageshack.us/img805/9650/dibujortu.png)

está en modo sólo texto, ahora quiero meterle el gráfico, a ver si alguien me ayuda con estas inquietudes

1. Es conveniente utilizar modo gráfico y texto simultáneamente o será mejor manejar todo como gráfico ?
2. Para gráfico he hecho pruebas enviando un byte pero sólo me toma 6 bits, si pongo el pin FS1 en 0 me toma los 8bit, que es lo más recomendable 6 u 8 bit.

Gracias.


Título: Re: LCD gráfico con T6913C
Publicado por: MLO__ en 02 de Diciembre de 2012, 10:19:27
Hola

Se que ha pasado tiempo  :oops: :oops: ... pero al fin la encontre!!!!!

La libreria esta modificada para trabajar con la pantalla de 128x128, reconoce la letra ñ y Ñ, ajusta el espacio de interespacio con algunas letras, maneja dos fuentes: una de 5x7 y otra de 3x3.

Para inicializarla:
Código: C#
  1. GDispInit();                                   
  2.         FontSize = 8;                                          
  3.         GDispSetMode(XOR_MODE|INT_CG_MODE);
  4.         GDispSetMode(TEXT_GRH_ON);             
  5.         GDispClrTxt();                                         
  6.         GDispClrGrh();

Para cargar la siguiente pantalla:

(http://img51.imageshack.us/img51/1194/pantallazoglcd.png)

lo hago asi:

Código: C#
  1. strcpy(DataBufer,"Unicauca");
  2.                         GDispPixFontAt(22,1,DataBufer,2,Black);
  3.        
  4.                         strcpy(DataBufer,"DSC-CYTEMAC");
  5.                         GDispPixFontAt(33,17,DataBufer,1,Black);
  6.  
  7.                         strcpy(DataBufer,"2009");
  8.                         GDispPixFontAt(53,26,DataBufer,1,Black);
  9.  
  10.                         GDispDefIcon32X32(IconoMLO);
  11.                         GDispIcon32X32At(5,6,IconoMLO);
  12.  
  13.                         strcpy(DataBufer,"CONTROL DIGITAL DE TEMPERATURA");
  14.                         GDispPixFontSm(7,78,DataBufer,1,1);
  15.  
  16.                         strcpy(DataBufer,"Miguel Ordoñez");
  17.                         GDispPixFontAt(1,98,DataBufer,1,black);
  18.        
  19.                         strcpy(DataBufer,"Miguel Parra");
  20.                         GDispPixFontAt(1,108,DataBufer,1,1);
  21.  
  22.                         GDispRect(127,127,88,121,1,1);
  23.                         strcpy(DataBufer,"PRESIONE #");
  24.                         GDispPixFontSm(89,122,DataBufer,1,0);

Cada vez que se quiera escribir sobre la pantalla algo nuevo, es bueno "limpiar"  :)

Código: C#
  1. GDispClrGrh();
  2.                         GDispClrTxt();

Tambien permite trabajar las funciones de lineas y demas

(http://img339.imageshack.us/img339/8674/pantallazoglcdgrafico.png)

Los iconos los cargo en otro archivo icons.h como constantes:

Código: C#
  1. const unsigned int8 IconoControlar[128] =
  2. {
  3. 0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFC,0x40,0x00,0x00,0x02,0x80,0x00,0x00,0x01,
  4. 0x8F,0xFF,0xFF,0xF1,0x90,0x00,0x00,0x09,0x90,0x20,0x00,0x09,0x90,0x20,0x00,0x09,
  5. 0x90,0x60,0x00,0x09,0x90,0x60,0x00,0x09,0x90,0x60,0x00,0x09,0x90,0x62,0x00,0x09,
  6. 0x90,0x62,0x00,0x09,0x90,0xA7,0x20,0x09,0x9F,0xA5,0x3F,0xF9,0x90,0x15,0xC0,0x09,
  7. 0x90,0x14,0x80,0x09,0x90,0x08,0x80,0x09,0x90,0x08,0x00,0x09,0x90,0x08,0x00,0x09,
  8. 0x90,0x08,0x00,0x09,0x90,0x00,0x00,0x09,0x90,0x00,0x00,0x09,0x8F,0xFF,0xFF,0xF1,
  9. 0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x03,0x9D,0xC1,0x80,0x02,0x95,0x41,
  10. 0x80,0x03,0x9D,0xC1,0x40,0x00,0x00,0x02,0x3F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00
  11. };

La funcion para cargar los iconos desde la EEPROM es:

Código: C#
  1. void GDispDefIcon32X32(unsigned int8 icon_id)//.........................Definir Icono en la GLCD leido desde 24LC256 -ver icons.h-
  2. {
  3.         unsigned int16 i, col, row;
  4.  
  5.         for(row=0; row<4; row++)
  6.         {
  7.                 for(col=0; col<4; col++)
  8.                 {
  9.                         for(i=0;i<8;i++)
  10.                         {
  11.                                 CGBuffer[i] = read_ext_eeprom(32*row + i*4 + col + (unsigned int16)icon_id*128);
  12.                         }
  13.                         GDispDefCGChar(col+4*row+icon_id*16,&CGBuffer[0]);
  14.                 }
  15.         }
  16. }

y para visualizarlo despues:
Código: C#
  1. void GDispIcon32X32At(unsigned int16 row, unsigned int16 col, unsigned int8 icon_id)//............................ Visualizar icono
  2. {
  3.         unsigned int8 id=0;
  4.         unsigned int16 row_cnt, col_cnt;
  5.  
  6.         id = id + icon_id*16;
  7.  
  8.         GDispGoto(row, col);
  9.         for(row_cnt = row; row_cnt < (row+4); row_cnt++)
  10.         {
  11.                 for(col_cnt = col; col_cnt < (col+4); col_cnt++)
  12.                 {
  13.                         GDispCGCharAt(row_cnt, col_cnt, id++);
  14.                 }
  15.         }
  16. }

bueno ... el resto es cacharrearle :) 

La libreria y demas las puedes descargar desde aqui (https://dl.dropbox.com/u/80285981/GLCD_MLO.rar). Espero que te sirvan ;-)

Saludos

PD// disculpa mi demora ... no he tenido mucho tiempo y ademas se me embolato!!!!
Título: Re: LCD gráfico con T6913C
Publicado por: Diego E. en 02 de Diciembre de 2012, 20:02:42
Hola Miguel, !que aporte!, muchas gracias.

Le pregunto algo,
1- O sea que el display siempre lo manejan como gráfico, es formar los caracteres como gráficos ?.
2- Viendo las constantes de los caracteres veo que el barrido lo hacen es por columnas en las pruebas que yo he hecho el barrido es por filas, explico, yo para formar una letra envío los bytes de las filas y de esta forma construyo el caracter.
3- Con que programa digitalizas las imágenes o íconos ?

Saludos.
Título: Re: LCD gráfico con T6913C
Publicado por: MLO__ en 03 de Diciembre de 2012, 00:09:09
Hola.

Que bueno que te gustara :)

1. La GLCD tiene una fuente interna, a la cual se puede acceder si se la maneja en modo texto, pero, en mi caso, no la use ... yo genere las fuentes otra vez ... mas que todo para incluir otras letras y simbolos.

2. Tienes razon, se hace por filas.

3. Las fuentes: recuerdo que use el GLCFontCreator ... para los iconos no recuerdo el nombre ... era uno sencillo, en el cual uno importaba un icono o imagen y el lo pasaba a una matriz ... con el mouse se podia habilitar o no esos cuadritos ... pero no me acuerdo el nombre ... y lo que es peor :(  ... ya no tengo el instalador ... Creo que en el hilo de GLCD de Akena se nombra uno programa para ello.

Saludos
Título: Re: LCD gráfico con T6913C
Publicado por: Diego E. en 03 de Diciembre de 2012, 09:11:37
Miguel, una última al respecto, si el barrido que se hace es por filas no comprendo porqué estos generadores de caracteres entregan las 5 columnas de 8 bits, no debería se 7 u 8 filas por 5 bits o que conversión habrá que hacer ?

Saludos.
Título: Re: LCD gráfico con T6913C
Publicado por: MLO__ en 03 de Diciembre de 2012, 11:25:55
Hola.

Eso se puede configurar desde el mismo software a la hora de exportar el archivo que genera.

Saludos
Título: Re: LCD gráfico con T6913C
Publicado por: Diego E. en 03 de Diciembre de 2012, 14:18:58
Gracias Miguel.