Posteado por: miguelio | Agosto 11, 2008

Displays LCD Alfanuméricos

Cansado de programar pics sin tener una salida donde graficar los resultados(excepto RS232 que a veces también falla) al fin me decidí por aprender a programar LCDs alfanuméricos.

La información en internet no es tan buena como uno debería esperar. Despues de buscar mucho pude encontrar estos tres recursos, que son los que más me sirvieron:

Especificaciones del controlador HD44780

Muy bueno, incluye todos los comandos y un ejemplo para controlar el display desde un micro PIC.

Revista UCONTROL

Tiene un artículo sobre displays LCD alfanuméricos. Ayuda mucho a entender como funcionan. Cambiando los números en la dirección URL podemos acceder a las demás revistas. (ojo!!! cambiar los dos números de la dirección si no no anda).

Termostato electrónico con PIC y LCD

Un proyecto del archiconocido sitio www.pablin.com.ar, para controlar temperatura y mostrarla en un display. También útil para el conexionado.

Mi proyecto

En mi proyecto conecté un diplay Winstar WH1601A a un PIC16F873A por el puerto D, utilizando BUS de 8 bits. Las señales de control EN, RS y R/W las conecté a patas del puerto A (A5, A2 y A4 respectivamente). El código necesario para manejar el display es el siguiente:

Archivo driver.h:

#ifndef Driver
#define Driver

void initDisplay();
void drive(int16);
void writeString(char*);
void writeChar(char);
void writeControl(int8);
void clearLCD();

//reemplazar por la función que envía datos al display
#define OUTPUTBUS output_c
//reemplazar por la función que espera a que el display tome el comando
#define DISPLAY_DELAY delay_ms(2)
//Manejo de las líneas de control, reemplazar con lo que corresponda
#define SETRS output_high(PIN_A2)
#define CLEARRS output_low(PIN_A2)
#define SETEN output_high(PIN_A5)
#define CLEAREN output_low(PIN_A5)
#define SETRW output_high(PIN_A4)
#define CLEARRW output_low(PIN_A4)

#define DISPLAY_DB_SIZE 0×38
#define TURN_ON 0×0E
#define DISPLAY_CONF 0×06
#define CLEAR_LCD 0×01

#endif

Archivo driver.c:

#include “Driver.h”
#include “Descongelador.h”
#include <string.h>

char buf[8]; //En este lugar vamos a ubicar los datos a mostrar en el display

void initDisplay(){
CLEARRS;
CLEARRW;
CLEAREN;
delay_ms(15);

//Configuro el display
writeControl(DISPLAY_DB_SIZE);
//Lo encendemos
writeControl(TURN_ON);
//Configuraciones adicionales
writeControl(DISPLAY_CONF);
//Escribe el mensaje de inicialización
clearLCD();
drive(127);
}

//Esta función se encarga de enviar al display la temperatura indicada en las unidades definidas en el termostato.
void drive(int16 t){
int16 temperatura;
temperatura = (t * 10) / UNIDADES_POR_GRADO;
sprintf(buf,” %2.1w*C”,temperatura);
writeString(buf);
}

void writeString(char* str){
int i;
int n;
n = strlen(str);
for (i = 0; i < n; i++){
writeChar(str[i]);
}
}

void writeChar(char c){
CLEARRW;
SETRS;
OUTPUTBUS(c);
SETEN;
delay_us(2);
CLEAREN;
DISPLAY_DELAY;
}

void writeControl(int8 data){
CLEARRW;
CLEARRS;
OUTPUTBUS(data);
SETEN;
delay_us(2);
CLEAREN;
DISPLAY_DELAY;
}

void clearLCD(){
CLEARRW;
CLEARRS;
OUTPUTBUS(CLEAR_LCD);
SETEN;
delay_us(2);
CLEAREN;
DISPLAY_DELAY;
}

Todo funcionó perfectamente!!!


Respuestas

  1. tu programa cumple con las mismas funciones que el de pablin?, bueno ese de pablin no logre que me funcionara.
    saludos

  2. Mirá, a mi el programa de pablín no me funcionó. Supongo que debe ser por el módulo LCD. No son todos 100% compatibles. Yo usé un Winstar WH0802 y un WH1602 y me funcionó correctamente con el programa que posteo acá.

    Fijate que lo conecté de forma diferente al de pablín. Yo tengo el BUS en el puerto C y conecto R/W a la pata A4 mientras que el de pablín conecta R/W a masa (es decir todo el tiempo en W)

    Saludos

  3. es una muy buena informacion, ahora sola falta comprobarla. Estoy tratando de hacer lo mismo con el ATmega8 y tiene tambien un voltaje de referencia interno de 2.56V. Con esta nueva informacion avanzare en el proyecto. Muchas gracias

  4. Bueno, me alegro de que te haya servido. Si se presenta algún problema poné un comentario acá y seguramente obtendrás respuesta.

    Saludos

  5. Gracias por la ayuda, a mi me pasa que con el proyecto de pablin, me deja encendida una sola linea y no avanza de ahi. Para contrastarlo con otro, me arme un proyecto basico con lcd y un 16f873, lo conecto y funciona perfecto, con la pata RW a masa y todo, pero cuando cambio y pongo el 870 con el hex de pablin, no anda. Será la compatibilidad con el display? estoy usando uno standard 16×2. si es así, se podran corregir un par de lineas en el asm de pablin y que funcione? Muchas gracias !!!

    • Cuando empecé el proyecto el código de pablin fue uno de los primeros que probé pero no pude hacer andar, al final decidí empezar de cero en base a la documentación y me fue mucho mejor. Te recomiendo que hagas eso.

      Saludos.

  6. me intereso el proyecto que desarrollaste, es por eso que dejo esta nota, porque me gustaria que me facilitaras el codigo, con en que tranajaste. gracias por tu atencion

    • Hola Luz, me alegro de que te haya interesado el proyecto.

      Te respondí la consulta por mail.

      Saludos


Dejar una respuesta

Su respuesta:

Categorías