TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Mikro-77 en 01 de Mayo de 2013, 16:28:41

Título: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Mikro-77 en 01 de Mayo de 2013, 16:28:41
Hola basicamente esa es mi pregunta la del titulo resulta que estoy tratando de generar caracteres en un lcd de 4x20 primero con el programa Generador caracteres LCD 2x16 y luego tratando de modificar los parametros para escribir 20 caracteres en los 4 renglones pero estoy bastante perdido! si alguien me guia para entender como funciona tal ves despues desempolve delphi para hacer un programa para generar los caracteres para todas las posiciones en los 4 renglones, ... si es que me acuerdo todavia de pascal  :D

PD: creo que con un ejemplo estaria muy agradecido.

saludos!
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: electroipod en 02 de Mayo de 2013, 00:31:14
Aqui encontre un tutorial muy bueno ojala te sirva
Tutorial lcd 4x20 (http://jmnlab.com/lcd/lcd.html)
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Mikro-77 en 02 de Mayo de 2013, 01:11:56
Gracias por la hora que es acá lo vere mañana pero muchas gracias!!!!!!!
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: PalitroqueZ en 02 de Mayo de 2013, 01:54:28
Hola Mikro-77

pero dices generar o imprimir caracteres?, porque el font para un 2x16 es igual para un 4x20

Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Mikro-77 en 02 de Mayo de 2013, 08:12:06
Hola PalitroqueZ  quiero generar y no entiendo como debo posicionarme en los caracteres 9° en adelante asi con el 2° 3° y 4° renglon
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Diego E. en 02 de Mayo de 2013, 09:20:31
Hola amigo, esta es la distribución de memoria del LCD en mención, si en algo te puede servir

Saludos.

Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Mikro-77 en 02 de Mayo de 2013, 10:03:48
muchas gracias Diego E. pero hay algo que no me queda claro y es que al generar el codigo con el generador de caracteres me sale este codigo

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 <16F84A.h>
#fuses XT,NOWDT,PUT
#use delay(clock=4000000)

#byte porta =5
#byte portb =6
#define use_portb_lcd TRUE
#include <LCD.c>
int const caracter0_direccion[8]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
int const caracter0_datos[8]={0b00000,0b00000,0b01010,0b00100,0b10001,0b01110,0b00000,0b0};

int const caracter1_direccion[8]={0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
int const caracter1_datos[8]={0b00000,0b00000,0b01010,0b00100,0b00000,0b01110,0b10001,0b0};

int const caracter2_direccion[8]={0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57};
int const caracter2_datos[8]={0b00000,0b00000,0b01010,0b00100,0b00000,0b01110,0b00000,0b0};

int const caracter3_direccion[8]={0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f};
int const caracter3_datos[8]={0b00000,0b00000,0b01010,0b00100,0b00000,0b01110,0b01110,0b0};

int const caracter4_direccion[8]={0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67};
int const caracter4_datos[8]={0b00000,0b01010,0b01010,0b00100,0b01110,0b10001,0b01110,0b0};

int const caracter5_direccion[8]={0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f};
int const caracter5_datos[8]={0b00000,0b00000,0b11011,0b00100,0b00100,0b10001,0b01110,0b0};

int const caracter6_direccion[8]={0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77};
int const caracter6_datos[8]={0b00000,0b11011,0b11011,0b00100,0b00000,0b01110,0b00000,0b0};

int const caracter7_direccion[8]={0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f};
int const caracter7_datos[8]={0b00000,0b00000,0b11011,0b00100,0b00000,0b01110,0b10001,0b0};


void main() {
int contador;
set_tris_a(0x0);
set_tris_b(0x0);
lcd_init();
for(contador=0;contador<8;contador++){
lcd_send_byte(0,caracter0_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter0_datos[contador]);        // modo dato
lcd_send_byte(0,caracter1_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter1_datos[contador]);        // modo dato
lcd_send_byte(0,caracter2_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter2_datos[contador]);        // modo dato
lcd_send_byte(0,caracter3_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter3_datos[contador]);        // modo dato
lcd_send_byte(0,caracter4_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter4_datos[contador]);        // modo dato
lcd_send_byte(0,caracter5_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter5_datos[contador]);        // modo dato
lcd_send_byte(0,caracter6_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter6_datos[contador]);        // modo dato
lcd_send_byte(0,caracter7_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter7_datos[contador]);        // modo dato

}
lcd_send_byte(0,0x80);

for(contador=0;contador<8;contador++){
lcd_send_byte(1,contador); //modo dato
}
delay_cycles(1);
}

como ven las lineas

int const caracter0_direccion[8]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
int const caracter0_datos[8]={0b00000,0b00000,0b01010,0b00100,0b10001,0b01110,0b00000,0b0};

se posicionan en 0x40 en adelante y con tu distribucion empiezan en 80 Diego E. porque es asi en el codigo y que significa 0b0 ?

otra cosa es que si ago

int const caracter0_direccion[8]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87};
int const caracter0_datos[8]={0b00000,0b00000,0b01010,0b00100,0b10001,0b01110,0b00000,0b0};

no funciona ! perdón si no entiendo nada solo toco de oido ! :(

PD: y se me ocurrio algo! al que me conteste primero, le presento a mi hermana  :mrgreen: :D
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: MGLSOFT en 02 de Mayo de 2013, 10:38:11
Hola !!  :-/ :-/ :-/ :-/
Ya conteste !! :mrgreen: :mrgreen:
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Mikro-77 en 02 de Mayo de 2013, 10:41:36
JAJAJA ! olvide decir que es luchadora de sumo pero mientras no me coqueteen ami agan lo que quieran  :D todo sea en nombre de la programacion  :D
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: MGLSOFT en 02 de Mayo de 2013, 10:50:50
No usa corpiño ???!!!  :shock: :shock: :shock: :D :D ((:-)) ((:-))
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Mikro-77 en 02 de Mayo de 2013, 10:58:17
siii pero se lo olvida aveces   :oops:  :D mi hermana es muy mona ! ... ... si !! es bajita gorda y tiene pelos por todos lados  :D :D
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Mikro-77 en 02 de Mayo de 2013, 11:19:11
Repito mi pregunta que quedo un poco resagada!

muchas gracias Diego E. pero hay algo que no me queda claro y es que al generar el codigo con el generador de caracteres me sale este codigo

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 <16F84A.h>
#fuses XT,NOWDT,PUT
#use delay(clock=4000000)

#byte porta =5
#byte portb =6
#define use_portb_lcd TRUE
#include <LCD.c>
int const caracter0_direccion[8]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
int const caracter0_datos[8]={0b00000,0b00000,0b01010,0b00100,0b10001,0b01110,0b00000,0b0};

int const caracter1_direccion[8]={0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
int const caracter1_datos[8]={0b00000,0b00000,0b01010,0b00100,0b00000,0b01110,0b10001,0b0};

int const caracter2_direccion[8]={0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57};
int const caracter2_datos[8]={0b00000,0b00000,0b01010,0b00100,0b00000,0b01110,0b00000,0b0};

int const caracter3_direccion[8]={0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f};
int const caracter3_datos[8]={0b00000,0b00000,0b01010,0b00100,0b00000,0b01110,0b01110,0b0};

int const caracter4_direccion[8]={0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67};
int const caracter4_datos[8]={0b00000,0b01010,0b01010,0b00100,0b01110,0b10001,0b01110,0b0};

int const caracter5_direccion[8]={0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f};
int const caracter5_datos[8]={0b00000,0b00000,0b11011,0b00100,0b00100,0b10001,0b01110,0b0};

int const caracter6_direccion[8]={0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77};
int const caracter6_datos[8]={0b00000,0b11011,0b11011,0b00100,0b00000,0b01110,0b00000,0b0};

int const caracter7_direccion[8]={0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f};
int const caracter7_datos[8]={0b00000,0b00000,0b11011,0b00100,0b00000,0b01110,0b10001,0b0};


void main() {
int contador;
set_tris_a(0x0);
set_tris_b(0x0);
lcd_init();
for(contador=0;contador<8;contador++){
lcd_send_byte(0,caracter0_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter0_datos[contador]);        // modo dato
lcd_send_byte(0,caracter1_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter1_datos[contador]);        // modo dato
lcd_send_byte(0,caracter2_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter2_datos[contador]);        // modo dato
lcd_send_byte(0,caracter3_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter3_datos[contador]);        // modo dato
lcd_send_byte(0,caracter4_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter4_datos[contador]);        // modo dato
lcd_send_byte(0,caracter5_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter5_datos[contador]);        // modo dato
lcd_send_byte(0,caracter6_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter6_datos[contador]);        // modo dato
lcd_send_byte(0,caracter7_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter7_datos[contador]);        // modo dato

}
lcd_send_byte(0,0x80);

for(contador=0;contador<8;contador++){
lcd_send_byte(1,contador); //modo dato
}
delay_cycles(1);
}

como ven las lineas

int const caracter0_direccion[8]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
int const caracter0_datos[8]={0b00000,0b00000,0b01010,0b00100,0b10001,0b01110,0b00000,0b0};

se posicionan en 0x40 en adelante y con tu distribucion empiezan en 80 Diego E. porque es asi en el codigo y que significa 0b0 ?

otra cosa es que si ago

int const caracter0_direccion[8]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87};
int const caracter0_datos[8]={0b00000,0b00000,0b01010,0b00100,0b10001,0b01110,0b00000,0b0};

no funciona ! perdón si no entiendo nada solo toco de oido ! :(

PD: y se me ocurrio algo! al que me conteste primero, le presento a mi hermana  :mrgreen: :D
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: PalitroqueZ en 02 de Mayo de 2013, 11:44:23
el compilador pcw trae una librería para el 4x20, se llama LCD420.C
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Mikro-77 en 02 de Mayo de 2013, 11:54:46
si lo se en realidad estoy usando flex
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: PalitroqueZ en 02 de Mayo de 2013, 12:30:08
es bueno aclarar varios puntos, el código que genera el software cgram, utiliza la librería lcd.c y la librería lcd.c al igual que la flex son para pantallas de 2x16

si se mira el código de la función gotoxy de la librería lcd420.c, se notarán la inclusión de los renglones adicionales de la pantalla 4x20.

así pues, yo dudo que una librería que está escrita para pantallas de 2 filas por 16 caracteres visibles, vaya funcionar a plenitud para una pantalla de 4 filas por 20 caracteres visibles.
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Mikro-77 en 02 de Mayo de 2013, 12:40:17
//Estas son las direcciones de línea para la mayoría de las pantallas LCD 4x20.

#define LCD_LINE_1_ADDRESS 0x00
#define LCD_LINE_2_ADDRESS 0x40
#define LCD_LINE_3_ADDRESS 0x14
#define LCD_LINE_4_ADDRESS 0x54

vean abajo a la derecha que en el datasheet del winstar 2004a dice lo mismo!!


/ / Estas son las direcciones de línea para los LCD que utilizan
/ / El HD66712U chip controlador Hitachi.
/*
#define LCD_LINE_1_ADDRESS 0x00
#define LCD_LINE_2_ADDRESS 0x20
#define LCD_LINE_3_ADDRESS 0x40
#define LCD_LINE_4_ADDRESS 0x60
*/

eso dice la libreria flex! entonces porque solo con la direccion 0x40 puedo empezar a imprimir en la posicion 1 del lcd y con 0x00 o con 0x14 no hace nada?

el codigo generado por tu programa es

int const caracter0_direccion[8]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
int const caracter0_datos[8]={0b00000,0b00000,0b01010,0b00100,0b10001,0b01110,0b00000,0b0};

y me gustaria hacer

int const caracter0_direccion[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
int const caracter0_datos[8]={0b00000,0b00000,0b01010,0b00100,0b10001,0b01110,0b00000,0b0};

porque no puedo? mi lcd es de 4x20 es winstar wh2004a!!
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: PalitroqueZ en 02 de Mayo de 2013, 14:31:46
....
el codigo generado por tu programa es

int const caracter0_direccion[8]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
int const caracter0_datos[8]={0b00000,0b00000,0b01010,0b00100,0b10001,0b01110,0b00000,0b0};

y me gustaria hacer

int const caracter0_direccion[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
int const caracter0_datos[8]={0b00000,0b00000,0b01010,0b00100,0b10001,0b01110,0b00000,0b0};

porque no puedo? mi lcd es de 4x20 es winstar wh2004a!!

en el código generado, el arreglo caracter0_direccion es para enviarle una configuración al controlador de la lcd de la siguiente manera:

0x40 en binario es 1000000, si miramos la tabla del instruction code en el link que sugirió electroipod notarás que colocar un "1" en en bit 6, corresponde a set cgram adress, es decir, con este comando, le estás diciendo que reserve la primera posición de la ram para enviarle a posteriori el dato que corresponde al carácter.

caracter0_direccion no es una posición de memoria ni un carácter, es un comando de configuración para el controlador de la lcd.



Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Mikro-77 en 02 de Mayo de 2013, 20:05:08
Gracias no entiendo mucho como veras no tengo una formacion ni buenos cimientos voy a seguir  probando aver que sale!
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Mikro-77 en 04 de Mayo de 2013, 00:06:20
...paciencia alguien bondadoso me pasara un ejemplo algun dia asi lo entiendo cabalmente...
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Diego E. en 04 de Mayo de 2013, 09:29:07
Hola, mira si en algo te sirve este ejemplo.

Saludos
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: PalitroqueZ en 04 de Mayo de 2013, 13:36:08
el foro tiene un excelente buscador donde se consiguen ejemplos de pantallas lcd. En google se consiguen miles y miles de ejemplos bien explicados con su código fuente,

http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html

por ejemplo, en este site, se consigue un script interactivo donde el usuario puede introducir la secuencia de comandos-datos para mostrar caracteres en la pantalla

http://www.engineering.uiowa.edu/~ece_036/Lecture/Lecture9.pdf

en este otro site aparece una extensión de una datasheet que explica el funcionamiento paso a paso de una lcd alfanumerica

si conoces el funcionamiento de una 2x16, no será para nada difícil controlar una de 2x40, 1x20 o 4x20
Título: Re: alguien tiene un ejemplo de Como generar caracteres en lcd de 4 x 20 ?
Publicado por: Mikro-77 en 05 de Mayo de 2013, 13:32:58
gracias amigo !!!!! ahora si voy encontrando el camino de lo que quiero hacer y estoy entendiendo como funciona casi sin tocar el codigo ! es lindo investigar pero necesitaba un ejemplo porque estaba muy perdido ! te agradezco mucho ahora voy a ver que se puede hacer y que no !

saludos!!