MSP-EXP430G2 LaunchPad & CCS: Librería para LCD - Mostrar texto

Saludos!! Avanzando con la programación del MSP430 LauchPad y Code Composer Studio, ahora toca un ejemplo usando un LCD 16x2 (aunque la librería aplica para una LCD 16x4).

El circuito para nuestro ejemplo sera la siguiente, debo aclara que use una fuente de +5V para alimentar la LCD ya que como se sabe la LaunchPad trabaja a +3.3V:


Aquí la librería para la LCD con los archivos "lcd.c" y "lcd.h" como he mencionado antes aun falta mejorarlo mas pero por el momento esta funcional y servirá para usarlo en nuestros proyectos, ya después estaré actualizando la librería, creo que no hace falta dar muchas explicaciones ya que la librería esta comentado para saber que realiza cada funcion:
/*******************************************************************************
*
* Libreria para LCD
*
*******************************************************************************
* FileName: lcd.c
* Processor: MSP430G2231 (Puede ser otro)
* Complier: CCS 6.0.0
* Author: Jose Manuel Alvarado Farias, versión para PIC
* Pedro Sánchez Ramírez (MrChunckuee) versión para MSP430
* Blog: http://mrchunckuee.blogspot.com/
* Email: mrchunckuee.psr@gmail.com
* Description: Libreria para usarse a 4 bits de datos, soporta pantallas de
* 4 lineas, el tiempo de los retardos esta considerado para
* usarse con un oscilador de 1MHz.
*******************************************************************************
* Historial del firmware
* Rev. Date Comment
* v1.00 --/--/---- Creación del firmware para PIC
* v1.01 28/06/2014 Migración del firmware para MSP430
* v1.02 25/09/2015 Corrección de algunas secciones de código para
* trabajar en CSS
*
******************************************************************************/
#include "lcd.h"
/*******************************************************************************
* Function: void LCD_Init(void)
* Description: This function initilizes the LCD
* Precondition: None
* Parameters: None
* Return Values: None
* Remarks: None
* ****************************************************************************/
void LCD_Init(void){
LCD_WriteNibble(0x03);
LCD_Wait(5);
LCD_WriteNibble(0x03);
LCD_WriteNibble(0x03);
LCD_WriteNibble(0x02);
LCD_WriteCommand(0x20);
LCD_WriteCommand(0x28);// set data length 4 bit 2 line
LCD_WriteCommand(0x14);
LCD_WriteCommand(0x0F);
LCD_WriteCommand(0x01);// clear lcd
LCD_WriteCommand(0x06);// cursor shift direction
LCD_WriteCommand(0x06);//
LCD_WriteCommand(LCD_ON);
LCD_Wait(2);
LCD_WriteCommand(LCD_CURSOR_OFF);
//Escribe caracter definido en la CGRAM
LCD_WriteCommand(0x40);
LCD_WriteData(0x08);
LCD_WriteData(0x0C);
LCD_WriteData(0x0E);
LCD_WriteData(0x0F);
LCD_WriteData(0x0E);
LCD_WriteData(0x0C);
LCD_WriteData(0x08);
LCD_WriteData(0x00);
LCD_WriteCommand(LCD_HOME);
}
void LCD_Strobe(void){
P1OUT |= EN;
LCD_Wait(2);
P1OUT &= ~EN;
LCD_Wait(2);
}
void LCD_Wait(volatile unsigned int x){
volatile unsigned int i;
for (x; x>1;x--){
for (i=0;i<=110;i++);
}
}
void LCD_WriteNibble(unsigned char LCD_COMMAND){
P1OUT &= ~RS; //Because sending command
P1OUT &= ~EN;
P1OUT &= 0xF0;
P1OUT |= LCD_COMMAND;
//P1OUT |= ((LCD_COMMAND >> 4) & 0x0F);
LCD_Strobe();
//LCD_Wait(2);
}
/*
* @brief Escribe un comando en el lcd alfanumerico
* @param LCD_COMMAND: comando enviado al display alfanumerico
* @param None
* @retval None
*/
void LCD_WriteCommand(unsigned char LCD_COMMAND){
P1OUT &= ~RS; //Because sending command
P1OUT &= ~EN;
P1OUT &= 0xF0;
P1OUT |= ((LCD_COMMAND >> 4) & 0x0F);
LCD_Strobe();
LCD_Wait(4);
P1OUT &= 0xF0;
P1OUT |= (LCD_COMMAND & 0x0F);
LCD_Strobe();
LCD_Wait(4);
if((LCD_COMMAND==LCD_HOME)||(LCD_COMMAND==LCD_CLEAR_SCREEN))
LCD_Wait(2);
}
/*
* @brief Escribe un dato en el lcd alfanumerico
* @param LCD_DATA: dato enviado al display alfanumerico
* @param None
* @retval None
*/
void LCD_WriteData(unsigned char LCD_DATA){
P1OUT |= RS; //because sending data
P1OUT &= ~EN;
P1OUT &= 0xF0;
P1OUT |= ((LCD_DATA >> 4) & 0x0F);
LCD_Strobe();
P1OUT &= 0xF0;
P1OUT |= (LCD_DATA & 0x0F);
LCD_Strobe();
LCD_Wait(4);
}
/*
* @brief Escribe un comando en el lcd alfanumerico
* @param LCD_DATA: dato enviado al display alfanumerico
* @param LCD_X: columna en la que se desea colocar un caracter en el display
* @param LCD_Y: fila en la que se desea colocar un caracter en el display
* @retval None
*/
void LCD_WriteDataXY(char LCD_DATA, unsigned char LCD_X, unsigned char LCD_Y){
LCD_GotoXY(LCD_X,LCD_Y);
LCD_WriteData(LCD_DATA);
}
/*
* @brief Coloca el cursor en la fila y columna indicada
* @param LCD_X: Columna donde se desea colocar el cursor
* @param LCD_Y: Fila donde se desea colocar el cursor
* @retval None
*/
void LCD_GotoXY(unsigned char LCD_X, unsigned char LCD_Y){
switch(LCD_Y){
case 0:
LCD_WriteCommand(LCD_LINE1+LCD_X);
break;
case 1:
LCD_WriteCommand(LCD_LINE2+LCD_X);
break;
case 2:
LCD_WriteCommand(LCD_LINE3+LCD_X);
break;
case 3:
LCD_WriteCommand(LCD_LINE4+LCD_X);
break;
default:
break;
}
}
/*
* @brief Genera LCD_WIDE espacios en blanco comenzando en la fila LCD_Y
y la columna LCD_X
* @param LCD_X: Columna donde se desea colocar el primer espacio en balnco
* @param LCD_Y: Fila donde se desea colocar el primer espacio en balnco
* @param LCD_WIDE: Cantidad de espacios en blanco que se desea colocar
* @retval None
*/
void LCD_ClearSpace(unsigned char LCD_X, unsigned char LCD_Y,
unsigned char LCD_WIDE){
unsigned char LCD_SPACE_COUNT=0;
unsigned char LCD_WIDE_COUNT=LCD_WIDE;
LCD_SPACE_COUNT=16-LCD_X;
if((LCD_SPACE_COUNT>0)&&(LCD_SPACE_COUNT<4)){
LCD_GotoXY(LCD_X,LCD_Y);
do{
LCD_WriteData(LCD_SPACE_ASCII);
LCD_WIDE_COUNT--;
LCD_SPACE_COUNT--;
}
while(LCD_WIDE_COUNT&&LCD_SPACE_COUNT);
}
LCD_GotoXY(LCD_X,LCD_Y);
}
/*
* @brief Limpia la linea indicada por LCD_Y
* @param LCD_Y: Fila en donde se desea limpiar la linea
* @param None
* @retval None
*/
void LCD_ClearLine(unsigned char LCD_Y){
unsigned char LCD_SPACE_COUNT=16;
switch(LCD_Y){
case 0:
LCD_WriteCommand(LCD_LINE1);
break;
case 1:
LCD_WriteCommand(LCD_LINE2);
break;
case 2:
LCD_WriteCommand(LCD_LINE3);
break;
case 3:
LCD_WriteCommand(LCD_LINE4);
break;
default:
break;
}
do{
LCD_WriteData(LCD_SPACE_ASCII);
LCD_SPACE_COUNT--;
}
while(LCD_SPACE_COUNT);
}
/*
* @brief Coloca una cadena ubicada en RAM en la fila LCD_Y
y la columna LCD_X
* @param *LCD_STRING: Dirección de la cadena en RAM
* @param LCD_X: Columna donde se desea colocar el primer caracter
* @param LCD_Y: Linea donde se colocara la cadena
* @retval None
*/
void LCD_WriteString(char *LCD_STRING, unsigned char LCD_X,
unsigned char LCD_Y){
unsigned char LCD_INDEX=0;
unsigned char LCD_WIDE_COUNT=0;
LCD_WIDE_COUNT=16-LCD_X;
LCD_GotoXY(LCD_X,LCD_Y);
for(LCD_INDEX=0;(*(LCD_STRING+LCD_INDEX)&&LCD_WIDE_COUNT);
LCD_INDEX++,LCD_WIDE_COUNT--)
LCD_WriteData(*(LCD_STRING+LCD_INDEX));
}
/*
* @brief Coloca una cadena ubicada en FLASH en la fila LCD_Y
y la columna LCD_X
* @param *LCD_STRING: Dirección de la cadena en FLASH
* @param LCD_X: Columna donde se desea colocar el primer caracter
* @param LCD_Y: Linea donde se colocara la cadena
* @retval None
*/
void LCD_WriteROMString(const char *LCD_STRING, unsigned char LCD_X,
unsigned char LCD_Y){
unsigned char LCD_INDEX=0;
unsigned char LCD_WIDE_COUNT=0;
LCD_WIDE_COUNT=16-LCD_X;
LCD_GotoXY(LCD_X,LCD_Y);
for(LCD_INDEX=0;(*(LCD_STRING+LCD_INDEX)&&LCD_WIDE_COUNT);
LCD_INDEX++,LCD_WIDE_COUNT--)
LCD_WriteData(*(LCD_STRING+LCD_INDEX));
}
view raw MSP_LCD.c hosted with ❤ by GitHub
/*******************************************************************************
*
* Libreria para LCD
*
*******************************************************************************
* FileName: lcd.h
* Processor: MSP430G2231 (Puede ser otro)
* Complier: CCS 6.0.0
* Author: Jose Manuel Alvarado Farias, versión para PIC
* Pedro Sánchez Ramírez (MrChunckuee) versión para MSP430
* Blog: http://mrchunckuee.blogspot.com/
* Email: mrchunckuee.psr@gmail.com
* Description:
*******************************************************************************/
#ifndef LCD_H_
#define LCD_H_
//Incluimos el microcontrolador utilizado
#include <msp430g2231.h>
/*******************************************************************************
* Perfil de hardware para el LCD
* Pin Nombre MSP430
* 4 R/S P1.4
* 6 EN P1.5
* 11 Data4 P1.0
* 12 Data5 P1.1
* 13 Data6 P1.2
* 13 Data7 P1.3
*
* Cambiar la distribucion de pines implica variar secciones de codigo
*******************************************************************************/
#define RS BIT4
#define EN BIT5
#define LCD_OFF 8
#define LCD_ON 12
#define LCD_CURSOR_ON 14
#define LCD_CURSOR_OFF 12
#define LCD_CURSOR_BLINK 15
#define LCD_CURSOR_NOBLINK 14
#define LCD_CLEAR_SCREEN 1
#define LCD_HOME 2
#define LCD_LINE1 0x80
#define LCD_LINE2 0xC0
#define LCD_LINE3 0X90
#define LCD_LINE4 0xD0
#define LCD_SPACE_ASCII 0X20
void LCD_Init(void);
void LCD_Strobe(void);
void LCD_Wait(volatile unsigned int x);
void LCD_WriteNibble(unsigned char LCD_COMMAND);
void LCD_WriteCommand(unsigned char LCD_COMMAND);
void LCD_WriteData(unsigned char LCD_DATA);
void LCD_WriteDataXY(char LCD_DATA, unsigned char LCD_X, unsigned char LCD_Y);
void LCD_GotoXY(unsigned char LCD_X, unsigned char LCD_Y);
void LCD_ClearSpace(unsigned char LCD_X, unsigned char LCD_Y,
unsigned char LCD_WIDE);
void LCD_ClearLine(unsigned char LCD_Y);
void LCD_WriteString(char *LCD_STRING, unsigned char LCD_X, unsigned char LCD_Y);
void LCD_WriteROMString(const char *LCD_STRING, unsigned char LCD_X,
unsigned char LCD_Y);
#endif /* LCD_H_ */
view raw MSP_LCD.h hosted with ❤ by GitHub
Aquí el ejemplo para mostrar texto con la librería LCD:
/*******************************************************************************
*
* MSP_007: Manejo de LCD 16x2 "Mostrar Textos"
*
*******************************************************************************
* FileName: lcd.c
* Processor: MSP430G2231 (Puede ser otro)
* Complier: CCS 6.0.0
* Author: Pedro Sánchez Ramírez (MrChunckuee)
* Blog: http://mrchunckuee.blogspot.com/
* Email: mrchunckuee.psr@gmail.com
* Description: Considerar la distribucion de pines especificada en lcd.h
* Forma de mostar textos simples en el LCD
*******************************************************************************
* Historial del firmware
* Rev. Date Comment
* v1.00 28/09/2015 Creación del firmware
******************************************************************************/
#include <msp430g2231.h>
#include "lcd.h"
void Delay_Seg(volatile unsigned int t);
void main(void) {
WDTCTL = WDTPW + WDTHOLD;//Stop watchdog timer
BCSCTL1 = CALBC1_1MHZ;// Use 1Mhz cal data for DCO
DCOCTL = CALDCO_1MHZ;// Use 1Mhz cal data for DCO
P1DIR = 0xFF;
P1OUT = 0x00;
LCD_Init();//Se inicializa LCD
while(1){
LCD_WriteCommand(LCD_CLEAR_SCREEN);
LCD_WriteROMString("Hello World!!",1,0);
LCD_WriteROMString("by MrChunckuee!!",0,1);
Delay_Seg(3);
LCD_WriteCommand(LCD_CLEAR_SCREEN);
LCD_WriteROMString("Using LCD 16x2",1,0);
LCD_WriteROMString("Code Composer S.",0,1);
Delay_Seg(3);
LCD_WriteCommand(LCD_CLEAR_SCREEN);
LCD_WriteROMString("Electr. y Robot.",0,0);
LCD_WriteROMString("Likes FB: 5170",1,1);
Delay_Seg(3);
LCD_WriteCommand(LCD_CLEAR_SCREEN);
LCD_WriteROMString("http://mrchuncku",0,0);
LCD_WriteROMString("ee.blogspot.com/",0,1);
Delay_Seg(3);
}
}
/*******************************************************************************
* Function: void Delay_Seg(volatile unsigned int t)
* Description: Realiza retardo en segundos
* Precondition: None
* Parameters: t = Tiempo de espera
* Return Values: None
* Remarks: None
* ****************************************************************************/
void Delay_Seg(volatile unsigned int t){
volatile unsigned int i;
for (i=0 ;i<t; i++){
__delay_cycles(1000000);
}
}
Dejo un par de fotos del circuito en acción:

   


Dejo el vídeo del circuito en acción:


Descargas:
Aquí el enlace para DESCARGAR los archivos disponibles desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquí, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.


Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.


Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.

Publicar un comentario

0 Comentarios