Autor Tema: Envio de caracteres especiales al lcd  (Leído 5316 veces)

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

Desconectado alfred_197

  • PIC10
  • *
  • Mensajes: 15
Envio de caracteres especiales al lcd
« en: 29 de Julio de 2008, 09:54:11 »
Hola
Por si acaso algien tubiese una libreria para el manejo de lcd, con el cual se puedan mostrar caractares especiales y variable  que se modifiquen en el programa, el qque ya tengo no me permite realisar lo anterior

Desconectado doppel

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1534
Re: Envio de caracteres especiales al lcd
« Respuesta #1 en: 29 de Julio de 2008, 10:03:58 »
Hola Alfred_197

bienvenido al foro!!! por que no nos cuentas en que lenguaje programas ya que das muy pocos datos de lo que quieres hacer

saludos

Hernán
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado alfred_197

  • PIC10
  • *
  • Mensajes: 15
Re: Envio de caracteres especiales al lcd
« Respuesta #2 en: 29 de Julio de 2008, 12:25:53 »
Hola Hernàn
Mira estoy utilisando el compilador de ccs y tengo la libreria lcd.c que me recomendaron en el foro y el problema que no consigo visualisar el contenido de una variable entera y tampoco caracteres especiales

Desconectado doppel

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1534
Re: Envio de caracteres especiales al lcd
« Respuesta #3 en: 29 de Julio de 2008, 14:20:47 »
Hola Alfred_167
Lamentablemente no manejo ese compilador! tendrías que plantear esta duda en el subforo de "C" o si alguno de los moderadores está de acuerdo que mueva este tema a dicho subforo, donde seguramente tendrás mas chance de resolver el problema.-

saludos

Hernán
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Envio de caracteres especiales al lcd
« Respuesta #4 en: 29 de Julio de 2008, 15:10:03 »
saludos alfred, que libreria estas utilizando? que tipo de controlador tiene tu LCD?

ya que la lib de ccs es a 4bits y para driver Hitachi 44780

en ella es puede grabar imagenes como tu quieras, porque no te das una vuelta  por el foro utilizando el buscador con la palabra clave CGRAM, pues hay bastante info.

ahora si tu driver es otro diferente habria que ver la hoja de datos
.

Desconectado alfred_197

  • PIC10
  • *
  • Mensajes: 15
Re: Envio de caracteres especiales al lcd
« Respuesta #5 en: 29 de Julio de 2008, 15:18:29 »
Hola Cryn
El elcd q uso es HITACHI HD44780U y la lireria que uso es la siguiente:
/*-------------------------------------------*\
 |  LCD2.C                                   |
 |  Autor: Pedro M. Jimenez                  |
 |  (c) Microsystems Engineering (Bilbao)    |
\*-------------------------------------------*/

// Funciones para la gestion del display LCD de la MicroPIC Trainer.

//  lcd_init( )   Debe ser llamada antes que las otras funciones.
//
//  lcd_putc(c)  Visualiza c en la siguiente posición del display.
//               Caracteres especiales de control:
//                      \f  Borrar display
//                      \n  Saltar a la segunda linea
//                      \b  Retroceder una posición.
//
//  lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el display.
//                  (la esquina superior izquierda es 1,1)
//
//  lcd_getc(x,y)   Devuelve el caracter de la posicion x,y del display.


#bit  lcd_enable = 5.2
#bit  lcd_rw     = 5.1
#bit  lcd_rs     = 5.0
#byte lcd_a = 5
#byte lcd_b = 6

#define LCD_LINEA2 0x40    // Direccion de memoria para la segunda linea
#define LCD_DATO    1
#define LCD_COMANDO 0

#define LCD_CLEAR        0x01
#define LCD_HOME    0x02

#define LCD_DISPLAY_OFF  0x08
#define LCD_DISPLAY_ON   0x0C
#define LCD_CURSOR_ON    0x0E
#define LCD_CURSOR_BLINK 0x0F

#define LCD_CURSOR_SHIFT_RIGHT  0x10
#define LCD_CURSOR_SHIFT_LEFT   0x14
#define LCD_DISPLAY_SHIFT_RIGHT 0x18
#define LCD_DISPLAY_SHIFT_LEFT  0x1C


int lcd_leer( )
{
  int valor;

  set_tris_a(0x18);
  set_tris_b(0xFF);

  lcd_rw = 1;
  delay_cycles(1);
  lcd_enable = 1;
  delay_cycles(1);
  valor = lcd_b;
  lcd_enable = 0;
  delay_us(40);

  set_tris_b(0x00);
  return valor;
}


void lcd_enviar(int dir, int valor)
{
  set_tris_a(0x00);
  set_tris_b(0x00);

  lcd_rs = 0;
  while( bit_test(lcd_leer( ),7)  );
  lcd_rs = dir;
  delay_cycles(1);

  lcd_rw = 0;
  delay_cycles(1);
  lcd_enable = 0;
  lcd_b = valor;
  delay_cycles(1);
  lcd_enable = 1;
  delay_us(2);
  lcd_enable = 0;
  delay_us(40);
}


void lcd_init( )
{
  int i;

  set_tris_a(0x18);
  set_tris_b(0x00);

  lcd_enable = 0;
  lcd_rw = 0;
  lcd_rs = 0;
  delay_ms(15);

  for(i=0; i<3; i++)
  {
    lcd_enviar(LCD_COMANDO,0x38);
    delay_ms(5 );
  }
  lcd_enviar(LCD_COMANDO,LCD_DISPLAY_ON);
  lcd_enviar(LCD_COMANDO,0x06);
  lcd_enviar(LCD_COMANDO,LCD_CLEAR);
  lcd_enviar(LCD_COMANDO,LCD_HOME);
}


void lcd_gotoxy( byte x, byte y) {
   byte dir;

   if(y!=1)
     dir=LCD_LINEA2;
   else
     dir=0;
   dir+=x-1;
   lcd_enviar(LCD_COMANDO,0x80|dir);
}


void lcd_putc( char c) {
   switch (c ) {
     case '\f '   : lcd_enviar(LCD_COMANDO,0x01);
                   delay_ms(2);
                   break;
     case '\n '   : lcd_gotoxy(1,2);               break;
     case '\b '   : lcd_enviar(LCD_COMANDO,0x10);  break;
     default     : lcd_enviar(LCD_DATO,c);        break;
   }
}


char lcd_getc( int x, int y) {
   char valor;

    lcd_gotoxy(x,y) ;

    lcd_rs = 1;
    valor = lcd_leer( );
    lcd_rs = 0;

    return valor;
}

///////////////////////////////////////////
y no consigo mostrar el valor de un daoto de tipo entero

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Envio de caracteres especiales al lcd
« Respuesta #6 en: 29 de Julio de 2008, 15:38:03 »
saludos alfred, esa librería funciona muy bien a 8bits con un hd44780, yo mismo lo he probado, y tb funciona muy bien la creación de algunos caracteres especiales en la cgram, este link me ayudo mucho en la creación de algunos caracteres, nose si te entendí mal, pero a parte de los caracteres que tiene el lcd internamente puedes crear 8 más a tu gusto, si que necesitas alguno. quiza no sea tu caso, como te digo talvez te entendí mal.

de todas formas para visualizar variables, palabras, etc, etc en un hd4478 es muy sencillo con la instrucción printf, por ejemplo:

tengo una variable int CONTADOR, y esta se incremente y decrementa con un pulsador, para ver su contenido directamente puedo hacer:

printf(lcd_putc,"variable=%u",CONTADOR);

y se puede colocar cualquier tipo de dato en "%u" bueno eso dependerá que tipo de dato sea, si es char, long,etc, podrias fijarte la sentencia printf en el manual de ccs. ahi te explica mejor que yo :D
.

Desconectado alfred_197

  • PIC10
  • *
  • Mensajes: 15
Re: Envio de caracteres especiales al lcd
« Respuesta #7 en: 30 de Julio de 2008, 12:47:13 »
Hola compatriota Cryn.
muchas gracias por la ayuda ahora si ya tengo las cosas mas claras y el link esta muy bueno

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Envio de caracteres especiales al lcd
« Respuesta #8 en: 30 de Julio de 2008, 12:58:11 »
vale, un gusto ayudar a gente de mi país! :-/

por cierto? de donde eres?, yo soy de Cocha! :mrgreen:

y pues no te olvides siempre dar una mirada con el buscador, casi siempre puedes encontrar la respuesta
.

Desconectado alfred_197

  • PIC10
  • *
  • Mensajes: 15
Re: Envio de caracteres especiales al lcd
« Respuesta #9 en: 30 de Julio de 2008, 17:55:08 »
Bueno yo soy de Potosi pero vivo el la Llajta hace un buen tiempo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Envio de caracteres especiales al lcd
« Respuesta #10 en: 31 de Julio de 2008, 13:01:50 »
 :shock: que bien colega, yo tb me hubiera quedado :D :D

un saludo y que tengas buenos proyectos con PIC's :mrgreen:
.

Desconectado alfred_197

  • PIC10
  • *
  • Mensajes: 15
Re: Envio de caracteres especiales al lcd
« Respuesta #11 en: 11 de Agosto de 2008, 12:59:52 »
hola de vuelta.
temgo un problemita con el LCD2.c cundo lo modifique para utilizar los bit de control con el puerto d que do de la siguiente manera:
/*-------------------------------------------*\
 |  LCD2.C                                   |
 |  Autor: Pedro M. Jimenez                  |
 |  (c) Microsystems Engineering (Bilbao)    |
\*-------------------------------------------*/

// Funciones para la gestion del display LCD de la MicroPIC Trainer.

//  lcd_init()   Debe ser llamada antes que las otras funciones.
//
//  lcd_putc(c)  Visualiza c en la siguiente posición del display.
//               Caracteres especiales de control:
//                    \f  Borrar display
//                    \n  Saltar a la segunda linea
//                    \b  Retroceder una posición.
//
//  lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el display.
//                  (la esquina superior izquierda es 1,1)
//
//  lcd_getc(x,y)   Devuelve el caracter de la posicion x,y del display.


#bit  lcd_enable = 8.7///////puerto D para los bits de control
#bit  lcd_rw     = 8.6
#bit  lcd_rs     = 8.5
#byte lcd_d =0x08
#byte lcd_b =0x06

#define LCD_LINEA2 0x40    // Direccion de memoria para la segunda linea
#define LCD_DATO    1
#define LCD_COMANDO 0

#define LCD_CLEAR        0x01
#define LCD_HOME    0x02

#define LCD_DISPLAY_OFF  0x08
#define LCD_DISPLAY_ON   0x0C
#define LCD_CURSOR_ON    0x0E
#define LCD_CURSOR_BLINK 0x0F

#define LCD_CURSOR_SHIFT_RIGHT  0x10
#define LCD_CURSOR_SHIFT_LEFT   0x14
#define LCD_DISPLAY_SHIFT_RIGHT 0x18
#define LCD_DISPLAY_SHIFT_LEFT  0x1C


int lcd_leer()
{
  int valor;

  set_tris_d(0x00);///todos como salida
  set_tris_b(0xFF);

  lcd_rw = 1;
  delay_cycles(1);
  lcd_enable = 1;
  delay_cycles(1);
  valor = lcd_b;
  lcd_enable = 0;
  delay_us(40);

  set_tris_b(0x00);
  return valor;
}


void lcd_enviar(int dir, int valor)
{
  set_tris_d(0x00);///todos como salida
  set_tris_b(0x00);

  lcd_rs = 0;
  while( bit_test(lcd_leer(),7) );
  lcd_rs = dir;
  delay_cycles(1);

  lcd_rw = 0;
  delay_cycles(1);
  lcd_enable = 0;
  lcd_b = valor;
  delay_cycles(1);
  lcd_enable = 1;
  delay_us(2);
  lcd_enable = 0;
  delay_us(40);
}


void lcd_init()
{
  int i;

  set_tris_d(0x00);///todos como salida
  set_tris_b(0x00);

  lcd_enable = 0;
  lcd_rw = 0;
  lcd_rs = 0;
  delay_ms(15);

  for(i=0; i<3; i++)
  {
    lcd_enviar(LCD_COMANDO,0x38);
    delay_ms(5);
  }
  lcd_enviar(LCD_COMANDO,LCD_DISPLAY_ON);
  lcd_enviar(LCD_COMANDO,0x06);
  lcd_enviar(LCD_COMANDO,LCD_CLEAR);
  lcd_enviar(LCD_COMANDO,LCD_HOME);
}


void lcd_gotoxy( byte x, byte y) {
   byte dir;

   if(y!=1)
     dir=LCD_LINEA2;
   else
     dir=0;
   dir+=x-1;
   lcd_enviar(LCD_COMANDO,0x80|dir);
}


void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_enviar(LCD_COMANDO,0x01);
                   delay_ms(2);
                   break;
     case '\n'   : lcd_gotoxy(1,2);               break;
     case '\b'   : lcd_enviar(LCD_COMANDO,0x10);  break;
     default     : lcd_enviar(LCD_DATO,c);        break;
   }
}


char lcd_getc( int x, int y) {
   char valor;

    lcd_gotoxy(x,y);

    lcd_rs = 1;
    valor = lcd_leer();
    lcd_rs = 0;

    return valor;
}


el problema es cundo quiero en cender  5 led conectados en las patitas D0 a D4 ninguno se enciende

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Envio de caracteres especiales al lcd
« Respuesta #12 en: 11 de Agosto de 2008, 14:28:33 »
como los estas encendiendo puedes colocar el codigo de tu main y demás??

porque la libreria parece que va bien
.

Desconectado alfred_197

  • PIC10
  • *
  • Mensajes: 15
Re: Envio de caracteres especiales al lcd
« Respuesta #13 en: 11 de Agosto de 2008, 15:40:28 »
conto esto solo se enciende  un rato y luego se apaga  no si es necesario el byte port_d y b y el SET_tris_D(0x00) no se algo estoy haciendo mal y no lo encuentro, ahhhh y disculpen por el desatre me falta terminarlo.

#include <16f877.h> // Selecciona el PIC
#fuses XT,NOWDT,PROTECT,PUT,BROWNOUT // Opciones de configuración
#use delay(clock=4000000) // Velocidad del Cristal : 4 Mhz
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#byte port_a= 0x05
#byte port_b=0x06
#byte port_c= 0x07
#byte port_d=0x08
#byte port_e= 0x09
#include<lcd2.c>
int N_interrup=0,Confic=0;           // Contador de interrupciones RTCC completas
int segundo=0;          // Segundos del Reloj
int minuto=0;           // Minutos del Reloj
int Tiempo=0,ksegundo=17;
#int_RTCC                 // Interrupción por desbordamiento
Desborde_TMR0()
{++N_interrup;
 ++Confic;
 if(N_interrup==15)/// si ocure 15 interupciones entonces trancurio 1 segundo
 {if(segundo==0)
  {segundo =59;
   minuto--;
  }
  else
   --segundo ;
  N_interrup=0;
 }
void main()
{ int Contador=0,i,j,Ksegundo=17;
  //char inicio[9]="esto esta ";
  //char laser[19]="* bueno??? *";
  SET_TRIS_A(0xff);//configuracion de los puertos como estradas y salidas
  SET_TRIS_B(0x00);
  SET_TRIS_C(0xc0);
  SET_TRIS_D(0x00);
  SET_TRIS_E(0xff);
  port_d=0x00;
  lcd_init( );
  setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_256);
  /*lcd_gotoxy(5,1);
  for(i=0;i<8;i++)
  {lcd_putc(inicio);
   delay_ms(100);
  }
  lcd_gotoxy(3,2);
  for(j=0;j<17;j++)
  {lcd_putc(laser[j]);
   delay_ms(100);
  }
 ///  esceritura de la memoria eeprom interna
  */
 while(TRUE)
  {if(input(PIN_A0))///////////////////////tecla SELEC///////////////////
   {lcd_gotoxy(1,1);
    lcd_putc("SELec. MODO\n   UP or DOWN   ");
    do///////////ciclo infinito donde se realiza todo el tratamiento
    {if(input(PIN_A3))///////////////////tecla UP////////////////////////
     {delay_ms(100);
      contador++;
      if(contador==3)
      {contador=1;
      }
     }
     if(input(PIN_A4))//////////////////tecla DOWN/////////////////////
     {delay_ms(100);
      if(contador==0)
      {contador=2;
      }
      contador--;
     }
     if(contador==1)///////////////////tratamiento del motor////////
     {output_high(PIN_D0);
      while(input(PIN_C7))///Si no esta conectado terminal ///////
      {lcd_gotoxy(1,1);
       lcd_putc("!!cierre el   \n   Switch de Conf. ");
      }
      lcd_gotoxy(1,1);
      lcd_putc("   Potencia  \n ** Alfred **");
      if(input(PIN_A1))//////tecla de CONFIGURACION//////////////////
      {
      }/////fin de la tecla de CONFIGURACION
     }
     if(contador==2)/////////////////tratamiento de  ventilador//////
     {output_high(PIN_D1);//////////encedidi del led  conectado al puerto d
      while(input(PIN_C6))
      {lcd_gotoxy(1,1);
       lcd_putc("!!cierre nel   \n  switch de mando");
      }
      lcd_gotoxy(1,1);
      lcd_putc("  \n ** alfred ** ");
     }
    }while(!Input(PIN_A2));////tecla ESCAPE////////
   }
  }///FIN DEL CICLO INFINITO
 }//////FINAL DE MAIN

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Envio de caracteres especiales al lcd
« Respuesta #14 en: 11 de Agosto de 2008, 16:19:35 »
saludos alfred, si esta un poquito raro el codigo :mrgreen: te sugiero que utilices la opcion del code, cuando escribes el mensaje salen varios iconos en la parte superior del cuadro de escritura ahí verás un #, este puede servir para colocar de una forma más ordenada tu código, al menos no se vuelve en cursiva por algún código que interpreta como tal el editor de texto.

pero temo que puede ser un problema de rebote de contactos, creo que aveces no solo basta con colocarle un retardo de 20ms o 100ms o hasta 1s, sino conviene hacer lo siguiente, al menos esto hago yo:

Código: [Seleccionar]
if(input(pin_ax)){
   do{
      delay_ms(20);
   }while(input(pin_ax));
   ...
   ...  //el resto de las cosas
}
if(input(pin_xx)){
   do{
      delay_ms(20);
   }while(input(pin_xx));
   ...
   ...
}

tb ten cuidado con las llaves, el if contendrá todo lo que en ellas se encuentre.

espero sirva de algo, sino me puedes decir a grandes rasgos en que consiste tu programa para ubicarse mejor en el código.
.


 

anything