Tutorial Para Usar LCD HD44780 y Similares (2!11!2011)

Embed Size (px)

DESCRIPTION

Manejo de lcd CCS

Citation preview

Tutorial para usar LCD HD44780 y similares. (Peter Dannegger 2011)Siguiendo un cdigo de ejemplo sencillo, universal y ahorrando cdigo.(http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=102296)

1. Hay diferentes maneras de controlar la pantalla LCD. Usted puede utilizar 8 bits con el modo de pruebas ocupado o 4 bits con el modo de espera ocupada.

Si utiliza el modo espera ocupado, necesitara 50s para transmitir un carcter. Pero nadie es capaz de leer un carcter en 50s.

Por ejemplo un medidor digital slo muestra hasta 5 mediciones por segundo, lo cual es bueno para leer. Asi que una velocidad de actualizacin de 200 ms es tambin un valor ergonmico para nuestra pantalla.Entonces, por ejemplo, para un LCD 2x16 este resulta en una carga para la CPU de:1. 50s * 32 / 200 ms = 0,8%.As que el modo de 4 bits con espera ocupada puede no causar notable carga de la CPU.Pero slo necesita de 6 pines de entrada salida, as que no hay razn para perder 5 pines ms para el uso del modo de 8 bits con el modo de pruebas de ocupado.

As pues, necesitamos los siguientes seis lneas de LCD conectado al AVR:1. DB7, DB6, DB5, DB4, RS y E.El RW-line debe estar conectado a GND. No te olvides de la entrada de contraste conectados de acuerdo a la hoja de datos de su LCD. En algunos LCD que se puede conectar a GND, pero algunos otros pueden necesitar un voltaje negativo en l!.Las lneas DB3 DB2, DB1 y DB0 pueden ser conectadas a GND.

2. El siguiente punto es que el LCD debe usar 6 pines cualquiera sea, aunque no necesariamente en el mismo puerto de 8 bits. Dado que hacen ms fcil al PCB y permitir todava el uso de funciones especiales (UART, I2C, temporizadores, ...) de determinadas pines.

Para ello, necesitamos una manera sencilla de definir los pines a utilizar.Esto se puede hacer fcilmente con la siguiente macro:

struct bits { uint8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;} __attribute__((__packed__));

#define SBIT_(port,pin) ((*(volatile struct bits*)&port).b##pin)#define SBIT(x,y) SBIT_(x,y)

La macro se describe en otro tutorial.http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=67368&start=all

Ahora podemos definir los 6 pines necesarios. Tambin debemos definir los bits direccin correspondiente, ya que una macro no se puede generar una segunda macro en el interior:

#define LCD_D4 SBIT( PORTB, 0 )#define LCD_DDR_D4 SBIT( DDRB, 0 )

#define LCD_D5 SBIT( PORTB, 4 )#define LCD_DDR_D5 SBIT( DDRB, 4 )

#define LCD_D6 SBIT( PORTB, 3 )#define LCD_DDR_D6 SBIT( DDRB, 3 )

#define LCD_D7 SBIT( PORTB, 5 )#define LCD_DDR_D7 SBIT( DDRB, 5 )

#define LCD_RS SBIT( PORTB, 2 )#define LCD_DDR_RS SBIT( DDRB, 2 )

#define LCD_E0 SBIT( PORTB, 1 )#define LCD_DDR_E0 SBIT( DDRB, 1 )

3. Ahora podemos empezar a hacer el cdigo.En busca de la hoja de datos HD44780, se puede ver, que hay que enviar un nibble (4 bits) y un pulso de la lnea E de alta y baja. Este fue el paso bsico en todos los envos y por lo tanto podemos escribir nuestra primera funcin para ello.

Tenemos una entrada de un byte, donde slo el 4 bits superiores son utilizados y establecer las 5 lneas de la pantalla en consecuencia. Luego hacemos un pulso en E durante 1s:

static void lcd_nibble( uint8_t d ){ LCD_D4 = 0; if( d & 1