TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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!
-
Aqui encontre un tutorial muy bueno ojala te sirva
Tutorial lcd 4x20 (http://jmnlab.com/lcd/lcd.html)
-
Gracias por la hora que es acá lo vere mañana pero muchas gracias!!!!!!!
-
Hola Mikro-77
pero dices generar o imprimir caracteres?, porque el font para un 2x16 es igual para un 4x20
-
Hola PalitroqueZ quiero generar y no entiendo como debo posicionarme en los caracteres 9° en adelante asi con el 2° 3° y 4° renglon
-
Hola amigo, esta es la distribución de memoria del LCD en mención, si en algo te puede servir
Saludos.
-
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
//*******************************************************************************
// 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
-
Hola !! :-/ :-/ :-/ :-/
Ya conteste !! :mrgreen: :mrgreen:
-
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
-
No usa corpiño ???!!! :shock: :shock: :shock: :D :D ((:-)) ((:-))
-
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
-
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
//*******************************************************************************
// 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
-
el compilador pcw trae una librería para el 4x20, se llama LCD420.C
-
si lo se en realidad estoy usando flex
-
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.
-
//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!!
-
....
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.
-
Gracias no entiendo mucho como veras no tengo una formacion ni buenos cimientos voy a seguir probando aver que sale!
-
...paciencia alguien bondadoso me pasara un ejemplo algun dia asi lo entiendo cabalmente...
-
Hola, mira si en algo te sirve este ejemplo.
Saludos
-
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
-
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!!