Está en la página 1de 10

Manejo de la LCD

Este tutorial fue escrito considerando el microcontrolador ATMEGA48 y el compilador Codevision. La Pantalla es de 16x2, esto significa que es de 16 caracteres por dos lneas. El chip que tiene es compatible con el HD44780 de Hitachi que es el que tienen todas las LCDs alfanumricas, adems la disposicin de terminales es la misma que todas las LCDs con controlador Hitachi HD44780. La disposicin y descripcin de terminales es la siguiente:

Nombre de terminales: Pin Nombre Descripcin 1 Vss Conecte a tierra 2 Vcc Conecte a 5V 3 Vee Es la terminal de ajuste de contraste, conctelo a tierra 4 RS Conctelo al bit del puerto que le indica el codevision 5 R/W (RD) Conctelo al bit del puerto que le indica el codevision 6 E (EN) Conctelo al bit del puerto que le indica el codevision 7 DB0 No conectar 8 DB1 No conectar 9 DB2 No conectar 10 DB3 No conectar 11 DB4 Conctelo al bit del puerto que le indica el codevision 12 DB5 Conctelo al bit del puerto que le indica el codevision 13 DB6 Conctelo al bit del puerto que le indica el codevision 14 DB7 Conctelo al bit del puerto que le indica el codevision Si trabaja con el compilador del codevision no haga caso al punto de importante. Si trabaja en ensamblador u otro compilador tenga en cuenta que: Importante. La nica diferencia con respecto a las pantallas de otras marcas es que la posicin de la DDRAM de la fila superior es 0x84 en lugar de 0x80 y de la fila de abajo es 0xc4 en lugar de 0xc0

En el codevision d clic como se muestra en la siguiente figura, si desea colocar la LCD en otro puerto slo indquele donde quiere conectarlo y el compilador le dir donde conectar los pines y l se encargar de inicializar la LCD.

Es importante sealar que las siguientes funciones que se explicarn slo se pueden usar si se indic en el codevision que va a utilizar una LCD como fue en el paso anterior. lcd_gotoxy(x,y); x y y pueden ser variables tipo unsigned char, o constantes. Esta funcin permite indicarle donde colocar el cursor, que es donde empezar a escribir el mensaje. x es la columna, y es la fila. Casi todas las pantallas inician con x=0 y y=0, pero sta en particular tiene las siguientes coordenadas:
(4,0) (4,1) (5,0) (5,1) (6,0) (6,1) (7,0) (7,1) (8,0) (8,1) (9,0) (9,1) (10,0) (10,1) (11,0) (11,1) (12,0) (12,1) (13,0) (13,1) (14,0) (14,1) (15,0) (15,1) (16,1) (16,2) (17,1) (17,2) (18,1) (18,2) (19,1) (19,2

Note que hay 4 bloques de coordenadas consecutivas, y que en la extrema derecha inicia en (16,1) y en (16,2).

lcd_putsf(mensaje); Con la funcin anterior le indicamos el mensaje a escribir en la LCD y empezar donde ubicamos el cursor con la funcin lcd_gotoxy(x,y); Ejemplo1. Escriba el siguiente mensaje: C O M I P N R I O D Y A E D C A O T S M E L

Note que la parte de TMEL est en otras coordenadas, y que S est en otras coordenadas, as que para desplegar el mensaje debemos hacer lo siguiente: lcd_gotoxy(5,0);

putsf(COMUNIDAD A); lcd_gotoxy(16,1); putsf(TMEL); lcd_gotoxy(8,1); putsf(PROYECTO); lcd_gotoxy(16,2); putsf(S); Y con ello desplegamos el mensaje completo, esto lo tuvimos que hacer porque las coordenadas en x no son consecutivas y por lo tanto hay que cambiar de regin para desplegar el mensaje. Otras funciones tiles: Borrar Pantalla lcd_clear(); // Esta funcin borra el mensaje en el display.

Escribir un carcter o una variable lcd_putchar(A); // Esta funcin escribe en pantalla una sla letra o un carcter Importante al hacer B el compilador convierte el carcter a su equivalente ASCII, pero tambin podemos ver el cdigo ASCII en la siguiente tabla y hacer lcd_putchar(0x40); el cdigo 0x40 corresponde a la A. Note en la tabla de abajo que el cdigo ASCII del 0 al 9 es 0x30+nmero, el 0x30 es del 0 y el del 9 es 0x39, as que si desea imprimir una variable, digamos que valga 27, entonces debemos obtener sus dos digitos (decenas y unidades) y sumarle 0x30 para convertir ese nmero a ASCII. Si desear sacar el smbolo de grados (o un smbolo raro) tendra que ver su cdigo y poner lcd_putchar(0xdf); //El cdigo=0xdf corresponde al de grados

Control de la LCD: Cursor On-Off, Parpadeo On-Off, Stand by de LCD on-Off Aqu se deben usar dos funciones siempre: _lcd_ready(); _lcd_data(dato); Los bits para controlar el cursor y la pantalla son: Dato=00001DCB D=1 Enciende pantalla, D=0 coloca en stand by la pantalla (bajo consumo) C=1 Cursor on, C=0 Cursor Off B=1 Cursor parpadea, B=0 Cursor fijo El bit B slo tiene sentido si el cursor est on. Cuando el bit D=0 apaga la pantalla pareciendo que borra la informacin, pero no la borra, cuando D=1 la enciende de nuevo apareciendo los caracteres escritos. Ejemplo. Suponga que quiere pantalla on, cursor on y parpadeo de cursor on, entonces deber escribir: _lcd_ready(); _lcd_data(0x0f); //Dato=00001DCB con D=1, C=1 y B=1 entonces dato=0x0f; Programa Ejemplo: Configure la LCD para usarla en el puerto B, recuerde que debe seleccionar 16 en el wizard. En este programa us delays para poder ver los efectos del cursor on, apagar cursosr, etc.
#include <mega48.h> #include <delay.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x05 ;PORTB #endasm #include <lcd.h> // Declare your global variables here void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 8 #pragma optsizeCLKPR=0x80; CLKPR=0x03; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00;

// Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x00; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2A output: Disconnected // OC2B output: Disconnected ASSR=0x00; TCCR2A=0x00; TCCR2B=0x00; TCNT2=0x00; OCR2A=0x00; OCR2B=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-14: Off // Interrupt on any change on pins PCINT16-23: Off EICRA=0x00; EIMSK=0x00; PCICR=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=0x00; // Timer/Counter 1 Interrupt(s) initialization TIMSK1=0x00; // Timer/Counter 2 Interrupt(s) initialization TIMSK2=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; ADCSRB=0x00;

// LCD module initialization lcd_init(16); while (1) { lcd_gotoxy(4,0); lcd_putsf("IVONNE"); delay_ms(4000); //Delay de 1 segundo para poder ver el efecto lcd_clear(); delay_ms(4000); //Delay de 1 segundo lcd_gotoxy(4,0); lcd_putsf("DAVID"); delay_ms(4000); //Delay de 1 segundo _lcd_ready(); _lcd_write_data(0x0f); //Display On Cursor On parpadeo On delay_ms(4000); //Delay de 1 segundo _lcd_ready(); _lcd_write_data(0x0e); //Display On Cursor On parpadeo Off delay_ms(4000); //Delay de 1 segundo _lcd_ready(); _lcd_write_data(0x0b); //Display Off Cursor On parpadeo Off delay_ms(4000); //Delay de 1 segundo _lcd_ready(); _lcd_write_data(0x0c); //Display On Cursor Off parpadeo Off // Place your code here for(;;); }; }

Desplazamiento de texto Antes de iniciar con esta parte es importante indicar que las pantallas basadas en el chip HD44780 como es el caso de esta tiene la posibilidad de manejar hasta 80 caracteres. Esto significa que si la pantalla es de 16*2 muestra 32 caracteres a la vez, pero hay 48 caracteres que no se ven, imagine que tiene un papel de dos lineas con 40 caracteres y existe una ventana de 16*2 para poder ver esos caracteres es necesario mover la ventana en este caso la ventana es el display. Existe la posibilidad de mover a la izq. O derecha el puro cursor pero en ese caso no se mover la ventana para ver los caracteres que no alcanza a visualizar la pantalla, entonces lo que se ocupa hacer es mover la ventana a la izq. O derecha. Esta funcin la hacemos con los siguientes bits: Aqu se deben usar dos funciones siempre: _lcd_ready(); _lcd_data(dato); Los bits para controlar el desplazamiento del cursor y la pantalla son: Dato=0001 S/C R/L 00 Y los bits S/C y R/L tienen la siguiente descripcin S/C 0 0 1 1 R/L 0 1 0 1 Descripcin Desplaza el cursor a la izquierda Desplaza el cursor a la derecha Desplaza la pantalla y cursor a la izquierda Desplaza la pantalla y cursor a la derecha

Si queremos mover el mensaje a la derecha entonces S/C=1 y R/L=1 por lo que Dato=00011100 Vea el siguiente programa: Inicialice el display en 16 con el codevision y dgale que se va a conectar al puerto B. Lo que est en azul es el cdigo que deber agregar, programe el microcontrolador, conctelo y vea el desplazamiento del mensaje.
#include <mega48.h> #include <delay.h> unsigned char i; // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x05 ;PORTB #endasm #include <lcd.h> // Declare your global variables here void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 8 #pragma optsizeCLKPR=0x80; CLKPR=0x03; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x00; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off

// Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2A output: Disconnected // OC2B output: Disconnected ASSR=0x00; TCCR2A=0x00; TCCR2B=0x00; TCNT2=0x00; OCR2A=0x00; OCR2B=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-14: Off // Interrupt on any change on pins PCINT16-23: Off EICRA=0x00; EIMSK=0x00; PCICR=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=0x00; // Timer/Counter 1 Interrupt(s) initialization TIMSK1=0x00; // Timer/Counter 2 Interrupt(s) initialization TIMSK2=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; ADCSRB=0x00; // LCD module initialization lcd_init(16); while (1) { // Place your code here _lcd_ready(); _lcd_write_data(0x0e); //Display On Cursor On parpadeo Off delay_ms(1000); lcd_gotoxy(6,0); //En la segunda columna comienza el mensaje lcd_putsf("IVONNE"); for(i=0;i<20;i++) { _lcd_ready(); _lcd_write_data(0x1c); //Desplaza cursor y mensaje a derecha delay_ms(1000); }; // Place your code here }; }

Importante. Slo se muestran algunas funciones para el manejo de la LCD pero es posible otras funciones como generar caracteres, si desea abundar ms en ello puede

bajar la hoja de datos del microcontrolador hd4470 en pdf y ah ver informacin de ello. Importante. Este tutorial est enfocado con la pantalla de www.comunidadatmel.com si maneja otra puede que existan ligeros cambios. El fin de este tutorial es para iniciar a los programadores de los microcontroladores de ATMEL en el manejo de la LCD, si tienen dudas exprsenlas en el foro de la pgina esperando que les ayuden aquellas personas que trabajan con ATMEL. Dudas, preguntas por correo no respondo ninguna (He llegado a recibir ms de 100 en un solo da de distintas partes del mundo), mi objetivo es dar las herramientas necesarias para que partan de ah. Atentamente David Infante Snchez Fundador de www.comunidadatmel.com

También podría gustarte