mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Erfahrungen mit diesem TFT ?


Autor: Michael P. (mpl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Morgen!,


hat jemand schon erfahrungen mit diesem LCD gemacht?

Ebay-Artikel Nr. 280575347222


>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/3...

Autor: funky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Michael P. (mpl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

Danke.

Hab den thread auch schon gefunden... jedoch verstehe ich die kommentare 
nicht - kann kein chinesisch :/

Autor: funky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: mpl (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hey,

jap sind 16 datenleitungen.....

hab jetzt erstmal die makros angepasst:

#include <avr/io.h>
#define F_CPU 1600000
#include <util/delay.h>


#define CONTROL_PORT   PORTD
#define LCD_CS     (1 << 7) // PC7
#define LCD_RS     (1 << 6) // PC6
#define LCD_WR    (1 << 5) // PC5
#define LCD_RD    (1 << 4) // PC4
#define LCD_REST  (1 << 3) // PC3

#define LCD_RS_ON  CONTROL_PORT |= LCD_RS;
#define LCD_RS_OFF  CONTROL_PORT &= ~LCD_RS;

#define LCD_REST_ON  CONTROL_PORT |= LCD_REST;
#define LCD_REST_OFF  CONTROL_PORT &= ~LCD_REST;

#define LCD_WR_ON  CONTROL_PORT |= LCD_WR;
#define LCD_WR_OFF  CONTROL_PORT &= ~LCD_WR;

#define LCD_RD_ON  CONTROL_PORT |= LCD_RD;
#define LCD_RD_OFF  CONTROL_PORT &= ~LCD_RD;

#define LCD_CS_ON  CONTROL_PORT |= LCD_CS;
#define LCD_CS_OFF  CONTROL_PORT &= ~LCD_CS;
 
void delayms(int count)  // /* X1ms */
{
        int i,j;
        for(i=0;i<count;i++)
                for(j=0;j<100;j++);
}

void main_Write_COM( int  DH)   //ÃüÁî
{  
    LCD_RS_OFF;
  LCD_CS_OFF;   
  P2=DH>>8;  
  P0=DH;    
  LCD_WR_OFF;
  LCD_WR_ON;
  LCD_CS_ON;  
}

void main_Write_DATA(int DH)  //Êý¾Ý  
{
    LCD_RS_ON;
  LCD_CS_OFF;            
  P2=DH>>8;  
  P0=DH;          
  LCD_WR_OFF;
  LCD_WR_ON;
  LCD_CS_ON;  
}

void main_W_com_data( int com1,dat1)  //ÃüÁîÊý¾ÝÒ»Æð 
{
   main_Write_COM(com1);
   main_Write_DATA(dat1);
}

void address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
  main_W_com_data(0x0002,x1>>8);     // Column address start2
  main_W_com_data(0x0003,x1);     // Column address start1
  main_W_com_data(0x0004,x2>>8);     // Column address end2
  main_W_com_data(0x0005,x2);     // Column address end1
  main_W_com_data(0x0006,y1>>8);     // Row address start2
  main_W_com_data(0x0007,y1);     // Row address start1
      main_W_com_data(0x0008,y2>>8);     // Row address end2
  main_W_com_data(0x0009,y2);     // Row address end1
      main_Write_COM(0x0022);     

}
  
void main_init(void)
{

    LCD_REST_ON;
    delayms(5);  
  LCD_REST_OFF;
  delayms(10);
  LCD_REST_ON;
  delayms(20);

     //  VENDOR   
  main_W_com_data(0x0046,0x00A4);
  main_W_com_data(0x0047,0x0053);
  main_W_com_data(0x0048,0x0000);
  main_W_com_data(0x0049,0x0044);
  main_W_com_data(0x004a,0x0004);
  main_W_com_data(0x004b,0x0067);
  main_W_com_data(0x004c,0x0033);
  main_W_com_data(0x004d,0x0077);
  main_W_com_data(0x004e,0x0012);
  main_W_com_data(0x004f,0x004C);
  main_W_com_data(0x0050,0x0046);
  main_W_com_data(0x0051,0x0044);
    
    //240x320 window setting
    main_W_com_data(0x0002,0x0000); // Column address start2
   main_W_com_data(0x0003,0x0000); // Column address start1
   main_W_com_data(0x0004,0x0000); // Column address end2
   main_W_com_data(0x0005,0x00ef); // Column address end1
    main_W_com_data(0x0006,0x0000); // Row address start2
  main_W_com_data(0x0007,0x0000); // Row address start1
  main_W_com_data(0x0008,0x0001); // Row address end2
  main_W_com_data(0x0009,0x003f); // Row address end1
  
  // Display Setting
  main_W_com_data(0x0001,0x0006); // IDMON=0, INVON=1, NORON=1, PTLON=0
  main_W_com_data(0x0016,0x00C8); // MY=0, MX=0, MV=0, ML=1, BGR=0, TEON=0   0048
  main_W_com_data(0x0023,0x0095); // N_DC=1001 0101
  main_W_com_data(0x0024,0x0095); // PI_DC=1001 0101
  main_W_com_data(0x0025,0x00FF); // I_DC=1111 1111
  
  main_W_com_data(0x0027,0x0002); // N_BP=0000 0010
  main_W_com_data(0x0028,0x0002); // N_FP=0000 0010
  main_W_com_data(0x0029,0x0002); // PI_BP=0000 0010
  main_W_com_data(0x002a,0x0002); // PI_FP=0000 0010
  main_W_com_data(0x002C,0x0002); // I_BP=0000 0010
  main_W_com_data(0x002d,0x0002); // I_FP=0000 0010
  
  main_W_com_data(0x003a,0x0001); // N_RTN=0000, N_NW=001    0001
  main_W_com_data(0x003b,0x0000); // P_RTN=0000, P_NW=001
  main_W_com_data(0x003c,0x00f0); // I_RTN=1111, I_NW=000
  main_W_com_data(0x003d,0x0000); // DIV=00
  delayms(1);
  main_W_com_data(0x0035,0x0038); // EQS=38h
  main_W_com_data(0x0036,0x0078); // EQP=78h
  main_W_com_data(0x003E,0x0038); // SON=38h
  main_W_com_data(0x0040,0x000F); // GDON=0Fh
  main_W_com_data(0x0041,0x00F0); // GDOFF
  
  // Power Supply Setting
  main_W_com_data(0x0019,0x0049); // CADJ=0100, CUADJ=100, OSD_EN=1 ,60Hz
  main_W_com_data(0x0093,0x000F); // RADJ=1111, 100%
  delayms(1);
  main_W_com_data(0x0020,0x0040); // BT=0100
  main_W_com_data(0x001D,0x0007); // VC1=111   0007
  main_W_com_data(0x001E,0x0000); // VC3=000
  main_W_com_data(0x001F,0x0004); // VRH=0011
  
  //VCOM SETTING
  main_W_com_data(0x0044,0x004D); // VCM=101 0000  4D
  main_W_com_data(0x0045,0x000E); // VDV=1 0001   0011
  delayms(1);
  main_W_com_data(0x001C,0x0004); // AP=100
  delayms(2);
  
  main_W_com_data(0x001B,0x0018); // GASENB=0, PON=0, DK=1, XDK=0, VLCD_TRI=0, STB=0
  delayms(1);
  main_W_com_data(0x001B,0x0010); // GASENB=0, PON=1, DK=0, XDK=0, VLCD_TRI=0, STB=0
  delayms(1);
  main_W_com_data(0x0043,0x0080); //set VCOMG=1
  delayms(2);
  
  // Display ON Setting
  main_W_com_data(0x0090,0x007F); // SAP=0111 1111
  main_W_com_data(0x0026,0x0004); //GON=0, DTE=0, D=01
  delayms(1);
  main_W_com_data(0x0026,0x0024); //GON=1, DTE=0, D=01
  main_W_com_data(0x0026,0x002C); //GON=1, DTE=0, D=11
  delayms(1);
  main_W_com_data(0x0026,0x003C); //GON=1, DTE=1, D=11
  
  // INTERNAL REGISTER SETTING
  main_W_com_data(0x0057,0x0002); // TEST_Mode=1: into TEST mode
  main_W_com_data(0x0095,0x0001); // SET DISPLAY CLOCK AND PUMPING CLOCK TO SYNCHRONIZE
  main_W_com_data(0x0057,0x0000); // TEST_Mode=0: exit TEST mode
  //main_W_com_data(0x0021,0x0000);
  main_Write_COM(0x0022);  

}


void Pant(unsigned int color)
{
  int i,j;
  address_set(0,0,239,319);

    for(i=0;i<320;i++)
   {
    for (j=0;j<240;j++)
       {
         main_Write_DATA(color);
      }

    }    
}

main()
{
  main_init();   //tft³õʼ»¯   

  while(1)
  { 
  Pant(0xf800); //ºìÉ«
  delayms(1000);
  Pant(0X07E0); //ÂÌÉ«
  delayms(1000);
  Pant(0x001f); //À¶É«  
  delayms(1000);
    }



}


wie mache ich das jetzt mit denn datenleitungen?

is die verdrahtung so ok? wenn ja wo bzw wie definiere ich jetzt die 
datenleitungen?

Autor: Claudio Hediger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du es inzwischen hinbekommen?

würde mich über deinen neuen code freuen :) Danke

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

würde mich auch interessieren ob du es geschafft hast :)

gruß

Autor: Rico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: W.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.