2016-12-21 78 views
1

我無法讓我的msp430與16x4液晶顯示屏進行通信。對於液晶屏數據表:https://www.beta-estore.com/download/rk/RK-10290_410.pdf將MSP430g2553與16x4液晶顯示屏連接

這裏是我的代碼:

#define READMODE P2OUT = (P2OUT | BIT1) //set R/W pin high 
#define WRITEMODE P2OUT=(P2OUT & ~BIT1) //set R/W pin low 
#define ENABLEON P2OUT=P2OUT | 0x04 //set enable pin high 
#define ENABLEOFF P2OUT=P2OUT & 0xFB //set enable pin low 
#define RSDATA P2OUT = (P2OUT | BIT0) //set register select bit high so that the databus is sent to display 
#define RSINSTRUCTION P2OUT = (P2OUT & ~BIT0) //set register select low so databus is sent to command register for initialization 
int main(void){ 
    WDTCTL = WDTPW + WDTHOLD; //stop watchdog timer 
    P1DIR = 0xFF; //The entire P1 register is output 
    P2DIR = 0xF7; //The entire P2 register is output except for p2.3 
    P1OUT = 0x00; 
    P2OUT = 0x01; 
    ENABLEOFF; 
    WRITEMODE; 
    RSINSTRUCTION; 
    sendCommand(0x30); //function set for 8 bit mode and display type 
    sendCommand(0x01); //clear screen 
    sendCommand(0x02); //Return Home 
    sendCommand(0x07); //Increment cursor and screen right 
    sendCommand(0x0B); //Screen display on and blinking cursor 
    sendChar('a'); 
} 

/**This function checks if the LCD is busy 
*/ 
void isBusy(void){ 
    P1DIR &= ~BIT7; //Set bit 7 of P1 register as input 
    READMODE; 
    RSINSTRUCTION; 
    while((P1IN & BIT7) == BIT7){ 
    dataRead(); 
    } 
    P1DIR |= BIT7; //Set bit 7 of P1 register back to output 
    WRITEMODE; 
} 

/**Allows databus to be sent to LCD 
*/ 
void dataWrite(void){ 
    ENABLEOFF; 
    __delay_cycles(1000000); 
    ENABLEON; 
    __delay_cycles(1000000); 
    ENABLEOFF; 
    __delay_cycles(1000000); 
} 

/**This function is only for checking if the LCD is busy. If it is busy 
* it will blink the enable light on and off 
*/ 
void dataRead(void){ 
    ENABLEOFF; 
    __delay_cycles(1000000); 
    ENABLEON; 
    __delay_cycles(1000000); 
    ENABLEOFF; 
    __delay_cycles(1000000); 
} 

/**This function sends a command to the LCD screen 
*/ 
void sendCommand(unsigned char command){ 
    isBusy(); 
    WRITEMODE; 
    RSINSTRUCTION; 
    P1OUT = command; 
    dataWrite(); 
} 

void sendChar(char letter){ 
    RSDATA; 
    WRITEMODE; 
    P1OUT = letter; 
    dataWrite(); 
} 

我敢肯定的我所有的引腳連接正確。液晶顯示器正在投射光線,但就是這樣。我什至不能讓光標顯示並在屏幕上閃爍。我有我的總線連接到8個LED燈,所以我可以確定正在發送正確的命令。這也是爲什麼我在每次寫入操作之間有很長的延遲。不知道要從這裏進行排除故障。任何幫助將不勝感激。

+0

如果你不嘗試發送一個字符,而只是在最後一個sendCommand之後停止,會發生什麼? – HeadCode

+0

什麼都沒有。液晶顯示屏已打開,但沒有閃爍的光標 – user3736114

+0

我決定拖出舊的20x4顯示屏,然後放開。目前我無法得到任何東西顯示。 :-) 我會及時向大家發佈。 – HeadCode

回答

0

對不起。解決這個問題的方法是在電路中增加一個電位器,這樣我就可以改變LCD的對比度。我也不得不行

sendCommand(0x0B); //Screen display on and blinking cursor 

改變

sendCommand(0x0F); //Screen display on and blinking cursor 

謝謝大家的貢獻。