Pages Menu
TwitterFacebook



BANNER2_ALT

Posted by on Abr 15, 2014 in Pantallas LCD/TFT | 6 comments

Pantalla LCD 16×2

Pantalla LCD 16×2

Pantalla LCD

 Descripción de la pantalla LCD

En este ejemplo se trabajara con una pantalla LCD de 16×2, se verán un par de funciones de la misma que se realizaran como escribir texto o limpiar la pantalla. En este caso para evitar un grado de complejidad mayor se trabajara la pantalla LCD con una comunicación de 8 bits, la cual es más sencilla que la de 4 bits. También se hará uso de un potenciómetro como divisor de voltaje para regular el PIN Vee el cual controla el contraste de la pantalla.

Diagrama Esquemático

 

Pantalla lcd

LCD 16X2

 

Materiales

 

Introducción

Pantalla LCD

Una pantalla de cristal liquido o LCD es una pantalla delgada y plana formada por un determinado número de pixeles monocromos (para este caso), colocados delante de una fuente luminosa. Una de las principales características de las pantallas LCD es su bajo consumo de energía eléctrica.

Pantalla JHD-162A

Configuración de los pines, tamaño de la pantalla y de los caracteres.

 

jhd 162A Pantalla lcd

pines

 

 

Controlador de la pantalla JHD-162A, HD44780

El controlador HD44780 es el circuito que se encuentra en la pantalla JHD-162A y es el que controla el manejo del LCD, en este es recomendable revisar la hoja de datos del mismo ya que explica los modos de manejo del LCD y las instrucciones de este. En la siguiente imagen podemos ver una de las páginas de la hoja de datos del controlador en donde se pueden ver varias de las instrucciones que el LCD maneja.

 

LCD atmega Pantalla lcd

instrucciones LCD

 

 

Programa en C

 

#include <avr/io.h>
#include <util/delay.h>
#define Enable_On     PORTC|=_BV(PC2)     //Definiciones
#define Enable_Off     PORTC&=~_BV(PC2)
#define RS_On           PORTC|=_BV(PC0)
#define RS_Off           PORTC&=~_BV(PC0)
#define RW_On          PORTC|=_BV(PC1)
#define RW_Off          PORTC&=~_BV(PC1)
#define Data              PORTD
#define DelayL           _delay_ms(5);

int i=0;

void PORT_init (void){      //Función para inicializar puertos
DDRC=0x07;
DDRD=0xFF;
PORTC=0x00;
PORTD=0x00;
}

void LCD_init (void){     //Función para inicializar el LCD
Data=0x0F;
Enable_On;
DelayL;
Enable_Off;
Data=0x00;
RS_On;
DelayL;
}

void WriteLCD(char text[15]){    //Función para escribir en el LCD
RS_On;
for (i=0;i<16; i++){
Data=text[i];
Enable_On;
DelayL;
Enable_Off;
DelayL;
}
i=0;
Data=0x00;
RS_Off;
}

void ClearLCD(void){        //Función para limpiar la pantalla del LCD
Data=0x01;
Enable_On;
DelayL;
Enable_Off;
}

int main (void){         //Inicio del programa

PORT_init();
LCD_init();

while(1){
WriteLCD("Hola mundo");     //Escribir en el LCD
_delay_ms(1000);
ClearLCD();               //Limpiar la pantalla del LCD
_delay_ms(500);
}
}

 

 Detalles del programa

#define Enable_On                       PORTC|=_BV(PC2)
#define Enable_Off                      PORTC&=~_BV(PC2)
#define RS_On                             PORTC|=_BV(PC0)
#define RS_Off                            PORTC&=~_BV(PC0)
#define RW_On                            PORTC|=_BV(PC1)
#define RW_Off                            PORTC&=~_BV(PC1)
#define Data                                 PORTD
#define DelayL                              _delay_ms(5);
 

 

La directiva #define define una macro que proporciona un mecanismo de reemplazo de código por una secuencia de caracteres, en este caso la sintaxis del #define es:

#define macro_identificador <secuencia-de-tokens>

tomando como referencia uno de las definiciones previamente usadas podemos ver que lo que se está haciendo con:

#define Enable_On  PORTC|=_BV(PC2)

es asignándole a Enable_On la sección de codigo PORTC|=_BV(PC2) la cual activa el bit 2 del registro PORTC.

void PORT_init (void){
DDRC=0x07;
DDRD=0xFF;
PORTC=0x00;
PORTD=0x00;
}

Esta es una función en la que dentro de ella se configuran los registros de los puertos

 

void LCD_init (void){
Data=0x0F;
Enable_On;
DelayL;
Enable_Off;
Data=0x00;
RS_On;
DelayL;
}

Para inicializar la pantalla LCD tenemos que seguir una serie de instrucciones las cuales como se puede apreciar en el código son las siguientes que se encuentran representadas en la tabla.

 

LCD init Pantalla lcd

instrucciones

 

Después de inicializar la pantalla un puntero debe aparecer en la misma, y nos indica que esta lista para recibir los caracteres.

 

void WriteLCD(char text[15]){
RS_On;
for (i=0;i<16; i++){
Data=text[i];
Enable_On;
DelayL;
Enable_Off;
DelayL;
}
i=0;
Data=0x00;
RS_Off;
}

 

Para escribir en el LCD es necesario seguir una serie de instrucciones, las cuales nos llevaran a escribir el texto, que queramos ver en el LCD, carácter por carácter, por lo tanto tenemos que separar nuestro texto en caracteres, esto lo logramos haciendo la función con una entrada de tipo char (carácter), pero en este caso va a ser un vector, esto es una serie de caracteres o de chars, por lo tanto cuando llamemos la función y a la entrada de la misma pongamos algún texto este se guardara en un vector de caracteres, por ejemplo en texto “Hola Mundo”:

 

LCD  Pantalla lcd

instrucciones x caracter

 

 

Para habilitar la entrada de texto, se activa el pin de RS, a continuación el código inicia un ciclo for de 0 a 15, para lograr desplazarnos por las 16 posiciones que tiene la pantalla. Al iniciar el ciclo se le asigna a la variable Data el carácter que está en el vector text en la posición j,  por ejemplo en el primer caso inicia con j=0 en caso de haber escrito el texto “Hola Mundo”, el vector quedaría como en la tabla superior y cómo podemos ver la posición 0 tendría el carácter “H”, después se le da un pulso al Enable un retardo y el ciclo for continua. Al terminar se limpian las variables y el RS se desactiva

 

void ClearLCD(void){
Data=0x01;
Enable_On;
DelayL;
Enable_Off;
}

 

Para limpiar la pantalla, se escribió la función ClearLCD la cual inicializa el puntero de la pantalla y borra todos los caracteres escritos en ella. Para limpiar la pantalla se realizaron las siguientes instrucciones.

 

Pantalla lcd

instrucciones de limpieza

 

 

int main (void){
PORT_init();
LCD_init();

La función main o principal, a la cual al correr el micro es la primera en ejecutar, en este caso llama a las funciones inicializadoras de los puertos y del LCD.

 

while(1){
WriteLCD("Hola mundo");
_delay_ms(1000);
ClearLCD();
_delay_ms(500);
}

Dentro del ciclo while infinito, se llama a la función WriteLCD la cual escribe el texto “Hola Mundo” en el LCD de la manera que se explico previamente, a continuación damos un retardo de 1000 ms y posteriormente se limpia la pantalla llamando a la función ClearLCD a lo que esperamos 500 ms, después de esto el ciclo inicia de nuevo y el texto vuelve a aparecer.

6 Comments

  1. Disculpe como para escribir en la segunda linea del LCD

    • Marcelo sigue el diagrama a flujos que tiene la hoja de datos te sigue explicando cual es la instrucción para pasar a la segunda linea, si no lo vez me dices y te digo exactamente donde.

  2. Hola, amigo he intentado con una de las explicaciones que estan dadas en el datasheets del LCD pero no sigo sin poder escribir en la segunda linea

    • ok depende un poco de la librería, pero lo mas común es si para 0, linea 1
      nota: linea 1 es la segunda linea, ya que se cuenta desde 0.
      lcd.setCursor(0, 0); linea 0
      lcd.setCursor(0, 1); linea 1 etc…

      un tip: imaginemos que imprimimos lcd.setCursor(0, 1); lcd.print(“Time: “);
      y para no tener que re escribir “Time: ” solo ponemos: lcd.setCursor(6, 1); lcd.print(millis()/1000);

  3. Disculpen buenas tardes, cual es la libreria a utilizar en este programa, ya que no logro hacer que funcione correctamente

    • No es con biblioteca o libreria, es realizado con los comandos del controlador, que te aparece?

Post a Reply

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *