Hallo!
Ich habe vor ein Countdown auf einem gLCD auszugeben. Aber das nur
nebenbei.
Zum Problem:
Ich habe ein grafisches Display, auf dem sich die angezeigten Werte
(Zeit: hh:mm:ss) auf immer der gleichen Position ändern.
(z.B. 12:34:22 usw.)
Wenn der Countdown läuft, werden die alten Werte überschreiben, so daß
man
nach Ablauf der Zeit nichts mehr erkennen kann, weil z.B. die 3 eine 1
überschrieben hat. (pixelwirrwarr)
Wie kann ich am effektivsten die zuvor angezeigten Werte löschen (ohne
daß der gesamte LCD gelöscht wird ) ???
Mein Ansatz war ein Rechteck, das im sekundentakt die alte Zeit
verdeckt.
Hat Jemand eine bessere Lösung ????
Gruß
ok.
Das wäre schon mal besser (schneller) als ein Rechteckt.
Danke für den Vorschlag werde ich ausprobieren.
Weiß jemand wie man es auf der professionellen Ebene macht ???
Gruß
Sven B. wrote:
> Das wäre schon mal besser (schneller) als ein Rechteckt.
Das ist nicht unbedingt gesagt, das hängt von der Implementierung der
jeweiligen Funktionen (Textausgabe, Rechteck löschen) ab.
Je nach dem ist die Rechteck-Variante in der Ausführungszeit schneller,
weil weniger aufwendig. Das ist aber reine Spekulation.
Was hast Du denn für ne komische Zeichenausgaberoutine?
Die Routine schreibt einfach immer auf ein ganzes Zeichenfeld, z.B.
12*8.
Also nicht nur die neuen Pixel auf Foreground setzen, sondern auch die
nicht mehr benötigten auf Background setzen.
Peter
Leider nicht Peter.
Die Routine, die ich nutze schreibt leider nur pixelweise die Zeichen
auf dem Display.
Aber Du hast schon recht. Die Methode wäre natürlich die optimalste.
Quasi so wie auf einem alfanummerischen Display...
Diese Routine nutze ich zum Anzeigen der Werte.
CODE:
1
voidlcd_putc(uint8_t*font,uint8_tchr)
2
{
3
uint8_tx,page,bit,data,cnt=0;
4
5
if(font_char_present(font,chr)==1)// print only if letter is present in font
6
{
7
if(((cursor_x+font_char_width(font,chr))<128)&&((cursor_y+font_char_height(font))<=64))// only print leeter if it fits in screen
8
{
9
uint16_toffset=font_start_offset(font,chr);// get the position of the first byte in font-array
10
11
for(page=0;page<=(font_char_height(font)-1)/8;page++)// write all pages(rows)
12
{
13
lcd_write_cmd(LCD_SET_PAGE|((cursor_y/8)+page),CHIP1|CHIP2);// calc the current page
14
15
if(cursor_x<64)// set cursor to its poition (0 on the inactive controller so it can start directly on chip change)
Zu der Sache wegen der Geschwindigkeit beim Rechteck-Löschen ein kleines
Beispiel basierend auf einem T6963C-Controller.
Der Controller unterstützt das Setzen/Löschen einzelner Pixel.
Gleichzeitig kann aber auch ein ganzes Byte geschrieben werden, also
acht Pixel. Hier dürfte klar sein, dass ein Rechteck dann schneller mit
der byteweisen Löscherei schneller ist, als die pixelweise Löscherei
eines vorher gezeichneten Zeichens.
Wenn man dann die Schriftgröße so gewählt hat, dass sie immer in
Byte-Blöcke passt, dürfte es von der Geschwindigkeit her das schnellste
sein.
Es kommt also drauf an, wie man es implementiert. Die byteweise Lösung
hat u.U. den Nachteil, dass man bei aufwendigen GUIs dann Sachen löscht,
die nicht gelöscht werden sollen, es hat also alles Vor- und
Nachteile...
Ralf
Hier mal ein Beispiel aus meiner T6963-Library:
Ein 8*12 Font ist ideal, um byteweise auf das GLCD zu schreiben. Es
werden dann nur 12 Bytes vom Flash in das GLCD geschrieben.
Dabei geht es garnicht anders, als daß das alte Zeichen komplett
gelöscht wird.