This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F4784: Interfacing 16x2 LCD

Part Number: MSP430F4784

Hi,

I'm currently working on MSP430F4784. Here I'm interfacing LCD 16x2 for data view purpose.

I'm using 4 data pin communication

RS - P2.0

EN - P2.1

RW - Gnd

D4 - P2.2

D5 - P2.3

D6 - P2.4

D7 - P2.5

Used pot for Vee pin in LCD.

Issue facing here is, data are always garbage but sometimes expected string is displaying.

following is the code 

void send_lcd(char data, int rs)
{
    if(rs)
    {
        P4OUT |= BIT3; //RS high
    }
    else
    {
        P4OUT &= ~BIT3; //RS low
    }

    if(((data>>0)&0x01))
    {
        P2OUT |= BIT5; //D4 hi
    }
    else
    {
        P2OUT &= ~BIT5; //D4 hi
    }

    if(((data>>1)&0x01))
    {
        P4OUT |= BIT7; //D5 hi
    }
    else
    {
        P4OUT &= ~BIT7; //D5 hi
    }
    if(((data>>2)&0x01))
    {
        P4OUT |= BIT2; //D6 hi
    }
    else
    {
        P4OUT &= ~BIT2; //D6 hi
    }

    if(((data>>3)&0x01))
    {
        P3OUT |= BIT5; //D7 hi
    }
    else
    {
        P3OUT &= ~BIT5; //D7 hi
    }


    P3OUT |= BIT4; //EN

    __delay_cycles(4000);

    P3OUT &= ~BIT4; //EN

    __delay_cycles(4000);


}


void lcd_cmd(char cmd)
{
    char datatosend;

    datatosend = ((cmd>>4)&0xF0);
   // __delay_cycles(100000);
    send_lcd(datatosend,0);

    datatosend = ((cmd)&0xF0);
   // __delay_cycles(100000);
    send_lcd(datatosend, 0);
}

void lcd_data(char data)
{
    char datatosend;

    datatosend = ((data>>4)&0xF0);
    __delay_cycles(10000);
    send_lcd(datatosend, 1);

    datatosend = ((data)&0x0F);
    __delay_cycles(10000);
    send_lcd(datatosend, 1);
}

void lcd_put_cur(int row, int col)
{
    switch(row)
    {
    case 0:
        col |= 0x80;
        break;
    case 1:
        col |= 0xC0;
        break;
    }
    lcd_cmd(col);
}

void lcd_clear(void)
{
    lcd_cmd(0x01);
    __delay_cycles(20000);
}


void lcd_init(void)
{

    P4OUT &= ~BIT3; //RS
    P3OUT &= ~BIT4; //EN
    P2OUT &= ~BIT5; //D4
    P4OUT &= ~BIT7; //D5
    P4OUT &= ~BIT2; //D6
    P3OUT &= ~BIT5; //D7
    // 4 bit initialisation

    __delay_cycles(40000); // wait for >40ms
    lcd_cmd(0x30);
    __delay_cycles(50000);  // wait for >4.1ms
    lcd_cmd(0x30);
    __delay_cycles(10000);  // wait for >100us
    lcd_cmd(0x30);
    __delay_cycles(100000);
    lcd_cmd(0x20);  // 4bit mode
    __delay_cycles(100000);

  // dislay initialisation
    lcd_cmd(0x28); // Function set --> DL=0 (4 bit mode), N = 1 (2 line display) F = 0 (5x8 characters)
    __delay_cycles(10000);
    lcd_cmd(0x08); //Display on/off control --> D=0,C=0, B=0  ---> display off
    __delay_cycles(10000);
    lcd_cmd(0x01);  // clear display
    __delay_cycles(10000);
    __delay_cycles(10000);
    lcd_cmd(0x06); //Entry mode set --> I/D = 1 (increment cursor) & S = 0 (no shift)
    __delay_cycles(10000);
    lcd_cmd(0x0C); //Display on/off control --> D = 1, C and B = 0. (Cursor and blink, last two bits)
}

void lcd_send_string(char *str)
{
    while(*str)
        lcd_data(*str++);
}


int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	
	P4DIR |= BIT3; //RS
	P3DIR |= BIT4; //EN

	P2DIR |= BIT5; //D4

    P4DIR |= BIT7; //D5

    P4DIR |= BIT2; //D6

    P3DIR |= BIT5; //D7


    lcd_init();
    lcd_clear();
    lcd_put_cur(1,1);
    
    while(1)
	{
        lcd_send_string("hello");
	    __delay_cycles(1000000);
	}
}

**Attention** This is a public forum