Morgen!, hat jemand schon erfahrungen mit diesem LCD gemacht? http://cgi.ebay.de/3-2-inch-TFT-LCD-module-touch-panel-SD-card-cage-/280575347222?pt=BI_Electrical_Equipment_Tools&hash=item4153980a16 >HX8347-A 240RGBx320 a-Si 262K color TFT controller >ADS7843 compatible touch panel controller >Standard SD card cage >Support 16 bit RGB565 format , can connect any 16 bit data bus >Onboard 3.3V regulator require a single 5V supply >3.3V I/O voltage level tolerance jedoch weiss ich nicht wie ich den C Source auf den Atmega portieren kann... http://www.bestelecs.com/download/lcd_pcb_module/3inch2_tft.zip
wenn du Glück hast, hilft Dir das weiter: http://www.cygnal.org/ubb/Forum1/HTML/003314.html wobei ich gerade sehe, das das dem Code aus deinem geposteten Zip verdächtig ähnlich sieht. Dann musste noch die Pins in den defines an deinen realen Aufbau anpassen.
hi, Danke. Hab den thread auch schon gefunden... jedoch verstehe ich die kommentare nicht - kann kein chinesisch :/
sbit LCD_RS = P6^0; //Êý¾Ý/ÃüÁîÇĐ»» sbit LCD_REST = P6^1; //¸´Î» sbit LCD_WR = P6^2; //Đ´¿ØÖÆ sbit LCD_RD =P6^3; //Á¿ØÖÆ sbit LCD_CS=P6^4; diese Makros musst du ersetzen: ich würde mir für jeden Pin zwei Makros schreiben. Eins setzt das Bit eins löscht es. Und dann ersetzt du alle Anweisungen im Quelltext ala: LCD_WR=1; durch deinen neuen Makros LCD_WR_ENABLE bzw. LCD_WR=0; durch LCD_WR_DISABLE; usw was Du noch beachten musst: Die Datenleitungen. Im Quelltext sieht das für mich nach 16 Datenleitungen aus?! Kann das sein? Hab mir das Display jetzt nicht näher angeschaut P4 = DH; P5 = DH>>8; DH ist dein Datenwort und auf Port 4 wird das LowByte ausgegeben, udn auf Port 5 das HighByte. Da musste Du P4 und P5 auch noch entsprechend Deiner Verdrahtung anpassen
Michael P. schrieb: > kann kein chinesisch Ja wie jetzt ! Eine der meistgesprochenen Sprachen weltweit und Du kannst die nicht ;) Das erste heißt soviel wie "Data/Command Select", die anderen sowas wie "Read / Write Signals" und so weiter. Also nicht wirklich hilfreich
Hey, jap sind 16 datenleitungen..... hab jetzt erstmal die makros angepasst:
1 | #include <avr/io.h> |
2 | #define F_CPU 1600000
|
3 | #include <util/delay.h> |
4 | |
5 | |
6 | #define CONTROL_PORT PORTD
|
7 | #define LCD_CS (1 << 7) // PC7
|
8 | #define LCD_RS (1 << 6) // PC6
|
9 | #define LCD_WR (1 << 5) // PC5
|
10 | #define LCD_RD (1 << 4) // PC4
|
11 | #define LCD_REST (1 << 3) // PC3
|
12 | |
13 | #define LCD_RS_ON CONTROL_PORT |= LCD_RS;
|
14 | #define LCD_RS_OFF CONTROL_PORT &= ~LCD_RS;
|
15 | |
16 | #define LCD_REST_ON CONTROL_PORT |= LCD_REST;
|
17 | #define LCD_REST_OFF CONTROL_PORT &= ~LCD_REST;
|
18 | |
19 | #define LCD_WR_ON CONTROL_PORT |= LCD_WR;
|
20 | #define LCD_WR_OFF CONTROL_PORT &= ~LCD_WR;
|
21 | |
22 | #define LCD_RD_ON CONTROL_PORT |= LCD_RD;
|
23 | #define LCD_RD_OFF CONTROL_PORT &= ~LCD_RD;
|
24 | |
25 | #define LCD_CS_ON CONTROL_PORT |= LCD_CS;
|
26 | #define LCD_CS_OFF CONTROL_PORT &= ~LCD_CS;
|
27 | |
28 | void delayms(int count) // /* X1ms */ |
29 | {
|
30 | int i,j; |
31 | for(i=0;i<count;i++) |
32 | for(j=0;j<100;j++); |
33 | }
|
34 | |
35 | void main_Write_COM( int DH) //ÃüÁî |
36 | {
|
37 | LCD_RS_OFF; |
38 | LCD_CS_OFF; |
39 | P2=DH>>8; |
40 | P0=DH; |
41 | LCD_WR_OFF; |
42 | LCD_WR_ON; |
43 | LCD_CS_ON; |
44 | }
|
45 | |
46 | void main_Write_DATA(int DH) //Êý¾Ý |
47 | {
|
48 | LCD_RS_ON; |
49 | LCD_CS_OFF; |
50 | P2=DH>>8; |
51 | P0=DH; |
52 | LCD_WR_OFF; |
53 | LCD_WR_ON; |
54 | LCD_CS_ON; |
55 | }
|
56 | |
57 | void main_W_com_data( int com1,dat1) //ÃüÁîÊý¾ÝÒ»Æð |
58 | {
|
59 | main_Write_COM(com1); |
60 | main_Write_DATA(dat1); |
61 | }
|
62 | |
63 | void address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2) |
64 | {
|
65 | main_W_com_data(0x0002,x1>>8); // Column address start2 |
66 | main_W_com_data(0x0003,x1); // Column address start1 |
67 | main_W_com_data(0x0004,x2>>8); // Column address end2 |
68 | main_W_com_data(0x0005,x2); // Column address end1 |
69 | main_W_com_data(0x0006,y1>>8); // Row address start2 |
70 | main_W_com_data(0x0007,y1); // Row address start1 |
71 | main_W_com_data(0x0008,y2>>8); // Row address end2 |
72 | main_W_com_data(0x0009,y2); // Row address end1 |
73 | main_Write_COM(0x0022); |
74 | |
75 | }
|
76 | |
77 | void main_init(void) |
78 | {
|
79 | |
80 | LCD_REST_ON; |
81 | delayms(5); |
82 | LCD_REST_OFF; |
83 | delayms(10); |
84 | LCD_REST_ON; |
85 | delayms(20); |
86 | |
87 | // VENDOR
|
88 | main_W_com_data(0x0046,0x00A4); |
89 | main_W_com_data(0x0047,0x0053); |
90 | main_W_com_data(0x0048,0x0000); |
91 | main_W_com_data(0x0049,0x0044); |
92 | main_W_com_data(0x004a,0x0004); |
93 | main_W_com_data(0x004b,0x0067); |
94 | main_W_com_data(0x004c,0x0033); |
95 | main_W_com_data(0x004d,0x0077); |
96 | main_W_com_data(0x004e,0x0012); |
97 | main_W_com_data(0x004f,0x004C); |
98 | main_W_com_data(0x0050,0x0046); |
99 | main_W_com_data(0x0051,0x0044); |
100 | |
101 | //240x320 window setting
|
102 | main_W_com_data(0x0002,0x0000); // Column address start2 |
103 | main_W_com_data(0x0003,0x0000); // Column address start1 |
104 | main_W_com_data(0x0004,0x0000); // Column address end2 |
105 | main_W_com_data(0x0005,0x00ef); // Column address end1 |
106 | main_W_com_data(0x0006,0x0000); // Row address start2 |
107 | main_W_com_data(0x0007,0x0000); // Row address start1 |
108 | main_W_com_data(0x0008,0x0001); // Row address end2 |
109 | main_W_com_data(0x0009,0x003f); // Row address end1 |
110 | |
111 | // Display Setting
|
112 | main_W_com_data(0x0001,0x0006); // IDMON=0, INVON=1, NORON=1, PTLON=0 |
113 | main_W_com_data(0x0016,0x00C8); // MY=0, MX=0, MV=0, ML=1, BGR=0, TEON=0 0048 |
114 | main_W_com_data(0x0023,0x0095); // N_DC=1001 0101 |
115 | main_W_com_data(0x0024,0x0095); // PI_DC=1001 0101 |
116 | main_W_com_data(0x0025,0x00FF); // I_DC=1111 1111 |
117 | |
118 | main_W_com_data(0x0027,0x0002); // N_BP=0000 0010 |
119 | main_W_com_data(0x0028,0x0002); // N_FP=0000 0010 |
120 | main_W_com_data(0x0029,0x0002); // PI_BP=0000 0010 |
121 | main_W_com_data(0x002a,0x0002); // PI_FP=0000 0010 |
122 | main_W_com_data(0x002C,0x0002); // I_BP=0000 0010 |
123 | main_W_com_data(0x002d,0x0002); // I_FP=0000 0010 |
124 | |
125 | main_W_com_data(0x003a,0x0001); // N_RTN=0000, N_NW=001 0001 |
126 | main_W_com_data(0x003b,0x0000); // P_RTN=0000, P_NW=001 |
127 | main_W_com_data(0x003c,0x00f0); // I_RTN=1111, I_NW=000 |
128 | main_W_com_data(0x003d,0x0000); // DIV=00 |
129 | delayms(1); |
130 | main_W_com_data(0x0035,0x0038); // EQS=38h |
131 | main_W_com_data(0x0036,0x0078); // EQP=78h |
132 | main_W_com_data(0x003E,0x0038); // SON=38h |
133 | main_W_com_data(0x0040,0x000F); // GDON=0Fh |
134 | main_W_com_data(0x0041,0x00F0); // GDOFF |
135 | |
136 | // Power Supply Setting
|
137 | main_W_com_data(0x0019,0x0049); // CADJ=0100, CUADJ=100, OSD_EN=1 ,60Hz |
138 | main_W_com_data(0x0093,0x000F); // RADJ=1111, 100% |
139 | delayms(1); |
140 | main_W_com_data(0x0020,0x0040); // BT=0100 |
141 | main_W_com_data(0x001D,0x0007); // VC1=111 0007 |
142 | main_W_com_data(0x001E,0x0000); // VC3=000 |
143 | main_W_com_data(0x001F,0x0004); // VRH=0011 |
144 | |
145 | //VCOM SETTING
|
146 | main_W_com_data(0x0044,0x004D); // VCM=101 0000 4D |
147 | main_W_com_data(0x0045,0x000E); // VDV=1 0001 0011 |
148 | delayms(1); |
149 | main_W_com_data(0x001C,0x0004); // AP=100 |
150 | delayms(2); |
151 | |
152 | main_W_com_data(0x001B,0x0018); // GASENB=0, PON=0, DK=1, XDK=0, VLCD_TRI=0, STB=0 |
153 | delayms(1); |
154 | main_W_com_data(0x001B,0x0010); // GASENB=0, PON=1, DK=0, XDK=0, VLCD_TRI=0, STB=0 |
155 | delayms(1); |
156 | main_W_com_data(0x0043,0x0080); //set VCOMG=1 |
157 | delayms(2); |
158 | |
159 | // Display ON Setting
|
160 | main_W_com_data(0x0090,0x007F); // SAP=0111 1111 |
161 | main_W_com_data(0x0026,0x0004); //GON=0, DTE=0, D=01 |
162 | delayms(1); |
163 | main_W_com_data(0x0026,0x0024); //GON=1, DTE=0, D=01 |
164 | main_W_com_data(0x0026,0x002C); //GON=1, DTE=0, D=11 |
165 | delayms(1); |
166 | main_W_com_data(0x0026,0x003C); //GON=1, DTE=1, D=11 |
167 | |
168 | // INTERNAL REGISTER SETTING
|
169 | main_W_com_data(0x0057,0x0002); // TEST_Mode=1: into TEST mode |
170 | main_W_com_data(0x0095,0x0001); // SET DISPLAY CLOCK AND PUMPING CLOCK TO SYNCHRONIZE |
171 | main_W_com_data(0x0057,0x0000); // TEST_Mode=0: exit TEST mode |
172 | //main_W_com_data(0x0021,0x0000);
|
173 | main_Write_COM(0x0022); |
174 | |
175 | }
|
176 | |
177 | |
178 | void Pant(unsigned int color) |
179 | {
|
180 | int i,j; |
181 | address_set(0,0,239,319); |
182 | |
183 | for(i=0;i<320;i++) |
184 | {
|
185 | for (j=0;j<240;j++) |
186 | {
|
187 | main_Write_DATA(color); |
188 | }
|
189 | |
190 | }
|
191 | }
|
192 | |
193 | main() |
194 | {
|
195 | main_init(); //tft³õʼ»¯ |
196 | |
197 | while(1) |
198 | {
|
199 | Pant(0xf800); //ºìÉ« |
200 | delayms(1000); |
201 | Pant(0X07E0); //ÂÌÉ« |
202 | delayms(1000); |
203 | Pant(0x001f); //À¶É« |
204 | delayms(1000); |
205 | }
|
206 | |
207 | |
208 | |
209 | }
|
wie mache ich das jetzt mit denn datenleitungen? is die verdrahtung so ok? wenn ja wo bzw wie definiere ich jetzt die datenleitungen?
Hast du es inzwischen hinbekommen? würde mich über deinen neuen code freuen :) Danke
hallo, würde mich auch interessieren ob du es geschafft hast :) gruß
hab das selbe TFT, habe dieses mit vorhandenen testcode getestet für C51, geht super! schöne Farben für den Preis :D habe auch schon den code für AVR umgesetzt, aber nicht mit Makros sondern direkt mit Portansprechen, jedoch werde ich wohle deine Makros einbauen, die gefallen mir ganz gut :D Falls interesse besteht, wäre daran interessiert eine Lib dafür zu schreiben für das board, da noch kaum eine tft lib vorhanden ist für avr in dem Forum!
Oh Gott, mir wird schlecht beim Lesen. Was wollt ihr Unglücksraben denn mit SO EINEM Display an einem SO kleinen Atmega anstellen? Im Schneckentempo Klötzchen malen? Es ist ja ganz nett, daß dieses Display einen eigenen Controller hat, aber es bleibt immer noch die Aufgabe, das Display mit Pixeln zu füllen. Überdenkt das Ganze lieber noch einmal. Mein Vorschlag - zu dem ich dringendst rate - wäre, einen ARM oder Cortex zu nehmen, und zwar so einen, der einen vollwertigen Systembus herausgeführt hat, also z.B. LPC2214 von NXP oder ein passender STM32 und dazu ein halbes Megabyte RAM als 256K x 16. Den RAM werdet ihr dringend benötigen. Das ist so ungefähr die Controller-Klasse, mit der man auf so einem Display was Richtiges anstellen kann. Den RAM braucht man, um dort das Bild aufzubauen, incl. Z-Ordnung usw. und dann braucht man eine direkte Anbindung des Displays im Adreßraum, damit man es mit einem einzigen Schreibbefehl für's BitBlt bedienen kann, also RS an Adreßbit 1 oder 2 (jedenfalls nicht 0). Mit etwas Glück kann man bei den STM's vielleicht das BitBlt per DMA erledigen. W.S.
es ist mir schon klar das das Display besser für schnellere MCU gedacht ist. aber wenn es so wie in meinem Fall verwendet wird reicht ein atmega ;)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.