SoloCodigo
Programación Específica => Microcontroladores => Programación en C => Mensaje iniciado por: farmada en Martes 5 de Septiembre de 2006, 16:15
-
Gente. ya estuve trabajando con displays de 16x2 sin problemas, pero en este momento tengo que trabajar con un display 20x4 y tengo el problema de que no lo puedo o no se como inicializarlo. En los 16x2 lo inicializo con 0x38, pero no se como hacerlo con estos. Si alguien me puede dar una mano se los agradezco.
El LCD que estoy usando es el WH2004L
-
Gente. ya estuve trabajando con displays de 16x2 sin problemas, pero en este momento tengo que trabajar con un display 20x4 y tengo el problema de que no lo puedo o no se como inicializarlo. En los 16x2 lo inicializo con 0x38, pero no se como hacerlo con estos. Si alguien me puede dar una mano se los agradezco.
El LCD que estoy usando es el WH2004L
-
Gente muchas gracias igualmente pero ya lo solucione modificando la libreria LCD2.h.
Les paso una version nueva de la LCD2.h para trabajar con Displays de 4x20 ( solo le agregue un Switch-Case.
Espero que les sea de utilidad
#use fast_io(B)
#use fast_io(D)
#define LCD_LINEA2 0xC0 // Direccion de memoria para la segunda linea
#define LCD_LINEA3 0x94 // Direccion de memoria para la tercera linea
#define LCD_LINEA4 0xD4 // Direccion de memoria para la cuarta linea
#define LCD_DATO 1
#define LCD_COMANDO 0
#define LCD_CLEAR 0x01
#define LCD_HOME 0x02
#define LCD_MOVCURSO 0x06
#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_b(0x00);
set_tris_d(0xFF);
output_high(PIN_B0); // ( R/W )
delay_cycles(1);
output_high(PIN_B1); // ( E )
delay_cycles(1);
valor = input_d();
output_low(PIN_B1);
delay_us(40);
set_tris_b(0x00);
set_tris_d(0x00);
return valor;
}
void lcd_enviar(int dir,int valor)
{
set_tris_b(0x00);
set_tris_d(0x00);
output_low(PIN_B1);
delay_ms (1);
output_low(PIN_B2);
output_bit(PIN_B2, dir);
delay_ms (1);
output_d(valor);
delay_ms (1);
output_high(PIN_B1);
delay_cycles(1);
output_low(PIN_B1);
delay_ms (1);
}
void lcd_init()
{
int i;
set_tris_b(0x00);
set_tris_d(0x00);
output_low(PIN_B1);
output_low(PIN_B0);
output_low(PIN_B2);
delay_ms(15);
for(i=0; i<3; i++)
{
lcd_enviar(LCD_COMANDO,0x38);
delay_ms(5);
}
lcd_enviar(LCD_COMANDO,LCD_DISPLAY_ON);
delay_ms(5);
lcd_enviar(LCD_COMANDO,LCD_CLEAR);
delay_ms(5);
lcd_enviar(LCD_COMANDO,LCD_MOVCURSO);
delay_ms(5);
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_gotoxy( byte x, byte y) {
byte dir;
dir=0;
Switch (y) {
case 1 : dir=0x80; break;
case 2 : dir=0xc0; break;
case 3 : dir=0x94; break;
case 4 : dir=0xd4; break;
}
dir+=x-1;
lcd_enviar(LCD_COMANDO,0x80|dir);
}
void lcd_putc( char c) {
switch © {
case '\f' : lcd_enviar(LCD_COMANDO,0x80);
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);
output_high(PIN_B2);
valor = lcd_leer();
output_low(PIN_B2);
return valor;
}
-
Si la libreria funciona y tienes ganas te pido que la publiques en el subforo de Soluciones de Hard y Soft http://foros.solocodigo.com/index.php?showforum=156 (http://foros.solocodigo.com/index.php?showforum=156) .. aqui se iran poniendo las rutinas verificadas y toda la info util a la hora de programar.. Saludos :)
-
Hola, si a alguien le interesa aqui se venden lcd's de bastantes tipos y el vendedor es muy majo:
http://www.electronicca.com/Stock1/STOCK1.html (http://www.electronicca.com/Stock1/STOCK1.html)
(http://www.electronicca.com/imagen/LCD2.jpg)
-
Hola Farmada,
Estoy usando el WH2004A sin problemas, pero cuando quise pasar a el WH2004L cuya hoja de datos parece idéntica, no pude activarlo.
El A prende el backlight y pone las líneas 1 y 3 en gris desde el comienzo, cuando lo saco y pongo el L, nada pasa, no backlight ni lineas, y el código que tengo y funciona con el A no hace nada con el L. Pense que el L estaba quemado y me dieron otro pero pasa lo mismo, no logro inicializarlo. Podras darme alguna idea? Apenas lo conectas se enciende el backlight como con el A? Gracias!!!