String-Anzeige in Dog-Display

Gast #4532842
Hall zusammen,

ich habe ein Problem bei der Darstellung einer Skalenanzeige in einem 
2-zeiligen DOG-Display. Ich würde gerne 16 Zeichen in der zweiten Zeile 
angezeigt haben, in Abhängigkeit eines Sensorwerts (vereinfacht 1-16).
Ich hatte es erst mit einer case-Strutkur versucht:

...
case 1:
Disp_Command(0x80 + 0x40);
sprintf(Buffer,"|               ");
Disp_String(Buffer);
break;
...
case 15:
Disp_Command(0x80 + 0x40);
sprintf(Buffer,"|||||||||||||||  ");
Disp_String(Buffer);

Aber der Speicherbedarf ist hier zu groß.
Bei der Anwendung einer Schleife:

while(j < Skala) {

  Disp_Command(0x80 + 0x40 + j);
  sprintf(Buffer,"|               ");
  Disp_String(Buffer);
        j++;}

werden aber leider die Zeichen in der ersten Zeile wieder gelöscht.
Mache ich es so:

while(j < Skala) {

  Disp_Command(0x80 + 0x40 + j);
  sprintf(Buffer,"|");
  Disp_String(Buffer);
        j++;}

erscheinen in der Zeile nach dem Zeichen | nur komische Zeichen.

Wie würdet ihr hier weiter vorgehen ?

Danke und Grüße,
Michael
#4532857
@ Michael (Gast)

>2-zeiligen DOG-Display. Ich würde gerne 16 Zeichen in der zweiten Zeile
>angezeigt haben, in Abhängigkeit eines Sensorwerts (vereinfacht 1-16).
>Ich hatte es erst mit einer case-Strutkur versucht:

Schon mal was von einer Schleife gehört? Das ist deutlich kompakter und 
weniger Schreibarbeit.

>Wie würdet ihr hier weiter vorgehen ?

Es einfach richtig machen? Cursor EINMALIG auf den ANfang der 2. Zeile 
setzen und dann einzelne ZEICHEN ausgeben, nicht Strings!
Un keine for() Schleifen mit while nachbilden, das ist sinnfrei. Wenn 
man ein abzählbar endliche Schleife machen will, dann mit for().
1
Disp_Command(0x80 + 0x40);  // Cursor auf 2. Zeile, Spalte 1
2
for (; j>0 ; j--) { 
3
  Disp_Data('|');
4
}

Wenn man es schick machen will, definiert man 5 Sonderzeichen mit 1-5 
Strichbreiten, damit bekommt man auf den Text-LCDs eine quasi-graphische 
Balkenanzeige hin.

https://www.mikrocontroller.net/articles/Erweiterte_LCD-Ansteuerung

https://www.mikrocontroller.net/wikifiles/b/b7/LCD_Tutorial.zip
Gast #4532901
Falk B. schrieb:
> Es einfach richtig machen? Cursor EINMALIG auf den ANfang der 2. Zeile
> setzen und dann einzelne ZEICHEN ausgeben, nicht Strings!
> Un keine for() Schleifen mit while nachbilden, das ist sinnfrei. Wenn
> man ein abzählbar endliche Schleife machen will, dann mit for().

Das mit der for-Schleife würde schon funktionieren, das habe ich auch 
erst do ausgetestet:

Disp_Command(0x80 + 0x40);  // Cursor auf 2. Zeile, Spalte 1

for (j=0; j<Skala ; j++) {
  Disp_Char('x');}

Das Problem ist aber, dass die Zeichen nach dem 'x' anscheinend 
undefiniert sind, und irgendwelche komische Zeichen ankommen.
Gast #4532924
Ich müsste von links an der Adresse (0x80 + 0x40) die '|'-Zeichen 
setzen,
und dann, 16 Zeichen rechts daneben (0x80 + 0x40 +16), d.h. von der 
rechten Seite her, ein ' '-Löschzeichen setzen, aber ich komm nicht 
drauf, wie das gehen soll.
#4532934
@  Michael (Gast)

>Ich müsste von links an der Adresse (0x80 + 0x40) die '|'-Zeichen
>setzen,
>und dann, 16 Zeichen rechts daneben (0x80 + 0x40 +16), d.h. von der
>rechten Seite her, ein ' '-Löschzeichen setzen,

Stimmt, hab ich vergessen.

> aber ich komm nicht
>drauf, wie das gehen soll.

Auch mit einer weiteren for Scheife.

1
void draw_bar(uint8_t count) {
2
  uint8_t i;
3

4
  if (count > 16) count = 16;
5

6
  Disp_Command(0x80 + 0x40);  // Cursor auf 2. Zeile, Spalte 1
7
  for (i=0; i<count ; i++) { 
8
    Disp_Data('|'); 
9
  }
10
  for (; i<16 ; i++) { 
11
    Disp_Data(' '); 
12
  }
13
}
#4532937
Hallo,

die Zeichen nach dem 'x' können ja nur die sein, die bereits vor der 
Ausgabe im Display standen, sonst stimmt was anderes nicht...
1
For (j=0; j<16 ; j++)
2
{
3
  If (j < Skala)
4
  {
5
    Disp_Char('x');
6
  }
7
  else
8
  {
9
    Disp_Char(' ');
10
  }
11
}

würde entweder das "x" oder das ' ' in alle 16 Stellen schreiben.

Gruß aus Berlin
Michael
Gast #4532972
Falk B. schrieb:
> Wenn man es schick machen will, definiert man 5 Sonderzeichen mit 1-5
> Strichbreiten, damit bekommt man auf den Text-LCDs eine quasi-graphische
> Balkenanzeige hin.

Ja stimmt, das würde das Erscheinungsbild deutlich verbessern, aber so 
einfach ist die Umsetzung ja auch nicht, da sie fünf einzelnen 
Sonderzeichen 1-5 ja pro Einzelzelle vorkommen und die dann in dieser 
Art: 12345'12345'12345... dargestellt werden müssen, oder ?
#4532997
Hallo,

oft sind es nur 4 Sonderzeichen, der komplette Block ist oft im 
Zeichensatz des Displays. Also die 4 Sonderzeichen auf dem Display 
einrichten.
(Skala/5) ergibt die Anzahl der auszugebenden kompletten Blockzeichen, 
mit For ausgeben.
Den Rest bestimmen (Skala%5), ergibt jetzt 0...4.
Bei 0 -> fertig.
bei 1...4 aus einem Hilfsarray den zugehörigen Zeichencode des 
selbstdefinierten Zeichens holen und ausgeben.
Da bei den Displays ooft die Codes 0x00...0x07 für die selbstdefinierten 
Zeichen genutzt werden, kann man auch gleich den Rest ans Display 
schicken und die Zeichen eben uaf 0x00...0x04 definieren.
1
// Zeichen basteln im Display-Init
2
...
3

4
uint8 count = 0;      // Zeichenzähler
5

6
uint8_t temp = Skala/5;
7
For (j=0; j<temp ; j++)
8
{
9
   Disp_Char(0xFF);        // Displaycode für Block
10
   count++;
11
}
12

13
temp = Skala%5;
14
if (temp > 0)
15
{
16
    Disp_Char(temp);       // Displaycode für selbst definiertes Zeichen
17
    count++;
18
}
19

20
for (i = count; i<16; i++)
21
{
22
   Disp_Char(' ');          // mit Space bis Ende auffüllen
23
}

Müßte vom Ablauf passen, geht sicher kürzer, sollte verständlich 
bleiben.

Gruß aus Berlin
Michael

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.