您好!
我目前正在使用 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); } }