Autor Tema: ¿Generar nuevos caracteres en LCD?  (Leído 14727 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
¿Generar nuevos caracteres en LCD?
« en: 14 de Noviembre de 2006, 23:07:52 »
Hola, estoy intentando generar caracteres nuevos en un LCD 2x16 con controlador Hitachi. Para visualizar en el LCD utilizo la libreria XLCD de C18... he mirado en el manual de librerias y no me explica como generar caracteres....

Esta libreria tiene una funcion para posicionarte en una direccion de la ddram y otra para hacer lo mismo en la cgram. Lo que estoy intentando es ir a la primera  posicion de la cgram y en las 8 posiciones siguientes(incluida esta primera) escribir los puntos que quiero que formen el nuevo caracter y despues voy a la primera posicion de la ddram y la visualizo pero nada.... :? Segun he leido en el manual  "Hitachi de toda la vida"(jeje) el procedimiento es algo así pero la verdad es que estoy un poco perdido...

Alguien ha conseguido hacer nuevos caracteres con esta libreria(XLCD) o puede orientarme un poco? Por cierto los caracteres que quiero son: una flecha para arriba y otra para abajo (para utilizarlas en un menu... :-)). Muchas gracias por vuestro tiempo, saludos!
« Última modificación: 18 de Noviembre de 2006, 04:02:11 por BrunoF »
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: ¿Generar nuevos caracteres en LCD?
« Respuesta #1 en: 15 de Noviembre de 2006, 05:19:25 »
Lo que yo hice en su día fué esto. No es exáctamente lo mismo pero... a lo mejor te puede servir de algo.

http://www.todopic.com.ar/foros/index.php?topic=13780.msg81633#msg81633

PD: Luego cuelgo otra vez el video que me lo han borrado.


Un saludo desde Alicante.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Generar nuevos caracteres en LCD?
« Respuesta #2 en: 15 de Noviembre de 2006, 10:02:30 »
Hola Azicuetano, tu ejemplo me ha sido de gran ayuda, es justo lo que necesitaba... ya lo he conseguido!. El problema es que me lié con las direcciones de la CGRAM y la DDRAM pues la libreria XLCD no las trata como direcciones reales del LCD sino como locales. Es decir, he mirado los fuentes y he visto que en la funcion SetCGRamAddr(direccion) a la direccion que le pasas se le aplica una suma lógica con 0x40(la primera direccion de la CGRAM). Por lo que si quieres posicionarte en 0x40 (real) debes mandar la direccion 0 ===> 0 | 0x40 = 0x40...Gracias por tu ayuda paisano... Visca Alacant!   :-). Saludos a todos.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: ¿Generar nuevos caracteres en LCD?
« Respuesta #3 en: 15 de Noviembre de 2006, 13:40:05 »
Colgué un programilla en visual basic para facilitar la creación de caracteres usando la RAM de las LCD, a ver si te puede servir.

Salu2

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: ¿Generar nuevos caracteres en LCD?
« Respuesta #4 en: 15 de Noviembre de 2006, 16:41:36 »
Aquí está el video que os habia comentado que iba a colgar.

http://rapidshare.com/files/3497423/MVI_0101.avi.html


Un saludo desde Alicante.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: ¿Generar nuevos caracteres en LCD?
« Respuesta #5 en: 16 de Noviembre de 2006, 04:34:14 »
Está muy logrado el scroll, Azicuetano. Enhorabuena.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: ¿Generar nuevos caracteres en LCD?
« Respuesta #6 en: 16 de Noviembre de 2006, 13:30:25 »
Muy bueno el desplazamiento Azicuetano, y no se pierde el caracter cuando salta de un posición de la DDRAM a la otra. Creo haber visto en el CD que trae el libro de Angulo  un video de una caricatura moviendose en una LCD.

Otra aplicación ingeniosa sería un ecualizador gráfico en forma de barras. Todo estaría limitado por la imaginación.

Salu2
Pedro - PalitroqueZ
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Orko

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 423
Re: ¿Generar nuevos caracteres en LCD?
« Respuesta #7 en: 21 de Noviembre de 2006, 13:04:51 »
Felicitaciones por el logro. Vemos que utilizamos muy poco de lo que se puede hacer con el LCD.

Orko  8)

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: ¿Generar nuevos caracteres en LCD?
« Respuesta #8 en: 21 de Noviembre de 2006, 20:30:25 »
Muchas gracias por las felicitaciones y en especial a todos y cada uno de los integrantes de este maravilloso foro.

Sin vosotros esto no sería posible  :mrgreen:.


Un saludo desde Alicante.


Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: ¿Generar nuevos caracteres en LCD?
« Respuesta #9 en: 17 de Diciembre de 2008, 20:24:39 »
Buenas, he usado el programa de PalitroqueZ para generar caracteres, pero lo que quisiera hacer es poder colocarlo en una posición determinada del LCD, pero si utilizo la función lcd_gotoxy(); no sirve. Lo que hago es poner esa función antes de usar el codigo de ejemplo que genera el programa.

Alguna manera de hacerlo?

Un saludo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ¿Generar nuevos caracteres en LCD?
« Respuesta #10 en: 18 de Diciembre de 2008, 15:05:38 »
Hola.

Yo lo hago asi:

Código: [Seleccionar]
printf(lcd_putc, %c, new_caracter);
En donde he definido antes a new_caracter con #define new_caracter 0

Y 0 es la posicion en memoria de la LCD en donde he guardado el nuevo simbolo.

Tambien se puede con putc(new_caracter);
El papel lo aguanta todo

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: ¿Generar nuevos caracteres en LCD?
« Respuesta #11 en: 19 de Diciembre de 2008, 17:16:39 »
Buenas, he usado el programa de PalitroqueZ para generar caracteres, pero lo que quisiera hacer es poder colocarlo en una posición determinada del LCD, pero si utilizo la función lcd_gotoxy(); no sirve. Lo que hago es poner esa función antes de usar el codigo de ejemplo que genera el programa.

Alguna manera de hacerlo?

Un saludo.

Esto es algo que tiene que ver en los comandos a usar para los caracteres en la lcd

un ejemplo:

Código: C
  1. //*******************************************************************************
  2. //   CODIGO A NIVEL DE PIXEL con cristal a 4Mhz
  3. //   CON 5 X 7 DOTS (se pueden crear hasta 8 caracteres solamente)
  4. //   EN ESTE EJEMPLO SE PRUEBA COMO GRABAR NUEVOS CARACTERES
  5. //   EN LA CG-RAM-DATA DIRECCIONANDO CADA LINEA CON EL CG-RAM-ADDRESS
  6. //*******************************************************************************
  7.  
  8. #include <16F84A.h>
  9. #fuses XT,NOWDT,PUT
  10. #use delay(clock=4000000)
  11.  
  12. #byte porta =5
  13. #byte portb =6
  14. #define use_portb_lcd TRUE
  15. #include <LCD.c>
  16. int const caracter0_direccion[8]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
  17. int const caracter0_datos[8]={0b00100,0b01110,0b10101,0b00100,0b10101,0b01110,0b00100,0b0};
  18.  
  19.  
  20. void main() {
  21.         int contador;
  22.         set_tris_a(0x0);
  23.         set_tris_b(0x0);
  24.         lcd_init();
  25.         for(contador=0;contador<8;contador++){
  26.                 lcd_send_byte(0,caracter0_direccion[contador]);   //modo comando
  27.                 lcd_send_byte(1,caracter0_datos[contador]);        // modo dato
  28.                
  29.         }
  30.         lcd_send_byte(0,0x80);
  31.  
  32.         for(contador=0;contador<1;contador++){
  33.                 lcd_send_byte(1,contador); //modo dato
  34.         }
  35.         delay_cycles(1);
  36. }

si quisiera mostrarlo en la posición 5, segunda linea, quedaría:

Código: C
  1. //*******************************************************************************
  2. //   CODIGO A NIVEL DE PIXEL con cristal a 4Mhz
  3. //   CON 5 X 7 DOTS (se pueden crear hasta 8 caracteres solamente)
  4. //   EN ESTE EJEMPLO SE PRUEBA COMO GRABAR NUEVOS CARACTERES
  5. //   EN LA CG-RAM-DATA DIRECCIONANDO CADA LINEA CON EL CG-RAM-ADDRESS
  6. //*******************************************************************************
  7.  
  8. #include <16F84A.h>
  9. #fuses XT,NOWDT,PUT
  10. #use delay(clock=4000000)
  11.  
  12. #byte porta =5
  13. #byte portb =6
  14. #define use_portb_lcd TRUE
  15. #include <LCD.c>
  16. int const caracter0_direccion[8]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
  17. int const caracter0_datos[8]={0b00100,0b01110,0b10101,0b00100,0b10101,0b01110,0b00100,0b0};
  18.  
  19.  
  20.  
  21. void main() {
  22.    int contador;
  23.    set_tris_a(0x0);
  24.    set_tris_b(0x0);
  25.    lcd_init();
  26.    for(contador=0;contador<8;contador++){
  27.       lcd_send_byte(0,caracter0_direccion[contador]);   //modo comando
  28.       lcd_send_byte(1,caracter0_datos[contador]);        // modo dato
  29.      
  30.    }
  31.    lcd_send_byte(0,0x80);
  32.    lcd_gotoxy(5,2);
  33.    lcd_send_byte(1,0);
  34.    delay_cycles(1);
  35. }

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: ¿Generar nuevos caracteres en LCD?
« Respuesta #12 en: 21 de Diciembre de 2008, 16:31:37 »
Buenas, lo de la posición está claro. Ahora lo que pretendo es dibujar en el LCD una barra que aumente de "barrita en barrita", si uso un LCD de 16 caracteres en total son 16*5=80. El problema con el codigo que tengo es que me dibuja un caracter de mas (cinco barritas) y cuando el numero de barras a dibujar es menor de 5, aparece desplazado una posición a la derecha.

Código: [Seleccionar]
//******************************************************************************
//   CODIGO A NIVEL DE PIXEL con cristal a 4Mhz
//   CON 5 X 7 DOTS (se pueden crear hasta 8 caracteres solamente)
//   EN ESTE EJEMPLO SE PRUEBA COMO GRABAR NUEVOS CARACTERES
//   EN LA CG-RAM-DATA DIRECCIONANDO CADA LINEA CON EL CG-RAM-ADDRESS
//******************************************************************************

#include <16F876A.h>
#fuses XT,NOWDT,PUT
#use delay(clock=4000000)

#byte porta =5
#byte portb =6
//#define use_portb_lcd TRUE
//#include <LCD.c>
/******************************************************************************/
/* Definiciones para la interfaz PIC-LCD                                      */
/******************************************************************************/
# define PORTA 0x05// Puerto A
# define PORTB 0x06// Puerto B
# define PORTC 0x07// Puerto C
# define TRISA 0x85// Registro de direccionamiento Puerto A
# define TRISB 0x86// Registro de direccionamiento Puerto B
# define TRISC 0x87// Registro de direccionamiento Puerto C
//Se definen los terminales de conexion del display
#bit lcd_db4 = PORTA.2
#bit tris_lcd_db4 = TRISA.2
#bit lcd_db5 = PORTA.3
#bit tris_lcd_db5 = TRISA.3
#bit lcd_db6 = PORTA.4
#bit tris_lcd_db6 = TRISA.4
#bit lcd_db7 = PORTA.5
#bit tris_lcd_db7 = TRISA.5

#bit lcd_en = PORTC.0
#bit tris_lcd_en = TRISC.0
#bit lcd_rs = PORTC.1
#bit tris_lcd_rs = TRISC.1
# include <lcd_flex.c>
int const caracter0_direccion[8]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
int const caracter1_direccion[8]={0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
int Volumen,aux,i;
/******************************************************************************/
void MostrarCuadroLCD(int Columna){
int contador;

for(contador=0;contador<7;contador++){
lcd_send_byte(0,caracter0_direccion[contador]);   //modo comando
lcd_send_byte(1,0b11111);        // modo dato
}
   lcd_send_byte(0,caracter0_direccion[7]);   //modo comando
lcd_send_byte(1,0b0);        // modo dato 
lcd_send_byte(0,0x80);

   lcd_gotoxy(Columna,1);

for(contador=0;contador<2;contador++){
lcd_send_byte(1,contador); //modo dato
   }
   delay_cycles(1);
}
/******************************************************************************/
void MostrarBarra(int Columna,int dato) {
int contador;

for(contador=0;contador<7;contador++){
lcd_send_byte(0,caracter1_direccion[contador]);   //modo comando
lcd_send_byte(1,dato);        // modo dato

      }
   lcd_send_byte(0,caracter1_direccion[7]);   //modo comando
lcd_send_byte(1,0b0);        // modo dato
lcd_send_byte(0,0x80);

   lcd_gotoxy(Columna,1);

for(contador=0;contador<2;contador++){
lcd_send_byte(1,contador); //modo dato
}
   delay_cycles(1);
}
/******************************************************************************/
void MostrarBarraVolumenLCD(int Volumen){
int Columna;
int aux,contador;

Columna=1;
aux=Volumen;
while(aux>=5){//Por cada pasada muestra un cuadro.
   aux=aux-5;
   MostrarCuadroLCD(Columna);
   Columna++;
}

switch (aux) {
   case    0x01: MostrarBarra(Columna,0b10000);
      Break;
   case    0x02: MostrarBarra(Columna,0b11000);
      Break;
   case    0x03: MostrarBarra(Columna,0b11100);
      Break;
   case    0x04: MostrarBarra(Columna,0b11110);
      Break;
}
}
/******************************************************************************/
void main() {
set_tris_a(0x0);
set_tris_b(0x0);
set_tris_c(0x0);
Volumen=1;
lcd_init();
MostrarBarraVolumenLCD(Volumen);
   
}

Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡


Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: ¿Generar nuevos caracteres en LCD?
« Respuesta #14 en: 21 de Diciembre de 2008, 17:42:19 »
Hola.

Citar
Hola.

Yo lo hago asi:

Código: [Seleccionar]
printf(lcd_putc, %c, new_caracter);
En donde he definido antes a new_caracter con #define new_caracter 0

Y 0 es la posicion en memoria de la LCD en donde he guardado el nuevo simbolo.

Tambien se puede con putc(new_caracter);

Como defines el nuevo caracter?

Un saludo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡


 

anything