String-Anzeige in Dog-Display

Gast #4532842
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
@ 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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
@  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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren