Datum:
hallo zusammen, habe nun vor nach start der MCU auf dem display zwei Logos anzuzeigen. Der display hat die bezeichnung hj12864zw vom controllertyp ST7920 Ein Logo klappt ohne probleme, doch wenn ich ein zweites hinterherschicke überlagert sich das. Ich benutze einen arduino. Kann mir jemand sagen wie das mit u8glib funktioniert, so etwas wie clear lcd vermisse ich hier nämlich. Hier der code:
#include "U8glib.h" #include "logos.h" /* inhalt von logos.h: #define logo1_breite 128 #define logo1_hoehe 64 static unsigned char logo1[] U8G_PROGMEM = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; (gekürzt, die ersten zeilen bleiben leer) */ U8GLIB_ST7920_128X64 u8g(8, 9, 255, U8G_PIN_NONE); //E, R-W, 255=VDD, N.C int blPin = 10;//VDD des Backlights an pin 10 int blValue = 255;//Helligkeit von 0-255 void drawLogo1(void) { // graphic commands to redraw the complete screen should be placed here u8g.drawXBMP( 0, 0, logo1_breite, logo1_hoehe, logo1); } void setup(void) { analogWrite(blPin, blValue); } void loop(void) { // picture loop u8g.firstPage(); do { drawLogo1(); } while( u8g.nextPage() ); // rebuild the picture after some delay delay(500); } |
Ich möchte sagen wir mal nach 2 sekunden das logo 2 einblenden befehl wäre in meinem fall für das logo 2 einzeln:
void drawLogo2(void) { // graphic commands to redraw the complete screen should be placed here u8g.drawXBMP( 0, 0, logo2_breite, logo2_hoehe, logo2); } //aufruf mit drawLogo2(); |
Datum:
Hi
Die einfache Lösung wäre diese hier:
void loop(void) {
// picture loop
u8g.firstPage();
do {
drawLogo1();
} while( u8g.nextPage() );
delay(2000);
u8g.firstPage();
do {
drawLogo2();
} while( u8g.nextPage() );
// rebuild the picture after some delay
delay(500);
}
Die etwas komplexere Lösung benutzt einen Zustandsautomaten.
Zustand 1: Logo 1 darstellen.
Zustand 2: Logo 2.
Zustand 3: Etwas anderes machen.
Die draw routine würde dann entsprechend dem aktuellen Zustand die
eigentliche Zeichen-Procedur aufrufen. Etwa so:
void draw(void)
{
switch(state)
{
case 1: drawLogo1(); break;
case 2: drawLogo2(); break;
case 3: /* etwas anderes zeichen */ break;
}
}
Die loop procedure sieht dann so aus:
void loop(void) {
// picture loop
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
// ändere state je nach abgelaufener zeit
change_state();
// rebuild the picture after some delay
delay(500);
}
Die Konstruktion so eines Zustandsautomaten (led_process) habe ich hier
beschrieben:
http://code.google.com/p/m2tklib/wiki/t05
Der Bildschirm wird übrigens gelöscht, sobald man u8g.firstPage()
aufruft.
Deshalb ist auch kein "clear-screen" notwendig. Ich gebe auch gerne zu,
dass das Konzept von u8glib nicht ganz einfach zu versehen ist, aber
dafür werden auch Displays unterstützt bei denen man den Graphikspeicher
nicht zurücklesen kann und das, ohne einen komplettes Abbild des
Graphikspeichers im Controller halten zu müssen.
Fragen auch gerne direkt an mich (siehe sourcecode).
Oliver
Datum:
Danke Oliver, mein problem war in der Tat der U8g Firstpage befehl.. der löscht den inhalt und kommt einem clear lcd gleich. Danke für deine Lösungen. Besonders die zweite ist interessant.. ich denke da zum beispiel an menüs oder der gleichen. Jetzt werden schonmal zwei klar differenzierte Bilder ohne überlagerung angezeigt.Das ist doch das was ich wollte
Datum:
Hi, als kurze Anmerkung zu dem Thema picture loop und Bildschirmaufbau: Ich habe verschiedene "Screens", die ihre eigene draw()-Funktion haben. Dann gibt es eine Funktion Picture_Loop, die im Body einen Function-Pointer auf die aktuelle draw-Funktion aufruft. So kann man den aktuellen Bildschirm individuell festlegen und der Aufbau bleibt übersichtlich. Ebenso kann man unnötige Refreshes - die einen Arduino schon recht lange beanspruchen (digitalWrite...) - mit einer einfachen bool'schen Variable unterdrücken. Bei meinem DG16080 setze ich die Variable z.B. auf true wenn der Touchscreen gedrückt wurde. Beispiel:
bool update_screen = true;
(void *draw)() = &logo1;
void logo1() {
u8g. ...
}
void logo2() {
u8g. ...
}
void Picture_loop() {
if (! update_screen) return;
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
update_screen = false;
}
|
Der Code ist aus dem Kopf also muss er nicht direkt sauber compilen ;-) Grüße Sascha