Forum: Mikrocontroller und Digitale Elektronik Einzelne Displayzeilen löschen?


von Mareike F. (mareike)


Lesenswert?

Guten Morgen allerseits!

Könnte mir vielleicht jemand erklären, wie ich eine einzelne Zeile z.B 
Zeile 1 löschen kann, so dass der Inhalt von Zeile 2 trotzdem erhalten 
bleibt. Ich benutze die lcd-routines und da gibt es zwar den Befehl 
lcd_clear, allerdings ist da alles wieder weg.

Eine weiter Frage wäre, wie kann man es realisieren, wenn man haben 
möchte, das der Text nach ca. 5 sek verschwindet und ein neuer Text 
angezeigt wird? Ungefähr wie bei einer Begrüßungsmeldung.

Ich habe dies schon mit dem delay Befehl versucht und danach mit 
lcd_clear, aber nach der abgelaufenen Zeit kam nichts neues mehr aufs 
Display.
1
#define F_CPU 1000000
2
3
4
#include <avr/io.h>
5
#include <stdlib.h>  
6
7
#include "lcd-routines.h"
8
9
10
11
12
int main(void)
13
{
14
  lcd_init();
15
 
16
  
17
lcd_setcursor( 0, 1 );
18
lcd_string( "Hallo" );
19
20
21
lcd_setcursor( 0, 2 );
22
lcd_string( "Guten Tag" );
23
24
lcd_setcursor( 0, 1 );
25
lcd_string( " aaaaaaaaaaaaa    " );
26
27
28
lcd_setcursor( 0, 1 );
29
lcd_string( "Juhu" );
30
31
}

von Pieter (Gast)


Lesenswert?

moin Mareike,

nicht böse sein, soll ich langsam schreiben?

Was ist der Unterschied zwischen schreiben und löschen?
Keiner!

1. Ausgabe:
lcd_setcursor( 0, 2 );
lcd_string( "Guten Tag" );

Zeit warten,
2. Ausgabe:
lcd_setcursor( 0, 2 );
lcd_string( "         " );

ups, und der Text ist wieder weg,


Mit Gruß
Pieter

von Mareike F. (mareike)


Lesenswert?

Danke Pieter, allerdings hatte ich auch schon die selbe Idee. 
Funktioniert hat es aber nicht, da der alte Text mit dem neuen vermischt 
wurde. Drum denke ich, dass es da ja bestimmt eine andere Lösung geben 
sollte

von Pieter (Gast)


Lesenswert?

moin Mareike,

dann solltest Du mal den Display-Typ angeben.
Bei grafischen LCD ist ein überschreiben möglich, dann gibt es aber auch 
Kommandos wie das erfolgt. Stichwort AND/OR Verknüpfung.
Bei Deinem Display wäre das OR.


Mit Gruß
Pieter

von Karl H. (kbuchegg)


Lesenswert?

Mareike F. schrieb:
> Danke Pieter, allerdings hatte ich auch schon die selbe Idee.
> Funktioniert hat es aber nicht, da der alte Text mit dem neuen vermischt
> wurde.

Was heißt vermischt?

Wenn das ein normales Text-LCD ist, dann kann sich da nichts vermischen. 
Pro Anzeigeposition gibt es nur 1 Zeichen, das angezeigt wird. Und jedes 
Zeichen, das du nicht überschreibst, behält so lange seinen Inhalt, BIS 
du es überschreibst

> lcd_setcursor( 0, 1 );
> lcd_string( " aaaaaaaaaaaaa    " );

Das positioniert den Cursor nach links/oben und schreibt aaaaaaaaaaa hin

   +----------------------------------------
   | aaaaaaaaaaaaa
   |

> lcd_setcursor( 0, 1 );
jetzt schickst du den Cursor wieder nach links/oben

> lcd_string( "Juhu" );
und schreibst Juhu hin. Das ist ok. Nur: Es "Juhu" hingeschrieben und 
nur "Juhu". D.h. alles was vorher dort stand wird eben nicht 
überschrieben.

   +----------------------------------------
   |Juhuaaaaaaaaaa
   |

und dann sieht das eben so aus. Hättest du nicht "Juhu", sondern "Juhu " 
hingeschrieben, dann wäre das Ergebnis

   +----------------------------------------
   |Juhu aaaaaaaaa
   |

gewesen, weil dann auch noch ein Leerzeichen hingemalt worden wäre. 
Hättest du "Juhu  " ausgegeben, dann eben

   +----------------------------------------
   |Juhu  aaaaaaaa
   |

usw. Nur weil du etwas in der ersten Zeile ausgibst, wird der Rest der 
Zeile nicht gelöscht. Der bleibt so wie er war. Wenn du die aaaaa 
weghaben willst, dann musst eine entsprechende Anzahl an Leerzeichen 
drübermalen. Da du zb weißt, dass eine Zeile bei deinem LCD 16 
Ausgabepositionen hat, kannst du zb den kompletten Zeileninhalt 
'löschen', indem du eben eine Zeile mit 16 Leerzeichen beginnend am 
Zeilenanfang ausgibst.


Zu deinem Programm:
Gewöhn dir bitte an, dass jedes, aber auch wirklich jedes µC-Programm so 
geschrieben wird, dass main() nie wieder verlassen wird. Wenn du nichts 
Sinnvolles für die Hauptschleife hast, bedeutet das nicht, dass du die 
Hauptschleife einfach weglassen darfst. Dein Programm muss sich IMMER in 
der Hauptschleife fangen. Die Hauptschleife ist dann halt leer, aber 
haben musst du sie.
1
...
2
3
int main()
4
{
5
  ....
6
7
  while( 1 )
8
  {
9
  }
10
}

von Mareike F. (mareike)


Lesenswert?

Ich habe ein analoges Display mit dem KS0066 Controller.

Jetzt hab ich das ganze nochmals getestet und habe bemerkt, dass man 
genauso viele Leerzeichen schreiben muss, wie zuvor beim Text vorhanden 
waren.
Na, damit kann man zwar leben, allerdings dachte ich halt, dass es dafür 
schon nen extra Befehl gibt wie z.B lcd_clear für ausgewählte Zeilen. 
Weißt du Pieter, es ist bestimmt lieb von dir gemeint, wenn du mir den 
Unterschied zwischen schreiben und löschen erklären möchtest, aber für 
mich ist dies hier eher überschreiben, da ich nur Leerzeichen an dieser 
Stelle habe, welche genauso Speicher brauchen, als würde ich aaaa oder 
sonst was schreiben. Drum vermischt sich der Text auch, wenn es nicht 
genügend Leerzeichen sind. Also ich finde dies so etwas aufwendig oder 
meinst du etwa nicht?
Vielen Dank ;-)

von Karl H. (kbuchegg)


Lesenswert?

Mareike F. schrieb:

> genügend Leerzeichen sind. Also ich finde dies so etwas aufwendig oder
> meinst du etwa nicht?

Gewöhn dich daran. Das Leben ist nun mal kein Ponyhof.

Im übrigen macht man sich dafür eine Funktion und gut ists
1
void lcd_clear_line( uint8_t zeile )
2
{
3
  lcd_setcursor( 0, zeile );
4
  lcd_string( "                 " );
5
}

Ab sofort hast du eine neue Funktion zur Verfügung, die eben gezielt 
eine Zeile "löscht".

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

>Na, damit kann man zwar leben, allerdings dachte ich halt, dass es dafür
>schon nen extra Befehl gibt wie z.B lcd_clear für ausgewählte Zeilen.

So eine Funktion kannst du dir selbst leicht schreiben. Verwende soviele 
blanks, wie in einer Zeile des Displays Platz haben.Dann ist diese Zeile 
sicher leer.

Grüsse

von Karl H. (kbuchegg)


Lesenswert?

> aber für  mich ist dies hier eher überschreiben

Du hast gerade etwas ganz Wichtiges erkannt!
Am LCD wird IMMER überschrieben!

Auch wenn du einen lcd_clear machst, passiert nichts anderes, als das 
die komplette LCD-Anzeigefläche mit Leerzeichen überschrieben wird.

> da ich nur Leerzeichen an dieser Stelle habe, welche genauso
> Speicher brauchen

Der Speicher des LCD ist immer da!
Egal was gerade angezeigt wird.
Ja, auch ein Leerzeichen ist ein Zeichen wie jedes andere. Es sorgt halt 
dafür, dass kein Pixel schwarz wird. Aber als Zeichen ist es ein Zeichen 
wie alle andere auch.
Das LCD unterscheidet da nicht. Pro Anzeigestelle gibt es 1 Zeichen 
welches dort angezeigt wird. Das Zeichen wird genommen und damit in 
einer Tabelle nachgesehen, welche Pixel auf schwarz zu setzen sind. Bei 
einem 'A' sind das eben bestimmte Pixel, bei einem 'B' wieder andere und 
bei einem Leerzeichen sind das eben keine.
Punkt. Aus. Mehr passiert da nicht.

von Pieter (Gast)


Lesenswert?

moin Mareike,

>>Unterschied zwischen schreiben und löschen erklären möchtest

Löschen kannst Du nur mit Display-Clear. Sonst kannst Du immer nur was 
an die Stelle schreiben...und zum löschen dann halt " ".

Überlege Dir mal, wie würdest Du effektiv ein Löschbefehl für 
Zeichen/Zeilen definieren? Es wird alles nur aufwändiger.

Selbst "Anzeige blinken" geht nur für alles, nur Cursor kann wegen 
eigenem Positionszähler gesondert blinken.

Mit Gruß
Pieter

von Mareike F. (mareike)


Lesenswert?

Vielen Dank für die ausführliche Erklärung. Nun kann ich mir ja sicher 
sein, wenn zwei das Gleiche schreiben, dass dies dann wohl so gemacht 
werden muss. Ich hatte zwar nach Beispielen gesucht und als ich nichts 
gefunden habe, versuchte ich es auch so zu programmieren. Ich war mir 
einfach nicht sicher, ob dies der richtige Weg ist.....Wie man sieht, 
ist es wohl doch so :-)

Ich werde mir die Anmerkung mit der Hauptschleife zu Herzen nehmen, 
versprochen.

Ich wünsch euch noch einen schönen Tag.......Danke

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.