Autor Tema: como enviar o cargar un dato a la LCD no predefinido en la LCD?  (Leído 6733 veces)

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

Desconectado yordan01

  • PIC10
  • *
  • Mensajes: 2
como enviar o cargar un dato a la LCD no predefinido en la LCD?
« en: 07 de Septiembre de 2006, 13:20:37 »
Como predefino un dato en la pantalla LCD  y como hago para mostrarlo?. Por ejemplo el simbolo de grados centigrados?. He escuchado algo de la cgram. Necesito de su ayuda en assembler. Gracias.

Desconectado vszener

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2395
Re: como enviar o cargar un dato a la LCD no predefinido en la LCD?
« Respuesta #1 en: 07 de Septiembre de 2006, 13:27:17 »
Pues sí, es la CGRAM, en el subforo de Almacén del Assembler se ha tratado en más de una ocasión el tema, aquí en este post tienes un ejemplo del símbolo del grado, Generar caracter en LCD


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: como enviar o cargar un dato a la LCD no predefinido en la LCD?
« Respuesta #2 en: 08 de Septiembre de 2006, 04:47:11 »
Hola Yordan01!

Justo ayer por la noche me dió por hacer un efecto extraño (lo tengo a mitad pero ya os lo enseñaré porque es alucinante) con un display LCD y para ello tengo que cargar caracteres en el LCD.

El programa lo tengo en otro ordenador y hoy me va a ser imposible pero... mañana sin falta lo cuelgo para que puedas ver el ejemplo. Por cierto, el programa está hecho en C.


Un saludo desde Alicante.

Desconectado Diego Eduardo

  • PIC10
  • *
  • Mensajes: 9
    • Pic y chistes
Re: como enviar o cargar un dato a la LCD no predefinido en la LCD?
« Respuesta #3 en: 08 de Septiembre de 2006, 19:29:40 »
para poder utilizar caracteres "extranos" me refiero que no sean alfa-numericos.
deves leer la hoja caracteristica de tu LCD por aquello que no la tengas puedes ver la del LCD hitachi puesto que la gran mayoria son compatibles con hitachi, busca una tabla con caracteres, en la parte superior de la tabla y en un costado estan los bits que debes mandar como dato (el RS=1) y colocar en el bus (puerto al que esta el lcd ya sea a 4 u 8 bits) y tendras el caracter raro en el lcd.
la CGRAM es la memoria que tiene asociada una locadidad en la pantalla (por eso es RAM de volatil y CG de caracter)

El Zorro

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: como enviar o cargar un dato a la LCD no predefinido en la LCD?
« Respuesta #4 en: 09 de Septiembre de 2006, 15:59:34 »
Hola Diego Eduardo

Con la CGRam, puedes hasta hacer animaciones de lo que te permita 5x8 pixeles, esa es una caracteristaicas de las pantallas alfanumericas, te permiten crear tus propios caracteres. una imagen de una bateria, un pacman, solo con 5x8 pixeles. mira las direcciones que te dio vszener, que te solucionan el problema.

Suerte

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: como enviar o cargar un dato a la LCD no predefinido en la LCD?
« Respuesta #5 en: 10 de Septiembre de 2006, 20:01:31 »
Que tal?

Lo prometido es deuda dicen por ahí, osea que, toma esto.

Código: [Seleccionar]
/////////////////////////////////////////////////////////////////////////
////                                                                 ////
////                        Azicuetano                               ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////

// AQUI VAN LOS INCLUDES !!!

#include <18F2550.h>
#include "flex_lcd.c"

#fuses XT,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP, NOPBADEN
#use delay(clock=4000000)

// AQUI VAN LOS DEFINES !!!

#define  use_portb_lcd  TRUE
#DEFINE  UP             1
#DEFINE  DOWN           2
#DEFINE  MENU           3
#DEFINE  NO_PULSADA     4

// AQUI VAN LAS VARIABLES GLOBALES !!!

int      tecla_pulsada=NO_PULSADA;

// AQUI VAN LAS DECLARACIONES DE LAS FUNCIONES !!!

int   detecta_tecla(void);
void  cargar_caracter(void);

void cargar_caracter(void)
{
   int   n=0, indice=0;
   
   char   caracter_A[8] = {  0b11000000,
                             0b11000100,
                             0b11001010,
                             0b11010001,
                             0b11010001,
                             0b11011111,
                             0b11010001,
                             0b11010001};

   char   caracter_z[8] = {  0b11000000,
                             0b11000000,
                             0b11000000,
                             0b11011111,
                             0b11000010,
                             0b11000100,
                             0b11001000,
                             0b11011111};

   char   caracter_i[8] = {  0b11000000,
                             0b11000100,
                             0b11000000,
                             0b11001100,
                             0b11000100,
                             0b11000100,
                             0b11000100,
                             0b11001110};

   char   caracter_c[8] = {  0b11000000,
                             0b11000000,
                             0b11000000,
                             0b11001111,
                             0b11010000,
                             0b11010000,
                             0b11010000,
                             0b11001111};

   char   caracter_u[8] = {  0b11000000,
                             0b11000000,
                             0b11000000,
                             0b11010001,
                             0b11010001,
                             0b11010001,
                             0b11010001,
                             0b11001110};

   char   caracter_e[8] = {  0b11000000,
                             0b11000000,
                             0b11000000,
                             0b11001110,
                             0b11010001,
                             0b11011111,
                             0b11010000,
                             0b11001111};
 
   lcd_send_byte(0,0x40);                    // Enviamos esto para que nos empiece a
                                             // escribir en la primera dirección de la CGRAM
                                             // del display.

   printf(lcd_putc,"%c", caracter_A[0]);     // Caracter 1
   printf(lcd_putc,"%c", caracter_A[1]);
   printf(lcd_putc,"%c", caracter_A[2]);
   printf(lcd_putc,"%c", caracter_A[3]);
   printf(lcd_putc,"%c", caracter_A[4]);
   printf(lcd_putc,"%c", caracter_A[5]);
   printf(lcd_putc,"%c", caracter_A[6]);
   printf(lcd_putc,"%c", caracter_A[7]);

   printf(lcd_putc,"%c", caracter_z[0]);     // Caracter 2
   printf(lcd_putc,"%c", caracter_z[1]);
   printf(lcd_putc,"%c", caracter_z[2]);
   printf(lcd_putc,"%c", caracter_z[3]);
   printf(lcd_putc,"%c", caracter_z[4]);
   printf(lcd_putc,"%c", caracter_z[5]);
   printf(lcd_putc,"%c", caracter_z[6]);
   printf(lcd_putc,"%c", caracter_z[7]);

   printf(lcd_putc,"%c", caracter_i[0]);     // Caracter 3
   printf(lcd_putc,"%c", caracter_i[1]);
   printf(lcd_putc,"%c", caracter_i[2]);
   printf(lcd_putc,"%c", caracter_i[3]);
   printf(lcd_putc,"%c", caracter_i[4]);
   printf(lcd_putc,"%c", caracter_i[5]);
   printf(lcd_putc,"%c", caracter_i[6]);
   printf(lcd_putc,"%c", caracter_i[7]);

   printf(lcd_putc,"%c", caracter_c[0]);     // Caracter 4
   printf(lcd_putc,"%c", caracter_c[1]);
   printf(lcd_putc,"%c", caracter_c[2]);
   printf(lcd_putc,"%c", caracter_c[3]);
   printf(lcd_putc,"%c", caracter_c[4]);
   printf(lcd_putc,"%c", caracter_c[5]);
   printf(lcd_putc,"%c", caracter_c[6]);
   printf(lcd_putc,"%c", caracter_c[7]);

   printf(lcd_putc,"%c", caracter_u[0]);     // Caracter 5
   printf(lcd_putc,"%c", caracter_u[1]);
   printf(lcd_putc,"%c", caracter_u[2]);
   printf(lcd_putc,"%c", caracter_u[3]);
   printf(lcd_putc,"%c", caracter_u[4]);
   printf(lcd_putc,"%c", caracter_u[5]);
   printf(lcd_putc,"%c", caracter_u[6]);
   printf(lcd_putc,"%c", caracter_u[7]);

   printf(lcd_putc,"%c", caracter_e[0]);     // Caracter 6
   printf(lcd_putc,"%c", caracter_e[1]);
   printf(lcd_putc,"%c", caracter_e[2]);
   printf(lcd_putc,"%c", caracter_e[3]);
   printf(lcd_putc,"%c", caracter_e[4]);
   printf(lcd_putc,"%c", caracter_e[5]);
   printf(lcd_putc,"%c", caracter_e[6]);
   printf(lcd_putc,"%c", caracter_e[7]);   
}


//##############################################################################
//#
//#   Función encargada de detectar la tecla pulsada.
//#
//#   Nos devolverá:
//#
//#   TECLA_UP    -> SI PULSAMOS LA TECLA SUPERIOR
//#   TECLA_MENU  -> SI PULSAMOS LA TECLA CENTRAL
//#   TECLA_DOWN  -> SI PULSAMOS LA TECLA INFERIOR
//#
//##############################################################################

int detecta_tecla(void)
{
   if(input(PIN_A5)==0)
   {
      delay_ms(30);
      tecla_pulsada=DOWN;
      return(tecla_pulsada);
   }

   if(input(PIN_A3)==0)
   {
      delay_ms(30);
      tecla_pulsada=UP;
      return(tecla_pulsada);
   }

   if(input(PIN_A4)==0)
   {
      delay_ms(30);
      tecla_pulsada=MENU;
      return(tecla_pulsada);
   }

   tecla_pulsada=NO_PULSADA;
   return(tecla_pulsada);
}

/////////////////////////////////////////////////////////////////////////////
//
//    MAIN: PROGRAMA PRINCIPAL
//
/////////////////////////////////////////////////////////////////////////////

void main(void)
{
   set_tris_a(0b11111111);
   set_tris_b(0b00000000);

   port_b_pullups(FALSE);

   lcd_init();                               //inicializa lcd
   delay_ms(50);

   printf(lcd_putc,"\f FORO TODOPIC ;)");    //muestra por pantalla el mensaje
   delay_ms(2000);
   
   tecla_pulsada=detecta_tecla();
   
   cargar_caracter();

   printf(lcd_putc,"\f->");
   
   while(1)
  {
      tecla_pulsada=detecta_tecla();

      if(tecla_pulsada==MENU)
      {
         delay_ms(50);
         printf(lcd_putc," ");
         lcd_gotoxy(0,1);
         printf(lcd_putc,"     %c%c%c%c%c%c",0,1,2,3,4,5);
      }
   }
}


Si tienes alguna duda pregunta que te responderé encantado. Con un poco de imaginación se pueden hacer cosas tan chulas como esta (como mi camara es una chufa se ve muy mal, pero, en realidad el efecto es muy nítido):

http://rapidshare.de/files/32674026/MVI_0101.avi.html


Un saludo desde Alicante.


Desconectado Dancrazy

  • PIC16
  • ***
  • Mensajes: 134
Re: como enviar o cargar un dato a la LCD no predefinido en la LCD?
« Respuesta #6 en: 12 de Septiembre de 2006, 10:30:55 »
Hola amigos

Hace algun tiempo lo hice. Es relativamente sencillo pero laborioso. La CGRAM de la pantalla que utilize (LCD 16x2) era una memoria dondde el direcionamiento equivalia a dibujar un punto en una cuadricula limitada por el ancho y largo maximo de caracter. Era como un mapa de bits, donde gracias al mouse, dibujas un punto, y luego otro y otro hasta completar el simbolo deseado. Como te imaginaras, en la LCD no hay mouse, asi que lo haces a punta de coordenadas en la CGRAM y luego lo guardas como una direccion. Esto creo que varia de modelo en modelo de LCD. Busca el data Del Controlador de la pantalla, no de la pantalla. El controlador es del chip mas grande que se ve. en mi caso al pantalla tenia un codigo que no recuerdo, pero su controlador era Samsung. Busque el numero y tenia un muy buen datasheet de como inicializarlo, y la gama de opciones de como programar los caracteres especiales. Ademas me mostraba la cantidad de caracteres válidos y me parece que el "º" estaba incluido. Buscalo, a lo mejor esta y te ahorras ese trabajito...

como accederla en asembler?
depende como hayas conectado la pantallita...  yo trabaje en micro 8051 de Intel (asembler) y estaba conectado al bus de datos, compartido con un teclado. con la orden:
MOV DPTR,#8100     // Mover al DPTR (unico registro de 16 bits), la constante 8100
Mov A,#40h             //Mover al Acumulador (Registro de uso general) el caracte "@" en ascii
MOVX @DPTR,A      //Mover a la posiccion mostrada por el dptr el contenido de A

que hice aqui?, pues el micro cree que la pantalla (y el teclado=9000) eran memorias externas, usando un data select o Decoder con las lineas de direcciones del micro identificaba con cual dispositivo estaba hablando ( por ello el 8000 o 9000) y el resto de los numeros le decian al LCD que queria hacer (leerla, escribirla o enviar comando (por ello 8100) y una vez hecho esto le decia cual caracter escribir.

Espero haber ayudado...
Daniel 
Caracas, Venezuela 

-----------------