Forum: Mikrocontroller und Digitale Elektronik Bild und Text zusammen darstellen


von mons (Gast)


Lesenswert?

Hallo zusammen.
Ich habe jetzt mal folgene glcd lib für ks0108 controller getestet.
Beitrag "GLCD Routinen ( KS0108, HD61202 )"
gleich ganz oben die Datei.

nun ich versuche ich gerade ein bild zusammen mit text darzustellen.
Mein problem ist, das bild zeigt es an, aber der text flakkert. was 
macht man da.?

hier ein kleines beispiel, wie ich es anzeigen möchte:
1
while(1){
2
  if (P_TASTER & (1<<PIN_TASTER1)){
3
    lcd_draw_line(0,LINE1,127,LINE1,BLACK);
4
    lcd_draw_fullscreen_bmp(links);
5
  } 
6
  else if (P_TASTER & (1<<PIN_TASTER2)){
7
    lcd_draw_fullscreen_bmp(rechts);
8
  }
9
  else{
10
    lcd_draw_fullscreen_bmp(normal);
11
  }
12
}
die bilder(links, rechts normal) sind meine eigenen. also die werdet ihr 
in der lib nicht finden. und hier stelle ich kein text dar, sondern nur 
eine linie. aber da tut ja nix zur sache.

kann mir jemand helfen.?
danke im voraus.

Ps: Die antwort, zeichne die linie doch in das bild brauch ich nicht. ;)

von Karl H. (kbuchegg)


Lesenswert?

mons schrieb:

>   if (P_TASTER & (1<<PIN_TASTER1)){
>     lcd_draw_line(0,LINE1,127,LINE1,BLACK);
>     lcd_draw_fullscreen_bmp(links);
>   }


Mal überlegen.
Wenn du, solange der Taster gedrückt ist, dauernd
1
      zuerst die Linie hinmalst
2
      dann das Bild drüber malst
3
4
(nächster Durchgang durch die while Schleife)
5
6
      zuerst die Linie hinmalst
7
      dann das Bild drüber malst
8
9
(nächster Durchgang durch die while Schleife)
10
11
      zuerst die Linie hinmalst
12
      dann das Bild drüber malst
.... dann wundert mich das eigentlich nicht, dass deine Linie da 
flackert wie Sau. Denn: Durch das erneute Hinmalen des Bildes 
überschreibst du ja jedesmal die Linie. Das wird zwar beim nächsten 
Durchgang durch die Schleife wieder behoben, weil ja dann die Linie 
wieder neu hingezeichnet wird. Aber gleich drauf malst du dann eben 
schon wieder das Bild drüber.

Es reicht, wenn du beim Drücken der Taste nur EINMALIG Linie und Bild 
hinmalst. Allerdings in der richtigen Reihenfolge: zuerst das Bild und 
dann erst die Linie. Dazu könntest du dir zb merken, dass das LCD 
bereits Bild und Linie anzeigt und du daher in diesem if nicht nochmal 
hinmalen musst.
(Tastenprellen ignorier ich mal)

von Daniel V. (danvet)


Lesenswert?

Du solltest dein Display nicht mit Daten zubombadieren.
Einmal schreiben reicht.
Wenn du die beiden Zeilen (line, bmp) vertauschst, könnte es eventuell 
auch gehen.

Edit: schon wieder war Karl Heinz zuerst ...

von mons (Gast)


Lesenswert?

Folgendes:

Daniel V. schrieb:
> Du solltest dein Display nicht mit Daten zubombadieren.
> Einmal schreiben reicht.

wenn ich die while schleife entnehme, dann passiert nix. da kann ich den 
taster drücken, aber es kommt nichts.
was ich eigentlich dachte ist, kann man nicht das gesamte bild teilen.?
damit meine ich, mein bild nicht 128x64 pixel darzustellen, sondern 
64x64 oder so.
damit das bild immer da ist, ich aber trotzdem auf der 2. hälfte ohne 
probleme schreiben kann
auf irgendeine art muss es ja funktionieren

von Spess53 (Gast)


Lesenswert?

Hi

>auf irgendeine art muss es ja funktionieren

Schreib dir deine eigenen Routinen, die Bereiche beschreiben können.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Du hörst nicht zu
1
utin8_t lcdShowsNow = 0;
2
3
....
4
5
6
while(1){
7
  if (P_TASTER & (1<<PIN_TASTER1)){
8
    if( lcdShowsNow != 1 ) {
9
      lcd_draw_fullscreen_bmp(links);
10
      lcd_draw_line(0,LINE1,127,LINE1,BLACK);
11
      lcdShowsNow = 1;
12
    }
13
  } 
14
15
  else if (P_TASTER & (1<<PIN_TASTER2)){
16
    if( lcdShowsNow != 2 ) {
17
      lcd_draw_fullscreen_bmp(rechts);
18
      lcdShowsNow = 2;
19
    }
20
  }
21
  else{
22
    if( lcdShowsNow != 3 ) {
23
      lcd_draw_fullscreen_bmp(normal);
24
      lcdShowsNow = 3;
25
    }
26
  }
27
}

EINMAL hinmalen reicht. Dann muss man sich eben in einer Variablen 
merken, was das LCD gerade anzeigt und wenn das beim Knopfdruck das 
falsche ist, dann macht man den Update und merkt sich, dass das LCD 
jetzt das für diesen Knopf richtige anzeigt, so dass beim nächsten 
Durchgang durch die while Schleife dann eben kein Update mehr 
stattfindet, weil ja das LCD eh schon das richtige anzeigt.

von Karl H. (kbuchegg)


Lesenswert?

mons schrieb:

> was ich eigentlich dachte ist, kann man nicht das gesamte bild teilen.?
> damit meine ich, mein bild nicht 128x64 pixel darzustellen, sondern
> 64x64 oder so.

Kann man sicher.
Musst du halt deine eigene Bild-Darstellungsfunktion schreiben, wenn es 
noch keine gibt.

von mons (Gast)


Lesenswert?

ne prima idee, doch es flakkert immer noch

von OMG (Gast)


Lesenswert?

OMG ... der kann wohl nicht lesen ...

von Karl H. (kbuchegg)


Lesenswert?

mons schrieb:
> ne prima idee, doch es flakkert immer noch

Dein Programm?

Zusätzlich noch:
Wie sind deine Taster angeschlossen? (Schaltbild)

von mons (Gast)


Lesenswert?

+
|
|
taster
|
|---10K---GND
µC

von Karl H. (kbuchegg)


Lesenswert?

und dein Programm?

von mons (Gast)


Lesenswert?

while(1){
  uint8_t lcdShowsNow = 0;

Schau mal genau.
Hab ich die Variablendefinition bei meinem Beispiel innerhalb der 
while-Schleife gehabt?

Und du wunderst dich, dass das nicht greift, wenn jedesmal zu beginn der 
while Schleife die Variable neu erzeugt und auf 0 gesetzt wird?

von mons (Gast)


Lesenswert?

oder mein ganzen code

von Karl H. (kbuchegg)


Lesenswert?

mons schrieb:
> while(1){
>   uint8_t lcdShowsNow = 0;
>
> Schau mal genau.
> Hab ich die Variablendefinition bei meinem Beispiel innerhalb der
> while-Schleife gehabt?
>
> Und du wunderst dich, dass das nicht greift, wenn jedesmal zu beginn der
> while Schleife die Variable neu erzeugt und auf 0 gesetzt wird?

Tut mir leid, ich hab aus Versehen den falschen Knopf erwischt und 
deinen Code gelöscht bzw. ersetzt.
Aber das Übel ist noch sichtbar und die Erklärung dazu gültig.

von mons (Gast)


Lesenswert?

oh sch****.
kann ja nicht gehen, es funktioniert jetzt einwandfrei. vielen dank. ich 
denke diese methode wird mir oftmals noch helfen

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
Noch kein Account? Hier anmelden.