LCD 16x2 + MSP430 TUTORIAL
Autor: Marco Antônio | Publicado: 2014-11-04T07:28:00-08:00

LCD 16x2 + MSP430

Tutorial de inicialização do LCD e escrita
Vídeo tutorial -&gt; https://www.youtube.com/watch?v=P3i4YHqJeM 

*Sempre irei me referir aos pinos do LCD e do MSP, se estiver utilizando um LCD embutido em shield do arduino, a pinagem referente ao arduino pode ser encontrada na tabela "Pin Allocation"

Conexão
PINOS DO LCD
14~11 - Envio e recebimento de dados - Ligar nos pinos 2.7~2.4 do MSP (2.7=xout e 2.6=xin)
E - Enable - Ligar no pino 1.7 do MSP
RS - avisa se será enviado dado ou caractere -  Ligar no pino 1.6 do MSP
R/W - GND 

Esquema de ligação



Pinos do arduino



Pinos do LCD 16x2 (varia de modelo para modelo)



Algoritmo de inicialização do LCD 16x2 HITACHI (pode ser encontrado no datasheet)
*Os LCDs mais comuns são o HITACHI e SAMSUNG e possuem códigos diferentes de inicialização, o programa postado aqui é referente ao HITACHI, se o seu equipamento for outro, busque no datasheet e edite o programa conforme os códigos de inicialização do seu componente.



PROGRAMA
__________________________________________
//IMPLEMENTAR UM DISPLAY LCD 16x2 COM INTERFACE DE 4 BITS

#include "io430.h"

#define RS 0x40;

void pulso(void)
{
&nbsp; P1OUT &amp;= ~0x80;
&nbsp; P1OUT |= 0x80;
&nbsp; __delay_cycles(1000); //espera 1 ms
&nbsp; P1OUT &amp;= ~0x80;

/*
O PULSO QUE EFETIVAMENTE ENVIA O DADO AO LCD
COMO SÃO 4 BITS É REALIZADO UM DESLOCAMENTO DE 4 BITS
SEGUE A ROTINA enviar() APLICADA PARA BYTE=0x28
&nbsp; __delay_cycles(1000); //espera 1 ms
&nbsp; P2OUT = 0x20; //prepara o dado 0x20 para envio ao LCD
&nbsp; pulso(); //envia 0x2 ao LCD
&nbsp; __delay_cycles(1000); //espera 1 ms
&nbsp; P2OUT = 0x80; //prepara o dado 0x08 para envio ao LCD
&nbsp; pulso(); //envia 0x08 ao LCD
*/
}

void enviar(unsigned char byte)
{
&nbsp; __delay_cycles(1000); //espera 1 ms
&nbsp; P2OUT = byte; //envia so os quatro primeiros bits pois tem apenas 4 saidas p2out ligadas
&nbsp; pulso();
&nbsp; __delay_cycles(1000);
&nbsp; P2OUT = byte&lt;<4 4="" a="" bits="" br="" desloca="" direita="" para="">&nbsp; pulso();}void enviar_texto(const char *ptr) {&nbsp; while (*ptr)&nbsp; {&nbsp;&nbsp;&nbsp; enviar(*ptr);&nbsp;&nbsp;&nbsp; ptr++;&nbsp; }}//Setup uCvoid setup_MSP(void){&nbsp; WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset&nbsp; BCSCTL1 = CALBC1_1MHZ;&nbsp; //ajusta o DCO para 1MHz&nbsp; DCOCTL = CALDCO_1MHZ;&nbsp;&nbsp; //ajusta o DCO para 1MHz&nbsp; P1DIR |= 0xC0;&nbsp; //seta output direction para P1.6,7&nbsp; P2DIR |= 0xF0;&nbsp; //seta output direction para P2.4,5,6,7&nbsp; P2SEL = 0x00; //desabilita a segunda função do P2 pois o P2.6 e P2.7 iniciam com PSEL setados &nbsp; P2SEL2 = 0x00;}&nbsp; //INICIALIZAÇÃO DO DISPLAY LCD 16x2void start_LCD(void){&nbsp; __delay_cycles(15000); //espera 15000 ciclos de clock (15ms)&nbsp; P1OUT &amp;= ~RS; //RS=0 -&gt; COMANDOS&nbsp; P2OUT = 0x30; //prepara os dados para enviar 0x30 ao LCD&nbsp; pulso(); //envia os dados para o LCD&nbsp; __delay_cycles(5000); //espera 5 ms&nbsp; pulso(); //envia 000011 0x30&nbsp; __delay_cycles(1000); //espera 1 ms&nbsp; pulso(); //envia 000011b 0x30&nbsp; P2OUT = 0x20;&nbsp; __delay_cycles(1000); //espera 1 ms&nbsp; pulso(); //envia 000010b 0x20 - Function set&nbsp; enviar(0x28); //envia 0x28 - Especificação do numero de linhas do display e tipo de fonte (essas especificações não podem ser mudadas depois desse ponto&nbsp; enviar(0x08); //envia 0x08 - Display off&nbsp; enviar(0x01); //envia 0x01 - Display clear&nbsp; enviar(0x06); //envia 0x06 - Entry mode set&nbsp; enviar(0x0F); //envia 0x0F}&nbsp; void main (void){&nbsp; setup_MSP();&nbsp; start_LCD();&nbsp; P1OUT |= RS; //RS=1 -&gt; DADOS&nbsp; enviar_texto("TEXTO AQUI (LINHA 1");&nbsp; P1OUT &amp;= ~RS; //RS=1 -&gt; COMANDO&nbsp; enviar(0xC0); //Pula para próxima linha&nbsp; P1OUT |= RS; //RS=1 -&gt; DADOS&nbsp; enviar_texto("TEXTO AQUI (LINHA 2)");&nbsp; //Loop infinito&nbsp; //while (1){}}<!--4--><!--4-->