PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Graphic Display Ansteuerung mittels µC



patch
23.09.2008, 22:08
Frage hat irgend wer ein kleinens c - Programm welches mir nur veranschaulicht wie ein Graphic Display zu programmieren ist ich hab ein Standart Display mit den Standart Treiber TS ...... (weis ich jetzt nicht genau)

Ich hätte ein Programm gesucht welches mir z.B. eine Schräge Linie Zeichnen

Weil ich in Prinzip keine Ahnung von der Komunikationsprotokollen habe

ich hoffe ich könnt mir helfen

mfg
daniel

Jaecko
24.09.2008, 05:18
Naja ohne die genaue Bezeichnung oder weitere Angaben (Auflösung, Farbe oder s/w) wirds schwierig bzw. Unmöglich, da nicht alle GLCDs gleich angesteuert werden.

patch
24.09.2008, 14:30
Ich meine das von Pollin

LCD-Modul TG12864B-03

Blaues, grafisches LC-Display (128x64 Pixel) mit integriertem Controller (kompatibel zu KS0108) und LED-Hintergrundbeleuchtung. Geeignet zum Betrieb am PC-Druckerport (LPT). Download verfügbar.

Technische Daten:
- Auflösung 128x64 Pixel
- weiße LED-Hintergrundbeleuchtung
- Betriebsspannung +5 V-
- Kontrastspannung +9 V-
- Pixelgröße 0,48x0,48 mm
- Anzeigefläche 70,7x38,83 mm
Maße (BxHxT): 93x70x13,6 mm.

Jaecko
24.09.2008, 16:26
Genau dieses Display hab ich zur Zeit auch aufm "OP-Tisch".
Hab dir mal meine bisherigen Codes angefügt; müsstest entsprechend anpassen, damits bei deinem Projekt läuft. Aber geht ja im Grunde nur um die Grundkommunikation mit dem Display.

Was schon geht:
- Display mit einem "Muster" füllen (Muster kann auch leer = blau bzw. voll = weiss gefüllt sein)
- einzelne Pixel setzen/löschen
- Box (gefülltes Rechteck) zeichnen
- Rahmen zeichnen
- Text schreiben (5x7-Font im Source)
- "Überschrift" schreiben (weisser Balken, blaue Schrift)
- Eine Art "Bluescreen" (wie passend bei nem blauen LCD...) für Fehler

Zeichenfunktionen für Kreise, Ellipsen, schiefe Linien etc. kommen bei mir demnächst (sobald ich mein ISP-Kabel wieder find... in der Katze isses schon mal nicht...).
Ne grundlegende Idee dazu hab ich schon.

mfG

patch
24.09.2008, 17:19
Danke schon mal Frage hast du auch eine Vorversion wo nur die Pixelset funktion funktioniert

Ohne Fonts, Rechtecke, ...

Das Programm überfordert mich leicht da ich noch nicht alle befehle darin kenne
währe echt toll

danke

patch
24.09.2008, 17:23
Noch eine kleine Frage kannst du die Ports noch Beschreiben Datenbits(0-7) R/W - Pin ...

Jaecko
24.09.2008, 18:02
Also Zu dem SetPixel ist es so, dass alle anderen Funktionen diese SetPixel verwenden. SetPixel ist also die grundlegenste Funktion.
Wenn ich mich nicht vertan hab, kannst du die folgenden Funktionen rauswerfen:

void GLCD_Box(ui8_t xstart, ui8_t ystart, ui8_t xend, ui8_t yend, ui8_t color);
void GLCD_Frame(ui8_t xstart, ui8_t ystart, ui8_t xend, ui8_t yend, ui8_t color);
void GLCD_PutC(ui8_t x, ui8_t y, ui8_t chr, ui8_t color);
void GLCD_PutS(ui8_t x, ui8_t y, char *chr, ui8_t color);
void GLCD_PutS_Inv(ui8_t x, ui8_t y, char *chr, ui8_t color);
void GLCD_Fill(ui8_t pattern);
void GLCD_Header(char *text);
void GLCD_On(void);
void GLCD_Off(void);
void GLCD_Error(char *descr, char *module, ui16_t value);

Wenn PutS/PutC weg ist, kannst du auch die "static const stc_font5x7 font5x7[] PROGMEM =...." rauswerfen; frisst dann nicht so viel Flash.

Die "static inline void _delay4Cycles(ui16_t __count)" sowie das nachfolgende define delay(us)... kann ebenso raus.

Von den Ports her ist es so, dass ich hier nicht (wie bei anderen Beispielen) nur 2 Ports hab (d.h. 1 Datenport und 1 Command-Port), sondern dass ich die Command-Leitungen auf verschiedene Ports aufgeteilt hab (ging vom Platinendesign her nicht anders). Macht das ganze aber auch flexibler.

In der Header-File setzt du einfach die Pins & Ports:
Hier mal nur die Kürzel #define TG12864B_....

DATA: Datenport, LCD-Pins 7-14; Datenleitungen

EN: Enable, LCD-Pin 6; Bei einem Enable-Puls werden die an den DATA-Leitungen angelegten Signale übernommen (Write) bzw. das Display legt die angeforderten Daten an die Leitungen (Read).

RW: Read/Write, LCD-Pin 5; Low: Daten zum Display senden; High: Daten vom Display auslesen.

DI: Data/Instruction, LCD-Pin 4; Low: Instruction, Steuerbefehle; High: "Bilddaten"

CS1/CS2: Chip Select für Treiber 1/2, LCD-Pin 15-16; welcher der beiden Treiber soll bei Enable die Daten übernehmen? Beim Schreiben von Daten können beide aktiviert sein, wenn beide das Gleiche machen sollen; beim Lesen darf jedoch nur 1 aktiv sein.

RST: Reset LCD-Pin 17; Low-Aktiv, kann auch mit dem Reset des Controllers verbunden werden für gleichzeitigen Reset.


Nachtrag: achja, dass in der SetPixel 2x GLCD_ReadCell ausgeführt wird, ist Absicht. Wenns nur 1x gemacht wird, macht das Display nur Grütze. Da gabs hier schon mal nen Beitrag von mir dazu.

patch
24.09.2008, 18:31
Danke hat mir sehr geholfen
werde mich vielleicht irgend mal noch einmal melden wenn ich darf

lg
daniel

Jaecko
24.09.2008, 18:47
nur zu *g* vielleicht hab ich die Grafikfunktionen dann schon fertig.

patch
24.09.2008, 21:27
Ne 4GB SD Karte drann und wir können das blau/ weiß filme anschauen

*g*

lg

Jaecko
24.09.2008, 21:40
Bei dem Projekt, wo das Display dranhängt, ist auch ein SD-Leser dran.
Bitmaps hab ich so schon mal aufn Display gebracht (da wars aber noch ein 132x132 16-Bit-FarbLCD... Nokia 6100).

Vom Speicherplatz her würde man bei dem TG12864B pro Bild exakt 1kB brauchen; auf ner SD-Karte im Rohzustand genau 2 Sektoren (je einer pro LCD-Treiber). Wenn mans geschickt macht, sollten da schon kleinere Animationen mit "niedriger" Bildrate gehen. Also Sektor von der SD-Karte holen und direkt aufs Display werfen.

patch
24.09.2008, 21:58
Eigentlich sollte das ein kleiner Schertz sein aber ich traue es dir wirklich zu

du hast meinen Volllen respekt
wenst das wirklich einmal Programierst bitte ich um ein Video

lg
daniel

Jaecko
11.10.2008, 19:01
So in der Zwischenzeit hat sich hier wieder was getan; die Funktion für "schräge" Linien ist fertig:



void GLCD_Line(ui8_t xstart, ui8_t ystart, ui8_t xend, ui8_t yend, ui8_t color)
{
ui8_t pixelsX = xend - xstart + 1;
ui8_t pixelsY = yend - ystart + 1;
ui8_t pixelcnt;
ui8_t coord;
double inclination;

if (pixelsX > pixelsY)
{
// width > height
inclination = (double) pixelsY / (double) pixelsX;
for (pixelcnt = xstart ; pixelcnt < xend+1 ; pixelcnt++)
{
coord = ystart + (pixelcnt * inclination);
GLCD_SetPixel(pixelcnt, coord, color);
}
}
else
{
// width <= height
inclination = (double) pixelsX / (double) pixelsY;
for (pixelcnt = ystart ; pixelcnt < yend+1 ; pixelcnt++)
{
coord = xstart + (pixelcnt * inclination);
GLCD_SetPixel(coord, pixelcnt, color);
}
}
}



Zu der Animation: Bin grade dabei, ne kleine Animation zu basteln. Nur die Daten aufzubereiten ist etwas schwieriger als gedacht, da ich aus Effizienzgründen nicht die einzelnen Pixel setzen möchte sondern gleich ganze Pages, also 8 Pixel auf einmal. Muss mir da erst nochn Programm zusammenzimmern.

patch
12.10.2008, 10:45
Ich hab das Programm auch getestet es funktioniert toll
Muss jedoch erst die Hardware Bauen wo ich es verwende

mfg
daniel
PS: Danke für die Nachricht und den Code