LCD Display - 8 bits

Este ejemplo muestra la acción más básica que se hace con un display LCD: Mostrar un mensaje de Bienvenida. En nuestro caso disponemos de un display LCD con control de contraste y luz de fondo. Usaremos un potenciómetro para regular el contraste

La mayoria de los displays LCD son controlados por un estandar industrial establecido por Hitachi. De acuerdo con esto hay un grupo de pins dedicados a enviar datos y posiciones de los datos en la pantalla, el usuario puede elegir usar 4 o 8 pines para enviar datos. Además hay tres pines que son necesários para sincronizar la comunicación hacia el display.

En el ejemplo que nos ocupa, usamos casi todos los pins disponibles de la placa de Arduino para controlar el display, pero hemos decidido mostrarlo de esta forma por simplicidad.

Imagen de una placa prototipo con el display y un potenciómetro

[-

/* LCD Hola

 * --------
 *
 *
 * En este primer ejemplo  se usa un display LCD
 * configurado con transferencia de datos sobre 8 bits. El ejemplo 
 * usa todos los pines de la placa Arduino, pero puede fácilmente
 * mostrar datos en el display
 *
 * Se han utilizado los siguientes pines
 * 
 * - DI, RW, DB0..DB7, Enable (11 en total)
 *
 * El pinout para displays LCD es standar y se puede encontrar
 * la documentación completa en internet 
 *
 * (cleft) 2005 DojoDave for K3
 *
 */

int DI = 12; int RW = 11; int DB[] = {3, 4, 5, 6, 7, 8, 9, 10}; int Enable = 2;

void LcdCommandWrite(int value) {

 // aplica a todos los pins
 int i = 0;
 for (i=DB[0]; i <= DI; i++) {
   digitalWrite(i,value & 01);
   value >>= 1;
 }
 digitalWrite(Enable,LOW);
 delayMicroseconds(1);
 // envía un pulso para activar
 digitalWrite(Enable,HIGH);
 delayMicroseconds(1);  // pausa 1 ms de acuerdo a la especificación
 digitalWrite(Enable,LOW);
 delayMicroseconds(1);  // pausa 1 ms de acuerdo a la especificación

}

void LcdDataWrite(int value) {

 //  aplica a todos los pins
 int i = 0;
 digitalWrite(DI, HIGH);
 digitalWrite(RW, LOW);
 for (i=DB[0]; i <= DB[7]; i++) {
   digitalWrite(i,value & 01);
   value >>= 1;
 }
 digitalWrite(Enable,LOW);
 delayMicroseconds(1);
 // envía un pulso para activar
 digitalWrite(Enable,HIGH);
 delayMicroseconds(1);
 digitalWrite(Enable,LOW);
 delayMicroseconds(1);  // pausa 1 ms de acuerdo a la especificación

}

void setup (void) {

 int i = 0;
 for (i=Enable; i <= DI; i++) {
   pinMode(i,OUTPUT);
 }
 delay(100);
 // initiatiza LCD después de una pequeña pausa
 // necesário para los controladores LCD
 LcdCommandWrite(0x30);  // function set:
                         // 8-bit interface, 1 display lines, 5x7 font
 delay(64);                      
 LcdCommandWrite(0x30);  // function set:
                         // 8-bit interface, 1 display lines, 5x7 font
 delay(50);                      
 LcdCommandWrite(0x30);  // function set:
                         // 8-bit interface, 1 display lines, 5x7 font
 delay(20);                      
 LcdCommandWrite(0x06);  // entry mode set:
                         // increment automatically, no display shift
 delay(20);                      
 LcdCommandWrite(0x0E);  // display control:
                         // turn display on, cursor on, no blinking
 delay(20);                      
 LcdCommandWrite(0x01);  // clear display, set cursor position to zero  
 delay(100);                      
 LcdCommandWrite(0x80);  // display control:
                         // turn display on, cursor on, no blinking
 delay(20);                      

}

void loop (void) {

  LcdCommandWrite(0x02);  // set cursor position to zero  
  delay(10);                     
  // Write the welcome message 
  LcdDataWrite('H');
  LcdDataWrite('o');
  LcdDataWrite('l');
  LcdDataWrite('a');
  LcdDataWrite(' ');
  LcdDataWrite('C');
  LcdDataWrite('a');
  LcdDataWrite('r');
  LcdDataWrite('a');
  LcdDataWrite('c');
  LcdDataWrite('o');
  LcdDataWrite('l');
  LcdDataWrite('a');
  delay(500);

}

-]