22 abril 2014

Módulos LCD: Hitachi HD44780



Cuando queramos interactuar con nuestro aparato  lo primero que interesa es poder ver datos y para ello nada mejor que un display LCD. (si no tienes ningún display siempre podrás usar el puerto serie que lleva el propio soft de Arduino).


   Este es el esquema del archiconocido display Hitachi HD44780. aunque implícitamente no lo ponga casi todos se basan en él, así que es posible que tengas uno y el conexionado sea idéntico.


 

 
 
 
Pin description
PIN NUMBERSYMBOLFUNCTION
1VssGND
2Vdd  + 3V or + 5V
3Vo Contrast Adjustment
4 RSH/L Register Select Signal
5R/WH/L Read/Write Signal
6E   H → L Enable Signal
7 DB0H/L Data Bus Line
8 DB1H/L Data Bus Line
9 DB2H/L Data Bus Line
10 DB3H/L Data Bus Line
11 DB4H/L Data Bus Line
12 DB5H/L Data Bus Line
13 DB6H/L Data Bus Line
14 DB7H/L Data Bus Line
15A/Vee+ 3.5V for LED/Negative Voltage Output
16KK Power Supply for B/L (OV)
 
 
    Si vas a probar una que hayas reciclado de otro proyecto y quieras hacerla funcionar no olvides poner una resistencia variable de 10 kΩ  para el control del contraste:
 
 
 
   Pero si no quieres grandes quebraderos de cabeza por menos de 4 Euros tienes una que se pincha directamente sobre Arduino y tiene hasta botones para hacer un "hipotético menú":
 

 
 
 
 
   Para el código y los pines:
 
 
 
 
/*
 Metemos un texto fijo y la columna de abajo seleccionamos con teclas

 */
// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int adc_key_val[5] = {50, 200, 400, 600, 800 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
boolean luzEncendida=true;
boolean cursorActivo=false;
unsigned long time;
int x=0;
char caracterActual = 'A';

void setup()
{
  lcd.clear();
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("Hello World !!!");
  time = millis();
  //  pinMode(10, OUTPUT);
}

void loop()
{
  if (millis()-time > 10000) {  // Si han pasado mas de 10 segundos apagamos la luz
    pinMode(10, OUTPUT);
    digitalWrite(10, LOW);
    luzEncendida=false;
  }
  if (millis()-time > 5000) {  // Si han pasado mas de 5 segundos apagamos el cursor
    lcd.noBlink();
    cursorActivo=false;
  }

  adc_key_in = analogRead(0);    // Leemos el valor de la pulsacion
  key = get_key(adc_key_in);    // Obtenemos el boton pulsado

  if (key != oldkey)   // if keypress is detected
  {
    delay(50);  // Espera para evitar los rebotes de las pulsaciones
    adc_key_in = analogRead(0);    // Leemos el valor de la pulsacion
    key = get_key(adc_key_in);    // Obtenemos el boton pulsado
    if (key != oldkey)   
    {
      time = millis();  // TODO: falta la comprobacion de si se ha desbordado el tiempo
      if (!luzEncendida) {  // Al pulsar cualquier tecla encendemos la pantalla
        pinMode(10, INPUT);
        luzEncendida=true;
      }
      else {  // si la pantalla esta encendida seguimos funcionando normalmente
        lcd.setCursor(x, 1);
        oldkey = key;
        if (key >=0){  // Si se ha pulsado cualquier tecla
          lcd.blink();  // Mostramos el cursor parpadeando
          cursorActivo=true;
        }
        if (key == 0){  // Se ha pulsado la tecla derecha
          x++;
          if (x>15) x=15;
          caracterActual='A';
        }
        if (key == 1) {  // Se ha pulsado la tecla arriba
          caracterActual++;
          if (caracterActual > 'Z') caracterActual='Z';
          lcd.write(caracterActual);
        }
        if (key == 2) {  // Se ha pulsado la tecla abajo
          caracterActual--;
          if (caracterActual < 'A') caracterActual='A';
          lcd.write(caracterActual);
        }
        if (key == 3) {  // Se ha pulsado la tecla izquierda
          x--;
          if (x<0) x=0;
          caracterActual='A';
        }
        if (key == 4){  // Se ha pulsado la tecla de seleccion
        }
        lcd.setCursor(x, 1);
      }
    }
  }
  delay(100);
}

// Convertimos el valor leido en analogico en un numero de boton pulsado
int get_key(unsigned int input)
{
  int k;

  for (k = 0; k < NUM_KEYS; k++)
  {
    if (input < adc_key_val[k])
    {
      return k;
    }
  }

  if (k >= NUM_KEYS)k = -1;  // Error en la lectura
  return k;
}



-----------------------------------------------------------O-------------------------------------------------------

Enlace al fichero: Descarga el ejemplo:


 -----------------------------------------------------------O-------------------------------------------------------
 
Recuerda:
 
- Si cargas otro ejemplo lo importante es decirle en el programa  donde están las patillas:
 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

- Cambia si es necesario el número de líneas y longitud de caracteres de tu LCD:

lcd.begin(16, 2);          16 caracteres y dos líneas

lcd.begin(20, 4);          20 caracteres y 4 líneas

 
 
  -----------------------------------------------------------O-------------------------------------------------------

 
 

Esquema que uso yo con todos los LCD´s para que sean compatibles:

 
 

 

No hay comentarios: