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 UCONTROL1 UCONTROL3

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 0x38
#define TURN_ON 0x0E
#define DISPLAY_CONF 0x06
#define CLEAR_LCD 0x01

#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

  7. Cordial saludo miguelio!!!!!!

    Estoy comezando con un proyecto en el cual es necesario tener un control de temperatura, noto que la mejor solucion es con un pic 16f873 pero tengo problemas con su programacion podriasdarme una mano , tengo un lm35, pero quisiera utilizar una rtd pt100 o una termocupla tipo j, debo visualizar la humedad asi mismo el SP y/o el PV, controlare dos ventiladores y una valvula servopilotada, si tienes algo que me sirva te lo agradeceria, no se si seria mejor con un lcd o con display,realmente debo economizar gastos, pero la aplicacion debe ser robusta para medio industrial

    de ante mano gracias!!!!!!!!!!

    ALEJANDRO BURITICA
    Tecnologo en electronica industrial
    MANIZALES,COLOMBIA

  8. Que tal.
    Qué grande!! qué programa usaste? el CCS?
    Saludos,
    Nacho

    • si si, el CCS

      saludos

      • Me podés mandar al mail el código fuente? Porque con esos dos no me anda. Mil gracias. SAludos, Nacho

  9. Con hacer el archivo driver.c y driver.h no me funciona con el CCS… me aparece el error en la fila driver.h que dice «error en la la linea 4 y A #DEVICE required before this line»
    Saludos,
    Nacho


Deja un comentario

Categorías