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:连接16x2 LCD

Guru**** 2387890 points
Other Parts Discussed in Thread: MSP430F4784
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1138016/msp430f4784-interfacing-16x2-lcd

器件型号:MSP430F4784

您好!

我目前正在使用 MSP430F4784。 在这里、我将连接 LCD 16x2以进行数据视图。

我正在使用4数据引脚通信

RS - P2.0

EN - P2.1

RW - GND

D4 - P2.2

D5 - P2.3

D6 - P2.4

D7 - P2.5

在 LCD 中为 Vee 引脚使用 POT。

这里面临的问题是、数据总是垃圾、但有时会显示预期的字符串。

以下是代码  

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);
	}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    哪款 LCD 器件? 是串联通信器件吗?

    LCD1602? 如果是、我认为您可以通过 Google 找到更多示例、许多通信失败是由不准确的延迟引起的。

    谢谢!

    此致

    Johnson

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    拼写错误警报:

    >datatosend =((cmd>>>4)&0xF0);

    这里的结果始终为0。 我怀疑您的意思是:

    >datatosend =((cmd>>>4)&0x0F);

    此外:

    >数据结束=((cmd)&0xF0);

    应该是(给定 SEND_LCD()的工作方式):

    >数据结束=((cmd)&0x0F);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    代码也太慢。 时钟不需要那么多时间、并且可以通过比逐位输出更简单的方法来输出数据。

    static void LCDout(unsigned char data, int rs)
    {
      while(LCDbusy())
        ;
      if(rs)
        SET_RS;
      else
        CLEAR_RS;
    
      WRITE;
      P4OUT &= 0x0f;
      P4OUT |= data & 0xf0;
      SET_E;
      WRITE;                  // kills a little time (E min pulse width is 230ns)
      CLEAR_E;
    
      P4OUT &= 0x0f;
      P4OUT |= data << 4;
      SET_E;
      WRITE;                  // kills a little time (E min pulse width is 230ns)
      CLEAR_E;
    }
    
    

    时钟根本不需要任何额外的延迟、具体取决于 MCLK。 我通常提供一个由时钟速度限定的较长延迟的函数。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是正确的延迟精度是这里的问题。

    尝试后发现要给出的延迟。

    并获得我的输出。

    感谢您的回答。