Здравейте,
Мъча да подкарам гореспоменатия дисплей с MSP430G2553, но нещо не ми се получава. Ще се радвам, ако някой си е играл с подобен род диспеи, да помогне. Дисплеят е захранен с 3.3V. Понеже самият дисплей изисква потенциална разлика от около 5V, чрез DC-DC преобразувател подавам -3.3V към пин Vo (Contrast Adjustment). R/W e вързан към GND (т.е. искам само да пиша, няма да чета от паметта на дисплея). Ето как всичко е навързано:
Vss - GND
Vdd - 3.3V
Vo - -3.3V
R/S - P2.0
R/W - GND
E (Enable) - P2.1
DB0 до DB7 на дисплея са вързани към Порт 1 на MSP-то, от P1.0 до P1.7.
Дейташийтът на самия LCD може да се намери тук:
https://store.comet.bg/download-file.php?id=293Вътре е даден initialization sequence, която явно не успявам да изпълня. Когато подам захранване, всички точки от дисплея са запълнени. Интересното е, че частта Function Set явно има ефект, защото ако подам 0x30 (1 line mode), запълва само втората половина от символните блокове, докато първата остава празна. Ако подам 0x38, заплънени са всички. Иначе долният код би трябвало да направи следното - 2 line mode, display on, cursor off, blink off, display clear, increment on, entire shift off във lcd_init();. След което във void write_lcd() опитвам да пратя адрес 00 в DDRAM и да подам на него символ нула (0). Дисплеят обаче не реагира, всички символни блокове остават запълнени. Ето как изглежда:
http://postimg.org/image/5a0b8zy53/#include <msp430g2553.h>
void lcd_init();
void write_lcd();
void delay_us(int count);
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
P1DIR = 0xFF; //Port 1 Outputs
P1OUT = 0x00; //Set PORT0 = 0
P2DIR |= BIT0 + BIT1 + BIT2; //BIT0 = RS; BIT1 = Enable
P2OUT &= ~BIT2;
BCSCTL1 = CALBC1_8MHZ; // Set DCO
DCOCTL = CALDCO_8MHZ;
UCB0CTL1 |= UCSWRST; //Enable SW reset
UCB0CTL1 = UCSSEL_2 + UCSWRST; //Use SMCLK, keep SW reset
UCB0BR0 = 80; //fSCL = SMCLK/12 = ~100kHz
UCB0BR1 = 0;
UCB0CTL1 &= ~UCSWRST; //Clear SW reset, resume operation
lcd_init();
write_lcd();
}
void lcd_init()
{
/*Function Set*/
__delay_cycles(350000); //delay > 40ms
P2OUT &= ~BIT0; //RS = 0 - Instruction set
__delay_cycles(2); // delay 250ns
P1OUT = 0x38; //DB0 - DB7
__delay_cycles(2); // delay 250ns
P2OUT |= BIT1; //Enable = 1
__delay_cycles(5000); //delay > 0.5ms
P2OUT &= ~BIT1; //Enable = 0
__delay_cycles(5000); //delay > 0.5ms
/*Display ON/OFF*/
__delay_cycles(2); // delay 250ns
P1OUT = 0x0C; //DB0 - DB7
__delay_cycles(2); // delay 250ns
P2OUT |= BIT1; //Enable = 1
__delay_cycles(5000); //delay > 0.5ms
P2OUT &= ~BIT1; //Enable = 0
__delay_cycles(5000); //delay > 0.5ms
/*Display Clear*/
__delay_cycles(2); // delay 250ns
P1OUT = 0x01; //DB0 - DB7
__delay_cycles(2); // delay 250ns
P2OUT |= BIT1; //Enable = 1
__delay_cycles(5000); //delay > 0.5ms
P2OUT &= ~BIT1; //Enable = 0
__delay_cycles(20000); //delay > 2ms (0.5 + 1.5ms)
/*Entry Mode Set*/
__delay_cycles(2); // delay 250ns
P1OUT = 0x01; //DB0 - DB7
__delay_cycles(2); // delay 250ns
P2OUT |= BIT1; //Enable = 1
__delay_cycles(5000); //delay > 0.5ms
P2OUT &= ~BIT1; //Enable = 0
__delay_cycles(5000); //delay > 0.5ms
P2OUT |= BIT2;
}
void write_lcd()
{
P2OUT &= ~BIT0; //RS = 0 - Instruction set
__delay_cycles(2); // delay 250ns
P1OUT = 0x80; //Set address DDRAM
__delay_cycles(2); // delay 250ns
P2OUT |= BIT1; //Enable = 1
__delay_cycles(5000); //delay > 0.5ms
P2OUT &= ~BIT1; //Enable = 0
__delay_cycles(5000); //delay > 0.5ms
P2OUT |= BIT0; //RS = 1 - Data set
__delay_cycles(2); // delay 250ns
P1OUT = 0x30; //Write char
__delay_cycles(2); // delay 250ns
P2OUT |= BIT1; //Enable = 1
__delay_cycles(5000); //delay > 0.5ms
P2OUT &= ~BIT1; //Enable = 0
__delay_cycles(5000); //delay > 0.5ms
P2OUT &= ~BIT2;
}