www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 128x64 GLCD mit U8glib


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Dominic S. (dominic_s78)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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();


Autor: Oliver (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: Dominic S. (dominic_s78)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: Sascha K. (kuschelganxta)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net