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.

LCD CODE IS NOT WORKING WITH PORT2 BUT WORKING WITH PORT1

Other Parts Discussed in Thread: MSP430F5529

LCD CODE FOR PORT1

#include <msp430.h>

#define DR P1OUT = P1OUT | BIT4 // define RS high
#define CWR P1OUT = P1OUT & (~BIT4) // define RS low
#define READ P1OUT = P1OUT | BIT5 // define Read signal R/W = 1 for reading
#define WRITE P1OUT = P1OUT & (~BIT5) // define Write signal R/W = 0 for writing
#define ENABLE_HIGH P1OUT = P1OUT | BIT6 // define Enable high signal
#define ENABLE_LOW P1OUT = P1OUT & (~BIT6) // define Enable Low signal
unsigned int i;
unsigned int j;
void delay(unsigned int k)
{
for(j=0;j<=k;j++)
{
for(i=0;i<100;i++);
}
}
void data_write(void)
{
ENABLE_HIGH;
delay(2);
ENABLE_LOW;
}
void data_read(void)
{
ENABLE_LOW;
delay(2);
ENABLE_HIGH;
}
void check_busy(void)
{
P1DIR &= ~(BIT3); // make P1.3 as input
while((P1IN&BIT3)==1)
{
data_read();
}
P1DIR |= BIT3; // make P1.3 as output
}
void send_command(unsigned char cmd)
{
check_busy();
WRITE;
CWR;
P1OUT = (P1OUT & 0xF0)|((cmd>>4) & 0x0F); // send higher nibble
data_write(); // give enable trigger
P1OUT = (P1OUT & 0xF0)|(cmd & 0x0F); // send lower nibble
data_write(); // give enable trigger
}
void send_data(unsigned char data)
{
check_busy();
WRITE;
DR;
P1OUT = (P1OUT & 0xF0)|((data>>4) & 0x0F); // send higher nibble
data_write(); // give enable trigger
P1OUT = (P1OUT & 0xF0)|(data & 0x0F); // send lower nibble
data_write(); // give enable trigger
}
void send_string(char *s)
{
while(*s)
{
send_data(*s);
s++;
}
}
void lcd_init(void)
{
P1DIR |= 0xFF;
P1OUT &= 0x00;
send_command(0x33);
send_command(0x32);
send_command(0x28); // 4 bit mode
send_command(0x0E); // clear the screen
send_command(0x01); // display on cursor on
send_command(0x06); // increment cursor
send_command(0x80); // row 1 column 1
}


void main(void)
{
 WDTCTL = WDTPW + WDTHOLD; // stop watchdog timer
lcd_init();
send_string("1234");
send_command(0xC0);
send_string("5678");
while(1){}
}


LCD CODE FOR PORT 2

#include <msp430.h>

#define DR P2OUT = P2OUT | BIT4 // define RS high
#define CWR P2OUT = P2OUT & (~BIT4) // define RS low
#define READ P2OUT = P2OUT | BIT5 // define Read signal R/W = 1 for reading
#define WRITE P2OUT = P2OUT & (~BIT5) // define Write signal R/W = 0 for writing
#define ENABLE_HIGH P2OUT = P2OUT | BIT6 // define Enable high signal
#define ENABLE_LOW P2OUT = P2OUT & (~BIT6) // define Enable Low signal
unsigned int i;
unsigned int j;
void delay(unsigned int k)
{
for(j=0;j<=k;j++)
{
for(i=0;i<100;i++);
}
}
void data_write(void)
{
ENABLE_HIGH;
delay(2);
ENABLE_LOW;
}
void data_read(void)
{
ENABLE_LOW;
delay(2);
ENABLE_HIGH;
}
void check_busy(void)
{
P2DIR &= ~(BIT3); // make P2.3 as input
while((P2IN&BIT3)==1)
{
data_read();
}
P2DIR |= BIT3; // make P2.3 as output
}
void send_command(unsigned char cmd)
{
check_busy();
WRITE;
CWR;
P2OUT = (P2OUT & 0xF0)|((cmd>>4) & 0x0F); // send higher nibble
data_write(); // give enable trigger
P2OUT = (P2OUT & 0xF0)|(cmd & 0x0F); // send lower nibble
data_write(); // give enable trigger
}
void send_data(unsigned char data)
{
check_busy();
WRITE;
DR;
P2OUT = (P2OUT & 0xF0)|((data>>4) & 0x0F); // send higher nibble
data_write(); // give enable trigger
P2OUT = (P2OUT & 0xF0)|(data & 0x0F); // send lower nibble
data_write(); // give enable trigger
}
void send_string(char *s)
{
while(*s)
{
send_data(*s);
s++;
}
}
void lcd_init(void)
{
P2DIR |= 0xFF;
P2OUT &= 0x00;
send_command(0x33);
send_command(0x32);
send_command(0x28); // 4 bit mode
send_command(0x0E); // clear the screen
send_command(0x01); // display on cursor on
send_command(0x06); // increment cursor
send_command(0x80); // row 1 column 1
}


void main(void)
{
 WDTCTL = WDTPW + WDTHOLD; // stop watchdog timer
lcd_init();
send_string("1234");
send_command(0xC0);
send_string("5678");
while(1){}
}



I tested both codes on my design msp430f5529 board. code with port1 working fine and lcd shows character as written in "send_string()" function.  but when i used port2 for same then desire data not appear on lcd.

i could not solve above problem.

  • This is a shot in the dark. Inside your lcd_init(){...} routine,, try add the statement:
    P2SEL = 0;
  • thank you for your suggestion. i will try it and let you know about result.
  • i made change in my code as per your suggestion but still i faced same problem.
  • i am using port 3 as command port for lcd and port 1 for data port of lcd can some one please help me out .
  • #include <msp430.h>

    #define DR P1OUT = P3OUT | BIT2 // define RS high
    #define CWR P1OUT = P3OUT & (~BIT2) // define RS low
    #define READ P1OUT = P3OUT | BIT3 // define Read signal R/W = 1 for reading
    #define WRITE P1OUT = P3OUT & (~BIT3) // define Write signal R/W = 0 for writing
    #define ENABLE_HIGH P3OUT = P1OUT | BIT4 // define Enable high signal
    #define ENABLE_LOW P3OUT = P1OUT & (~BIT4) // define Enable Low signal
    unsigned int i;
    unsigned int j;
    void delay(unsigned int k)
    {
    for(j=0;j<=k;j++)
    {
    for(i=0;i<100;i++);
    }
    }
    void data_write(void)
    {
    ENABLE_HIGH;
    delay(2);
    ENABLE_LOW;
    }
    void data_read(void)
    {
    ENABLE_LOW;
    delay(2);
    ENABLE_HIGH;
    }
    void check_busy(void)
    {
    P1DIR &= ~(BIT1); // make P1.1 as input
    while((P1IN&BIT1)==1)
    {
    data_read();
    }
    P1DIR |= BIT1; // make P1.1 as output
    }
    void send_command(unsigned char cmd)
    {
    check_busy();
    WRITE;
    CWR;
    P1OUT = (P1OUT & 0xF0)|((cmd>>4) & 0x0F); // send higher nibble
    data_write(); // give enable trigger
    P1OUT = (P1OUT & 0xF0)|(cmd & 0x0F); // send lower nibble
    data_write(); // give enable trigger
    }
    void send_data(unsigned char data)
    {
    check_busy();
    WRITE;
    DR;
    P1OUT = (P1OUT & 0xF0)|((data>>4) & 0x0F); // send higher nibble
    data_write(); // give enable trigger
    P1OUT = (P1OUT & 0xF0)|(data & 0x0F); // send lower nibble
    data_write(); // give enable trigger
    }
    void send_string(char *s)
    {
    while(*s)
    {
    send_data(*s);
    s++;
    }
    }
    void lcd_init(void)
    {
    P1DIR |= 0xFF;
    P1OUT &= 0x00;
    send_command(0x33);
    send_command(0x32);
    send_command(0x28); // 4 bit mode
    send_command(0x0E); // clear the screen
    send_command(0x01); // display on cursor on
    send_command(0x06); // increment cursor
    send_command(0x80); // row 1 column 1
    }


    void main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // stop watchdog timer
    lcd_init();
    send_string("1234");
    send_command(0xC0);
    send_string("5678");
    while(1){}
    }




    i made these changes to your given program will this work fine

**Attention** This is a public forum