Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PRÁCTICAS CON LCD y ATMEGA8 PDF
PRÁCTICAS CON LCD y ATMEGA8 PDF
El pin VEE (o Vo) del LCD establece el contraste de la pantalla. Muchas veces se
prefiere quitar el potencimetro y conectar VEE a tierra para fijar el mximo contraste.
En los siguientes circuitos haremos algo parecido.
/******************************************************************
* FileName: main.c
* Purpose: LCD - Visualizacin de texto
*******************************************************************/
#include "avr_compiler.h"
#include "lcd.h"
int main(void)
{
lcd_init(); // Inicializar LCD
1
MICROCONTROLADORES < VISUALIZACION DE DATOS CARACTERES -GRAFICOS CON LC>
while(1)
{
lcd_gotorc(1,7); // Cursor a fila 1 posicin 7
lcd_puts("Hello"); // Escribir Hello
lcd_gotorc(2,7); // Cursor a fila 2 posicin 7
lcd_puts("World"); // ...
2.- Los LCDs solo entienden de caracteres alfanumricos y algunos otros, pero no
saben reconocer nmeros. En esta prctica veremos cmo hacerlo implementando un
sencillo reloj. No ser el ms preciso, pero servir de buen ejemplo parar formatear
nmeros.
La funcin lcd_puts recibe como parmetro un array de tipo char, que en su forma ms
usada sera una cadena texto.
La conocida funcin sprintf (acrnimo de string print formatted) puede formatear cadenas y
nmeros en diferentes bases y colocarlas en el array que recibe como primer parmetro.
Sprintf est basada en printf, as que tiene las mismas caractersticas y limitaciones. En este
programa solo se convierten nmeros enteros.
Pero si deseas utilizar nmeros de punto flotante tendrs que habilitar el uso de la librera que
contiene printf en versin completa.
Para ms informacin puedes revisar la seccin Configuracin de printf del captulo Atmel
Studio 6 y WinAVR.
2
MICROCONTROLADORES < VISUALIZACION DE DATOS CARACTERES -GRAFICOS CON LC>
Sprintf soporta varios formatos de nmeros e incluso en su modo bsico requiere de cierta
memoria que a veces podra ser de consideracin.
Para ese caso tambin se pueden usar otras funciones de la librera C estndar stdlib.h, como
itoa, por ejemplo. Normalmente no las uso porque tienen variaciones entre los compiladores y al
menos para las prcticas como sta prefiero no tocar esas divergencias.
/**********************************************************
* FileName: main.c
* Purpose: LCD - Visualizacin de nmeros
********************************************************************/
#include "avr_compiler.h"
#include "lcd.h"
int main(void)
{
char buff[17]; // Array de 17 elementos tipo char
unsigned seg, min, hor;
seg = min = 0;
hor = 12;
for(;;)
{
sprintf(buff, "%2d:%02d:%02d ", hor, min, seg); // Formatear
lcd_gotorc(2,5); // Cursor a fila 2 posicin 5
lcd_puts(buff); // Enviar buffer a LCD
3.- Como parte de su funcionalidad, el controlador interno del LCD puede ejecutar
instrucciones para desplazar lo mostrado en la pantalla una posicin hacia la izquierda
o la derecha.
Los cdigos para desplazar la pantalla (ver la seccin referida) son 0x1C y 0x18. Con
eso en el cdigo solo tendramos que escribir
lcd_cmd(0x1C);
Para mover todo el display incluyendo el cursor a la derecha, y
lcd_cmd(0x18);
Para mover el display a la izquierda.
Puede parecer interesante, pero como lo comprobars en la prctica Comunicacin
PC-AVR-LCD, funciona en un rango restringido y no es til cuando solo queremos
desplazar el texto de una sola lnea. Estas limitaciones llevan a muchos a realizar esos efectos
3
MICROCONTROLADORES < VISUALIZACION DE DATOS CARACTERES -GRAFICOS CON LC>
mediante rutinas software, como lo que haremos en esta prctica: Mostrar por el LCD un
mensaje que pasa como una marquesina.
El Cdigo fuente
/********************************************************************
* FileName: main.c
* Purpose: LCD - Textos en desplazamiento
*******************************************************************/
#include "avr_compiler.h"
#include "lcd.h"
PROGMEM const char Taine[] = " \"EL HAMBRE PRODUCE POEMAS INMORTALES.
\LA ABUNDANCIA, SOLAMENTE INDIGESTIONES Y TORPEZAS\" ";
int main(void)
{
unsigned char j; // ndice relativo
unsigned char i; // ndice base
char c;
lcd_init();
while(1)
{
4
MICROCONTROLADORES < VISUALIZACION DE DATOS CARACTERES -GRAFICOS CON LC>
start:
i = 0;
for(;;)
{
lcd_cmd(LCD_LINE2); // Cursor a inicio de lnea 2
El texto de la pantalla se desplaza una posicin cada 400 ms. Si te parece que avanza
muy lento, puedes disminuir esta pausa. No obstante, podras empezar a ver como si
hubiera dos letras por casillero de la pantalla. Ello se debe a que el carcter enviado al
LCD no se muestra ni se borra de inmediato. Es lo que sus datasheets indican como
tiempo de respuesta de visualizacin.
En general, a diferencia del Basic, en C es muy mal visto el uso de un goto, salvo un
caso extremo. goto funciona como en el ensamblador: salta a otro punto del programa,
identificado con una etiqueta. Mi goto salta a la etiqueta start para salir de dos bucles
al mismo tiempo. Dicen que se es uno de los pocos casos considerados extremos:
salir intempestivamente de varios bucles anidados. A decir verdad, siempre hay
algoritmos alternativos para evitar el goto.
5
MICROCONTROLADORES < VISUALIZACION DE DATOS CARACTERES -GRAFICOS CON LC>
La creacin de caracteres grficos puede ser un tema superfluo. Aun as, suponiendo
que no faltarn algunas personas obsesivas como yo, que siempre quieren probarlo
todo, he preparado esta prctica para ir cerrando el captulo.
Ahora bien, si el cdigo enviado vale entre 0x00 y 0x07 (o 0x08 y 0x0F), el chip interno
buscar su patrn de visualizacin en la CGRAM. Siendo sta una RAM de
lectura/escritura, podemos programar en ella los diseos que se nos ocurran.
6
MICROCONTROLADORES < VISUALIZACION DE DATOS CARACTERES -GRAFICOS CON LC>
Por ejemplo, la figura de arriba indica que se han rellenado los dos primeros bloques
con los patrones de dos pacman. Hasta ah solo se han creado dos nuevos caracteres.
Para mostrarlos en el LCD habra que escribir un cdigo as:
El cdigo fuente
/*******************************************************************
* FileName: main.c
* Purpose: LCD - Creacin de caracteres grficos personalizados
********************************************************************/
#include "avr_compiler.h"
#include "lcd.h"
#define LCD_LEN 16 // Para LCD de 216
/* Identificadores de los nuevos caracteres */
#define PacR1 0x00
#define PacR2 0x01
#define PacL1 0x02
#define PacL2 0x03
7
MICROCONTROLADORES < VISUALIZACION DE DATOS CARACTERES -GRAFICOS CON LC>
8
MICROCONTROLADORES < VISUALIZACION DE DATOS CARACTERES -GRAFICOS CON LC>
Todas estas instrucciones estn relacionadas con el cursor, el cual a su vez no es otra
cosa que el puntero RAM trabajando sobre la DDRAM. Yo us la tercera opcin con
sentencia lcd_clear() que aparemtenente no tena sentido porque la pantalla ya est
limpia tras la inicializacin.
Como hemos creado los 4 pacman en los 4 primeros bloques (de 8 bytes) de la
CGRAM, los cdigos para accederlos sern 0 (PacR1), 1 (PacR2), 2 (PacL1) y 3
(PacL2), respectivamente.
Por si no qued claro cmo se forman los patrones de los pacman, aqu tenemos los
dos primeros. (Los bits no importan, pueden ser 1s o 0s.)
Solo debemos tener un poco de paciencia para elaborar los arrays de los patrones.
Ahora que si no la tienes o prefieres un atajo, puedes utilizar una de las tantas
herramientas que abundan (me gusta la flexibilidad de LCD Font Creator). Inclusive los
mismos compiladores como CodeVisionAVR o MikroC proveen los suyos. Abajo se ve
cmo el generador de caracteres de MikroC nos cambia el descifrado de cdigo
binario por simples clics. El cdigo generado incluye una funcin que crea y visualiza
el nuevo carcter, pero a m solo me interesa el array.
9
MICROCONTROLADORES < VISUALIZACION DE DATOS CARACTERES -GRAFICOS CON LC>
10