TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: gaston en 10 de Diciembre de 2008, 16:21:27

Título: Libreria full LCD para CCS
Publicado por: gaston en 10 de Diciembre de 2008, 16:21:27
Hola amigos como estan,

decido preguntarles a uds. como cuernos solucionar el tema de cositas especiales en las LCDs,

todos usamos la libreria par aLCD del CCS o la flex_lcd que en el foro anda dando vueltas, pero ellas, si bien resuelven muchas cosas, no resuelven algunas como ser:

Impresion en video Inverso - es decir todo el fondo en negritas y las letras en blanco.
curso underline parpadeando

estas dos opciones las necesito para poder mostrar donde se encuentra el cursor.

Decidi entonces ver de agregar estas opciones a las librerias, partiendo de los comandos propios de las LCDs compatibles Hitachi, pero por ningun lado consegui el set de comandos de ella

alguien me puede tirar una soga???

muchas gracias y saludos a todos
Título: Re: Libreria full LCD para CCS
Publicado por: tithanae en 10 de Diciembre de 2008, 17:02:50
aqui estan los comandos de los lcd compatibles con el controlador de hitachi el pdf es un manual completo los comandos estan en la pagina 30 y el .doc es un resumen de los comandos ojala te sirva
Título: Re: Libreria full LCD para CCS
Publicado por: gaston en 11 de Diciembre de 2008, 12:47:07
Muchas gracias tithanae  voy a revisar la documentacion, seguro que me sirve

si consigo mejorar la libreria la subo aqui para compartirla con todos

un abrazo y gracias de nuevo
Título: Re: Libreria full LCD para CCS
Publicado por: tithanae en 12 de Diciembre de 2008, 14:14:12
estare esperando tu libreria  :lol: :lol:
Título: Re: Libreria full LCD para CCS
Publicado por: Cryn en 12 de Diciembre de 2008, 14:56:23
me adhiero a la espera, porque siempre creí que podrían haber más instrucciones

tithanae, el .doc esta en blanco :(
Título: Re: Libreria full LCD para CCS
Publicado por: gaston en 13 de Diciembre de 2008, 16:40:14
Hola a todos,
la documentacion esta muy completa, y estan ahi los comandos necesarios para actuar sobre el micro de la LCD.
Ahora bien en ningun lado veo como hacer para que ella pasa a modo video inverso, es decir el fondo negro y los caracteres en blanco.

No obstante una libreria para LCD provista por Mikroelectronika - www.mikroe.com - para su compilador C, incluye dicho comando, y lo probe y funciona muy bien.

No obstante este desarrollo lo estoy haciendo en CCS C y necesito esa funcion,

Pense tambien que la LCD podria tener en su memoria el set de caracteres ASCII en video inverso, pero no la veo en la completa doc. del pdf que tenenos

Alguna otra idea?
Título: Re: Libreria full LCD para CCS
Publicado por: MGLSOFT en 13 de Diciembre de 2008, 18:33:44
Prueba compilar ese ejemplo con MikroC y luego abrir el assembler que genera, a ver si se puede extraer la funcionalidad para usarla en CCS.

Podrias poner un ejemplo compilado en MikroC y su simulacion en Proteus asi lo vemos y podemos ayudarte??
Título: Re: Libreria full LCD para CCS
Publicado por: AKENAFAB en 14 de Diciembre de 2008, 00:12:49
Yo tengo una libreria muy burda xD del LCD , pero en ASM.

Ahi si puedo manejar las demás instruccions del cursor,blink,rotar,etc..

Lo que no recuerdo es lo que dicen de aparecer las letras en blanco con fondo negro.No se si venga en el set XD.


LCDLinea1    EQU 0x80 ; 0,0  (posicion,linea)
LCDLinea2    EQU 0xC0 ; 0,1
LCDCLR       EQU 0x01 ; Borra pantalla 0,0
LCDhome      EQU 0x02 ; 0,0
LCDInc       EQU 0x06 ; Modo incrementa cursor
LCDDec      EQU 0x04 ; Modo decrementa cursor
LCDOn      EQU 0x0C ; Pantalla On
LCDOff       EQU 0x08 ; Pantalla Off
CursOn       EQU 0x0E ; Pantalla On, cursor On
CursOff    EQU 0x0C ; Pantalla On, cursor Off
CursBlink    EQU 0x0F ; Pantalla On, Cursor blinking
LCDIzda    EQU 0x10 ; Mueve cursor a la izquierda
LCDDecha    EQU 0x14 ; Mueve cursor a la derecha
LCDFuncion   EQU 0x38 ; Inicializa registro función
LCDCGRAM    EQU 0x40 ; Dir CGRAM

LCD_4b      EQU   0X20 ; LCD MODE 4 BITS

;-------------------------

Un saludo!
Título: Re: Libreria full LCD para CCS
Publicado por: gaston en 15 de Diciembre de 2008, 10:07:11
Gracias a todos por los cometnarios,

Seria bueno lo que pide Mglsof, en el fin de semana busque la aplicacion, no la encontre, es que hice algo de eso como practica en enero pasado, hace ya bastante, y en verdad no lo hice mas que con un fin educativo,
siempre habia programado los micros en assemble y queria pasar a C, pero no decidia cual compilador usar, por eso probe entre ellos al de Mikroe. Finalmente con la ayuda del foro, decidi adiptar al CCS C, y descarte de llano al Mikroe C junto a otros.

Hoy me surge la inquietud en una aplicacion que permite activar cargas electricas en distintas horas del dia y en los disitntos dias de la semana, cosas que se definen en un sector de configuraion de la aplicacion,

es por esto que en la LCD en un momento - cuando debemos seleccionar que dias de la semana se activan dichas cargas - tenemos algo mas o menos asi:

L M M J V S D
N N N N N N N

Asi figura el default, con un pequeño teclado, recorremos la ptantalla y podemos cambiar la opcion del dia, es decir por ejemplo

L M M J V S D
S N S N S N S

donde solo se activan las salidas del micro - el Lunes, Miercoles, viernes y domingo  - esto es a modo de ejemplo.

Bueno la idea es poder poner en video inverso la letra de configuracion del dia que estamos configurando por ejemplo

L M M J V S D
S N S N N N N

Aqui al estar sobre la N debajo de la J del Jueves, dicha N deberia ser blanca con fondo negro, anunciando que justamente estamos configurando ese dia.

No se si me explico -

no encuentro como hacer eso desde los comandos de la LCD, pero si lo encontramos, facilmente lo podemos meter en la flexLCD

gracias a todos




Título: Re: Libreria full LCD para CCS
Publicado por: MLO__ en 15 de Diciembre de 2008, 13:00:41
Hola.

Lo que yo hice para que la libreria de la LCD me acepte comandos (los del pdf de la controladora) es definir una funcion en la libreria:

Código: C#
  1. void lcd_command(byte cmd)
  2. {
  3.         lcd_send_byte(0, cmd);
  4. }

Y al inicio de la libreria puse los #define correspondientes:

Código: C#
  1. #define LCD_OFF                 0x08
  2. #define CURSOR_ON               0x0E
  3. #define CURSOR_OFF              0x0C
  4. #define BLINK_ON                0x0D
  5. #define BLINK_OFF               0x0C
  6. #define SHIFT_LEFT              0x1C
  7. #define SHIFT_RIGHT             0x18
  8. #define CURSOR_RIGHT    0x14
  9. #define CURSOR_LEFT             0x10
  10. #define CGRAM                   0x40
  11. #define DDRAM                   0x80


Si lo que se quiere es el texto inverso, seria implementar algun flag de aviso de que letra se va pasar a modo inverso y usar la CGRAM para generar ese caracter, obviamente tendria que haber un .h con las definiciones de las letras en modo inverso.

Saludos.
Título: Re: Libreria full LCD para CCS
Publicado por: gaston en 15 de Diciembre de 2008, 19:26:24
Muy claro MLO
por lo tanto nos confirmas que no existe un comando de la LCD que pasa el texto a modo inverso
y por otro lado no existe cargada dentro de ella de ninguna forma los caracteres en inverso tal lo que dice el PDF

por lo tanto no queda otra que personalizar los caracteres a inverso y cargalarlos como personalizados.

Esto, esta bien para solucionar mi inconveniente y la verdad lo agradezco mucho

pero como el espiritu de este post tambien era tratar de mejorar la libreria flex_lcd, por ahi podriamos estudiar incluir la funcion de MLO dentro de ella, permitiendonos ejecutar comandos diretos de la LCD desde el codigo C


voy a hacer algunas pruebas y les cuento

si alguien tiene mas aoprtes bienvenidos  :-/ :-/
Título: Re: Libreria full LCD para CCS
Publicado por: Marttyn en 18 de Diciembre de 2008, 11:16:13
Me parece que por mucho que modifiques la libreria no conseguiras lo que quieres, ya que las letras y simbolos ya estan cargados dentro del LCD, o mejor dicho del controlador hitachi que trae. Cualquier cosa que quieras mostrar en el LCD que no este cargado tendras que hacerlo con la CGRAM. Una letra en modo inverso no esta cargada dentro del controlador, asi que supongo que te tocara crearla.
Lo malo de la CGRAM es que creo que se pueden definir 8 caracteres nada mas.
Pero piensa que tienes una ventaja, solo necesitas la "S" y la "N" en modo inverso.
Igualmente si que es interesante poder representar texto en modo inverso sin tener que recurrir a la limitada CGRAM, ya que si quisieramos hacer lo mismo con numeros ya no seria posible. Asi que si lo consigues no olvides postearlo!  :mrgreen:

PS: lo que no se es si puedes cargar y descargar la CGRAM "al vuelo" con los simbolos que te interesen. Pero igualmente habria que crear todas las letras, numeros y simbolos ex profeso y meterlas dentro de una memoria externa, porque no creo que quepan en la memoria del programa  :?
Título: Re: Libreria full LCD para CCS
Publicado por: MLO__ en 18 de Diciembre de 2008, 11:34:43
Es exactamente lo que postee anteriormente, pero mas explicadillo jeje  :mrgreen:
Título: Re: Libreria full LCD para CCS
Publicado por: Marttyn en 18 de Diciembre de 2008, 11:39:57
 :o
Eso me pasa por no leerme el post entero.
Bueno, al menos ahora se que si es posible hacerlo  :-/
Título: Re: Libreria full LCD para CCS
Publicado por: AKENAFAB en 19 de Diciembre de 2008, 00:12:41
Yo no creo que fuera muy rápido ese lcd  escribiendo a cada rato para cargar los caracteres en la cgram.

Lo que si veo con buenos ojos es implementar las demas caracteristicas de estos lcds en la libreria.


Un saludo!
Título: Re: Libreria full LCD para CCS
Publicado por: Marttyn en 19 de Diciembre de 2008, 00:16:38
Lo que si veo con buenos ojos es implementar las demas caracteristicas de estos lcds en la libreria.

No entiendo a que te refieres. Que otras caracteristicas ¿?
Título: Re: Libreria full LCD para CCS
Publicado por: AKENAFAB en 19 de Diciembre de 2008, 01:15:30

Me refiero a lo que no viene en las demas librerias,es decir las funciones completas de los lcds , lo que ya se hablo como es el rotar izquierda , derecha,blink,cursor.
Título: Re: Libreria full LCD para CCS
Publicado por: gaston en 19 de Diciembre de 2008, 09:33:07
Hola a todos,

como les dije antes, yo mismo con el Mikroe C, lo hice, hace meses, y lamentablemte no tengo el codigo, pero si recuerdo que no me fue complicado,

voy a hacerme un tiempo para instalar el Mikroe C, y ver la documentacion para tratar de repeterlo y les posteo el codigo y el hex para, como dice MGLSOFT ver que hace en assembler para estudiarlo un poco entre todos

Título: Re: Libreria full LCD para CCS
Publicado por: solitario en 09 de Marzo de 2009, 03:04:12
Hola MLO___ como le haces para mostrar los comandos que mencionas en tu post????? Yo estoy usando la libreria que trae el CCS y es a 4 hilos. Con esta libreria es posible activar los comandos del LCD??

Saludos . . .


Título: Re: Libreria full LCD para CCS
Publicado por: MLO__ en 10 de Marzo de 2009, 03:16:24
Hola.

Si es posible, de hecho yo uso la libreria a 4 "hilos" ...

Para hacer uso de los comandos, solo escribo en el main: lcd_command(LCD_OFF); para apagar la LCD, por ejemplo .....
Título: Re: Libreria full LCD para CCS
Publicado por: gaston en 11 de Marzo de 2009, 18:55:34
Creo que esto que escribe MLO es justo lo que buscamos
donde podemos ver todos los comandos y su formato como lcd_command(LCD_OFF) ??
Título: Re: Libreria full LCD para CCS
Publicado por: MGLSOFT en 11 de Marzo de 2009, 19:10:18
En este mismo hilo en el mensaje:

http://www.todopic.com.ar/foros/index.php?topic=24085.msg195373#msg195373 (http://www.todopic.com.ar/foros/index.php?topic=24085.msg195373#msg195373)

encuentras todas las constantes que permiten hacer lo que quieres... :mrgreen: :mrgreen:
Título: Re: Libreria full LCD para CCS
Publicado por: moronilehi en 16 de Julio de 2009, 23:16:04

Hola a todo soy nuevo en este mundo de microcontroladores y es la primera vez que escribo, tengo la siguiente inquietud es que  compre un Lcd VT162B/B que supuesta mente era compatible con S6A0069 bueno tuve problema con la compatibilidad del Lcd que no me funcionaba y aun no me funciona , la historia es que pedí ayuda a la empresa  ellos me enviaron un archivo y un data de este modelo(no aceptaban devoluciones) y bueno  me enviaron una librería que supuestamente trabaja con el LCD VT162B/B y es como me dijo el hombre  que la librería es del CCS, Bueno lo compilo y buala me sale un mensaje de error o es un bugs del compilador por la siguiente declaración
  #byte DataBus = PORTD               // DEFINE BUS DE DATOS
#byte Tris_DataBus = TRISD         // DEFINE TRIS DE BUS DE DATOS         
#byte ControlBus = PORTE            // DEFINE BUS DE CONTROL
#byte Tris_ControlBus = TRISE   // DEFINE TRIS DEL BUS DE CONTROL
 Yo estoy usando el compilador CCS 4.08 y el pic16f874a no sé si es un bugs o es que me enviaron para callarme un código cualquiera de internet por favor ayúdenme le agradesco por su comprensión.
Pd aquí le envió el código completo que me entrego la empresa para el LCD:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                   LCD.H                                                                                      //
//                                                             VERSION   2.1                                                                                 //
//                                                              JULIO 2009                                                                                 //
//                                                                                                                                                               //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
#nolist

                                             // DEFINICION DE CONSTANTES PARA USO EN FUNCIONES
#define HOME               0x02      // PARA PONER CURSOR EN LA POSICION 0 DEL DISPLAY. USAR CON WRITE_LCD_COM
#define INCREASE         0x02      // INCREMENTA CURSOR. USAR CON LCD.ID
#define DECREASE         0x00      // DECREMENTA CURSOS. USAR CON LCD.ID
#define SHIFT_ON         0x01      // SHIFT DISPLAY. USAR CON LCD.SHIFT
#define SHIFT_OFF         0x00      // NO SHIFT DISPLAY. USAR CON LCD.SHIFT
#define LCD_ON            0x04      // ACTIVA LCD. USAR CON LCD.MODE
#define LCD_OFF            0x00      // DESACTIVA LCD. USAR CON LCD.MODE
#define CURSOR_ON         0x02      // ACTIVA CURSOR. USAR CON LCD.CURSOR
#define CURSOR_OFF      0x00      // DESACTIVA CURSOR. USAR CON LCD.CURSOR
#define BLINK_ON         0x01      // ACTIVA PARPADEO DEL CURSOR. USAR CON LCD.BLINK   
#define BLINK_OFF         0x00      // DESACTIVA PARPADEO DEL CURSOR. USAR CON LCD.BLINK   
#define BUS_8               0x10      // DEFINE BUS DE 8 BITS. USAR CON LCD.INTERFASE
#define BUS_4               0x00      // DEFINE BUS DE 4 BITS. USAR CON LCD.INTERFASE
#define CLEAR               0x01      // LIMPIA DISPLAY. USAR CON FUNCION WRITE_LCD_DATA()
#define NOCLEAR            0x00      // NO LIMPIA DISPLAY. USAR CON FUNCION WRITE_LCD_DATA()
#define   LINE1               0x00      // PRIMERA DIRECCION DE LINEA 1.
#define   LINE2               0x40      // PRIMERA DIRECCION DE LINEA 2.
#define   LINE3               0x14      // PRIMERA DIRECCION DE LINEA 3.
#define   LINE4               0x54      // PRIMERA DIRECCION DE LINEA 4.
#define LARGO               16         // Editar esta línea para indicar la cantidad de caracteres por línea del display
#define LINEAS            2            // Editar este línea para indicar la cantidad de líneas que dispone el display
#define   NULL               0x00

#list

struct
{
   char TEXT[LARGO+1];                  // define texto para escribir en lcd   
   int ID;                                    // define si el cursor de incrementará o decrementará
   int SHIFT;                              // define el shift del cursor
   int MODE;                                 // define si el display está ON ú OFF
   int CURSOR;                              // define si el cursor estará visible
   int BLINK;                              // define si el cursor parpadeará
   int INTERFASE;                        // define interfase de 4/8 bits
} lcd;

// CONFIGURAR AQUI LOS PUERTO QUE SE USARAN PARA BUS DE DATOS Y DE CONTROL
#byte DataBus = PORTD               // DEFINE BUS DE DATOS
#byte Tris_DataBus = TRISD         // DEFINE TRIS DE BUS DE DATOS
#byte ControlBus = PORTE            // DEFINE BUS DE CONTROL
#byte Tris_ControlBus = TRISE   // DEFINE TRIS DEL BUS DE CONTROL

// GENERA PULSOS DE ESCRITURA PARA COMANDOS DEL DISPLAY Y SACA DATO
void WriteLcdComData(int x)
{
   Tris_ControlBus = 0xF8 & Tris_ControlBus;
   Tris_DatalBus = 0x00;
   DataBus = ControlBus = 0x00;
   ControlBus = 3;
   ControlBus = 0;
   ControlBus = 4;
   DataBus = x;
   ControlBus = 0;
   ControlBus = 3;
   delay_us(50);
}

// LIMPIA DISPLAY
void ClearLcd(void)
{
   WriteLcdComData(CLEAR);               // display clear
   delay_ms(2);
}

// INICIALIZA EL EL DISPLAY
 void IniLcd(void)
{
   delay_ms(20);
   WriteLcdComData(0x30);
   delay_ms(5);   
   WriteLcdComData(0x30);
   delay_us(150);
   WriteLcdComData(0x30);   
}

// CONFIGURA EL DISPLAY. LOS DATOS PARA LA CONFIGURACION DEBEN SER PUERTOS ANTES DE LLAMAR
// A ESTA FUNCION. LOS DATOS SON PARTE DE LA ESTRUCTURA LCD.
void SetupLcd(void)
{
   WriteLcdComData(0x04 | lcd.ID | lcd.SHIFT);                              //ENTRY MODE SET
   WriteLcdComData(0x08 | lcd.MODE | lcd.CURSOR | lcd.BLINK);      // DISPLAY ON OFF
   WriteLcdComData(0x28 | lcd.INTERFASE);                                    // SET FUNCTION
}

// ESCRIBE DATOS EN EL DISPLAY. X REPRSENTA DESDE QUE DIRECCIÓN DEL DISPLAY SE DESEAN ESCRIBIR LOS DATOS
// E Y INDICA SE SE LIMPIARÁ EL DISPLAY ANTES DE ESCRIBIR
// SI C = CLEAN, EL DISPLAY ES LIMPIADO
// SI C = NOCLEAN, SOLO SE ESCRIBEN LOS DATOS DESDE LA POCISION ESPECIFICADA POR POS
// LOS DATOS A ESCRIBIR DEBE SER COPIADOS PREVIAMENTE EN EL ELEMENTO LCD.TEXT DE LA ESCTRUCTIRA LCD
void WriteLcd(int pos, int c)
{
   int *p;
   Tris_ControlBus = 0xF8 & Tris_ControlBus;
   Tris_DatalBus = 0x00;
   DataBus = ControlBus =0x00;
   if (c)
      {
         clear_lcd();
         delay_ms(2);
      }
   pos|= 0x80;
   WriteLcdComData(pos);
   p = lcd.TEXT;
   for (; *p!=NULL; p++)
   {   
      DataBus = 0xff;
      ControlBus = 2;
      ControlBus = 1;
      ControlBus = 5;
      DataBus = *p;
      ControlBus = 1;
      ControlBus = 2;
      delay_us(50);
   }
}

void PutcLcd(int ini, char data)
{
   if (ini != CURRENT)
      {
         ini|= 0x80;
         WriteLcdComData(ini);
      }
   Tris_ControlBus = 0xF8 & Tris_ControlBus;
   Tris_DatalBus = ControlBus = 0x00;
   DataBus = 0xff;
   ControlBus = 2;
   ControlBus = 1;
   ControlBus = 5;
   DataBus = data;
   ControlBus = 1;
   ControlBus = 2;
   delay_us(50);
}

void ClearLcdLine(int x)
{
   int y;
   for (y=0; y<=LARGO; y++)
      {
         lcd.TEXT[y] = ' ';
      }
   lcd.TEXT[++y] = NULL;
   switch (x)
      {
         case 1   :   WriteLcd(LINE1,NOCLEAR);
                        break;
         case 2   :   WriteLcd(LINE2,NOCLEAR);
                        break;
         case 3  :   WriteLcd(LINE3,NOCLEAR);
                        break;
         case 4  :   WriteLcd(LINE4,NOCLEAR);
                        break;
         default :   break;
      }
}


Título: Re: Libreria full LCD para CCS
Publicado por: Orko en 20 de Enero de 2012, 14:22:19
Hola.

Lo que yo hice para que la libreria de la LCD me acepte comandos (los del pdf de la controladora) es definir una funcion en la libreria:

Código: C#
  1. void lcd_command(byte cmd)
  2. {
  3.         lcd_send_byte(0, cmd);
  4. }

Y al inicio de la libreria puse los #define correspondientes:

Código: C#
  1. #define LCD_OFF                 0x08
  2. #define CURSOR_ON               0x0E
  3. #define CURSOR_OFF              0x0C
  4. #define BLINK_ON                0x0D
  5. #define BLINK_OFF               0x0C
  6. #define SHIFT_LEFT              0x1C
  7. #define SHIFT_RIGHT             0x18
  8. #define CURSOR_RIGHT    0x14
  9. #define CURSOR_LEFT             0x10
  10. #define CGRAM                   0x40
  11. #define DDRAM                   0x80


Si lo que se quiere es el texto inverso, seria implementar algun flag de aviso de que letra se va pasar a modo inverso y usar la CGRAM para generar ese caracter, obviamente tendria que haber un .h con las definiciones de las letras en modo inverso.

Saludos.




Gracias, gracias, me sirvió mucho!.