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