Vamos a trabajar sobre la placa MSP430 Launchpad y el micro MSP430G2231. La secuencia que veremos por el LCD será la siguiente:
- Veremos el cursor en la primera posición de la pantalla (Primera línea a la izquierda) parpadear durante aproximadamente 3 segundos.
- Después veremos la traducción de la palabra Hola en diferentes idiomas y en diferentes posiciones de la pantalla LCD.
- Y por último, se apreciará la animación de una batería cargándose.
La conexión entre la placa MSP430 Launchpad y la pantalla LCD Hitachi 44780 es cómo se indica a continuación:
Vss | GND | |||
Vdd | +5V | Asegurarse la entrada +5V, de lo contrario podría verse la segunda fila del LCD no nítida. | ||
Vo | GND | |||
RS | P1.0 | |||
R/#W | NA | No emplearemos el BusyFlag por lo que nos ahorramos un pin (se hará todo mediante retardos por software) | ||
E | P1.2 | |||
DB0 | NA | |||
DB1 | NA | |||
DB2 | NA | |||
DB3 | NA | |||
DB4 | P1.3 | |||
DB5 | P1.4 | |||
DB6 | P1.5 | |||
DB7 | P1.7 |
Dónde:
· NA ≡ Sin conexión.
La manera de gestionar el tiempo se hará mediante el TimerA configurado al reloj ACLK (que se le asociará el VLOCLK), el código del programa es el siguiente:
/*----------------------------------------------------------------------
AqueronteBlog@gmail.com
Este archivo es propiedad intelectual del blog Aqueronte,
cuya dirección web, es la siguiente:
http://unbarquero.blogspot.com/
Se permite cualquier modificación del archivo siempre y cuando
se mantenga la autoría del autor.
----------------------------------------------------------------------
Filename: main.c
Date: 9-December-11
File Version: vs0.0
Author: Manuel Caballero
Company: Hades
----------------------------------------------------------------------
Notes: En este programa vamos a mostrar como trabajar con la librería
LCD4bits para manejar pantallas LCD Hitachi 44780 (Módulo
LM016L). Se representarán varios mensajes por pantalla y
finalmente, crearemos carácteres nuevos (el aspecto de una
batería cargándose) para ser representado por pantalla.
· Configuración del Sistema:
· MCLK: DCLOCK ~0.8 MHz
· ACLK: VLOCLK ~12 kHz
· Timer A: Para generar retardos
· Conexión al LCD
· 1. Vss: GND
· 2. Vdd: +5V
· 3. Vo: GND
· 4. RS: P1.0
· 5. R/#W: NA
· 6. E: P1.2
· 7. DB0: NA
· 8. DB1: NA
· 9. DB2: NA
· 10. DB3: NA
· 11. DB4: P1.3
· 12. DB5: P1.4
· 13. DB6: P1.5
· 14. DB7: P1.6
*/
#include "io430.h"
#include "intrinsics.h"
// #define BusyFlag_ON
#define fosc 800000 // 0.8 MHz
#include "LCD4bits.c"
// Dibujo de la batería
unsigned char dibujo1[8] = {0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10};
unsigned char dibujo2[8] = {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F};
unsigned char dibujo3[8] = {0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char dibujo4[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F};
unsigned char dibujo5[8] = {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x18, 0x18};
unsigned char dibujo6[8] = {0x18, 0x18, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10};
// Palabras a representar por pantalla
char *saludos[6] = {"Mambo!", "\n Hello!", " Salut!", "\nHallo!", "\n Priviet!", " Hola!"};
// Prototipos de funciones
void conf_CLK (void);
void conf_TimerA (void);
void main( void )
{
char i = 0;
conf_CLK();
LCD_INI (TWO_Lines_5x7, NoShift_Increment); // Initialize LCD
LCD_Control (DisON_CurON_BliON);
TACCR0 = 36000; // CCIFG on around ~3s
conf_TimerA();
while (TACCTL0_bit.CCIFG == 0);
TACCR0 = 7200; // CCIFG on around ~0.6s
LCD_Control (DisON_CurOFF_BliOFF);
do{
TACCTL0_bit.CCIFG = 0; // Reset flag CCIFG
LCD_printf (saludos[i]);
while (TACCTL0_bit.CCIFG == 0);
i++;
LCD_Control (ClearDisplay);
}while(i < 6);
TACCR0 = 4800; // CCIFG on around ~0.4s
LCD_CGRAM (0, dibujo1); // Writing 6 data...
LCD_CGRAM (8, dibujo2);
LCD_CGRAM (16, dibujo3);
LCD_CGRAM (24, dibujo4);
LCD_CGRAM (32, dibujo5);
LCD_CGRAM (40, dibujo6); // on CGRAM.
do{
// Battery empty
LCD_xy (5,0);
LCD_putc (0x00);
LCD_xy (5,1);
LCD_putc (0x01);
LCD_xy (6,0);
LCD_putc (0x02);
LCD_xy (6,1);
LCD_putc (0x03);
LCD_xy (7,0);
LCD_putc (0x02);
LCD_xy (7,1);
LCD_putc (0x03);
LCD_xy (8,0);
LCD_putc (0x02);
LCD_xy (8,1);
LCD_putc (0x03);
LCD_xy (9,0);
LCD_putc (0x04);
LCD_xy (9,1);
LCD_putc (0x05);
// Filling the battery
for (i = 5; i < 9; i++)
{
TACCTL0_bit.CCIFG = 0;
while (TACCTL0_bit.CCIFG == 0);
for (char j = 0; j < 2; j++)
{
LCD_xy (i,j);
LCD_putc (0xFF);
}
}
TACCTL0_bit.CCIFG = 0;
while (TACCTL0_bit.CCIFG == 0);
}while(1);
}
/*
Function: conf_CLK (void)
Version: vs0.0 (7/12/2011)
Compiler: IAR 5.40.1 [Kickstart]
Description: Configura reloj del sistema (~0.8 MHz) y ACLK (~12 kHz).
Notes:
*/
void conf_CLK (void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
DCOCTL = DCO0 + DCO1; // DCOx = 3
BCSCTL1 = XT2OFF + RSEL1 + RSEL2; // RSELx = 6
BCSCTL3 = LFXT1S1; // ACLK = VLOCLK
}
/*
Function: conf_TimerA (void)
Version: vs0.0 (7/12/2011)
Compiler: IAR 5.40.1 [Kickstart]
Description: Configura TimerA.
Notes:
*/
void conf_TimerA (void)
{
TACTL = TASSEL_1 + MC_1 + TACLR; // ACLK, upmode
TACCTL0_bit.CCIFG = 0; // Reset flag CCIFG
}
Hay que tener en cuenta que la librería para el manejo del display LCD Hitachi 44780 es adaptable a las necesidades del diseñador, podemos definir los pines con los cuales queremos controlar la pantalla.
Un vídeo que demuestra lo explicado anteriormente se presenta a continuación:
Os pongo a vuestra disposición el programa en lenguaje C (IAR y MSPGCC) para que lo podáis descargar y probar:
MSP430: LCD Hitachi 44780 | |||||||||||||||||||
Compilador IAR | Compilador MSPGCC | ||||||||||||||||||
C | C | ||||||||||||||||||
|
|
Como se ha podido ver en el transcurso de esta entrada, el manejo de una pantalla cuyo controlador sea compatible con el Hitachi 44780 (LM016L) es fácil de adaptar y usar para nuestras necesidades mediante los microcontroladores MSP430 que pone a nuestra disposición Texas Instruments.
Lo más interesante de esta librería, es su alta capacidad de ser configurada a gusto del diseñador en lo referente a patitas del microcontrolador para que se pueda adaptar, lo mejor posible, a las necesidades del proyecto.
Hola:
ResponderEliminarBuenísimo, ya va siendo hora que vuelvas al mundo de los PIC y EEPROM.
Has hecho un buen trabajo.