Moin,
ich versuche gerade ein LCD mit ILI9341 in Betrieb zu nehmen. Es ist ein
320*240 TFT mit 16Bit Datenleitung. Im Testaufbau ist noch ein weiteres
LCD verbaut welches wunderbar funktioniert. Beide Dislays teilen sich
die WRX und DCX Datenleitungen. Pinbelegung am atmega2560:
1 | #define WRX PG2 //LCD und TouchLCD
|
2 | #define DCX PD7 //LCD und TouchLCD
|
3 | #define T_LCD_RD PE3
|
4 | #define T_LCD_CS PH3
|
DDRDs:
1 | DDRG |= (1<<WRX); //WRX
|
2 | DDRD |= (1<<DCX); //DCX
|
3 | DDRH |= (1<<T_LCD_CS);
|
4 | DDRE |= (1<<T_LCD_RD);
|
5 | DDRH |= (1<<T_LCD_RST);
|
writeCmd und writePar:
1 | void writeCmd9341(uint16_t Data){
|
2 | // CS Low, DCX low -> command, WRX from low to high, RDX high
|
3 | PORTH &=~ (1<<T_LCD_CS); //low Level CS
|
4 | PORTE |= (1<<T_LCD_RD);
|
5 | PORTD &=~ (1<<DCX); //low level command
|
6 | PORTG &=~ (1<<WRX);
|
7 | PORTC = (Data & 0xff);
|
8 | PORTA = ((Data >> 8) & 0xff);
|
9 | PORTG |= (1<<WRX);
|
10 | PORTH |= (1<<T_LCD_CS);
|
11 | }
|
12 |
|
13 | void writePar9341(uint16_t Data){
|
14 | //CS low, DCX hig -> register, WRX from low to high, rdx high
|
15 | PORTH &=~ (1<<T_LCD_CS); //low Level CS
|
16 | PORTE |= (1<<T_LCD_RD);
|
17 | PORTD |= (1<<DCX); //high level parameter
|
18 | PORTG &=~ (1<<WRX);
|
19 | PORTC = (Data & 0xff);
|
20 | PORTA = ((Data >> 8) & 0xff);
|
21 | PORTG |= (1<<WRX);
|
22 | PORTH |= (1<<T_LCD_CS);
|
23 | }
|
Init Sequenz aufs kleinste Reduziert:
1 | void init_ili9341(){
|
2 | DDRH |= (1<<T_LCD_CS);
|
3 | DDRE |= (1<<T_LCD_RD);
|
4 | DDRH |= (1<<T_LCD_RST);
|
5 |
|
6 | PORTH |= (1<<T_LCD_RST);
|
7 | _delay_ms(1); // Delay 1ms
|
8 | PORTH &=~(1<<T_LCD_RST);
|
9 | _delay_ms(100); // Delay 10ms // This delay time is necessary
|
10 | PORTH |= (1<<T_LCD_RST);
|
11 | _delay_ms(1000); // Delay 120 ms
|
12 |
|
13 | writeCmd9341(0x01);//soft reset
|
14 | _delay_ms(1000);
|
15 |
|
16 |
|
17 | //pixel format
|
18 | writeCmd9341(0x3A);
|
19 | writePar9341(0x55);
|
20 |
|
21 |
|
22 |
|
23 | //exit sleep
|
24 | writeCmd9341(0x11);
|
25 | _delay_ms(120);
|
26 | //display on
|
27 | writeCmd9341(0x29);
|
28 | }
|
Ausgabetest:
1 | writeCmd9341(0x2c);
|
2 | for(unsigned long i = 0; i < 30000; i++){
|
3 | writePar9341(0x5522);
|
4 | }
|
Erwarten würde ich 30000 farbige Pixel, die Datenleitungen werden auch
mit dem anderen Display geteilt und sind daher auch als Ausgänge
angelegt.
Das ein und ausschalten des Display (0x28; 0x29) scheint zu klappen,
wenn das Display eingeschaltet ist werden mehrere Bilder wechselnd
angezeigt, mal einzelne Streifen, mal halber Bildschirm schwarz mal sehr
Bunt, aber immer Streifen, keine einzelnen Pixel.
Ich hoffe ich hab nur Tomaten auf den Augen und ihr könnt mir
weiterhelfen.
Viele Grüße
Jonas