Forum: Mikrocontroller und Digitale Elektronik String-Anzeige in Dog-Display


von Michael (Gast)


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

von Falk B. (falk)


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

von Michael (Gast)


Lesenswert?

Danke für die rasche Antwort, aber wie habe ich durch die for-Schleife
eine Begrenzung auf 16 Zeichen ?

Falk B. schrieb:
> Disp_Command(0x80 + 0x40);  // Cursor auf 2. Zeile, Spalte 1
> for (; j>0 ; j--) {
>   Disp_Data('|');
> }

von Ceeh (Gast)


Lesenswert?

Michael schrieb:
> Danke für die rasche Antwort, aber wie habe ich durch die for-Schleife
> eine Begrenzung auf 16 Zeichen ?
>
> Falk B. schrieb:
>> Disp_Command(0x80 + 0x40);  // Cursor auf 2. Zeile, Spalte 1
>> for (; j>0 ; j--) {
>>   Disp_Data('|');
>> }

@Falk, Michael

https://de.wikipedia.org/wiki/For-Schleife

von Michael (Gast)


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.

von Michael (Gast)


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.

von Falk B. (falk)


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
}

von Michael U. (amiga)


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

von Michael (Gast)


Lesenswert?

Super, funktioniert! Vielen Dank!

von Michael (Gast)


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 ?

von Michael U. (amiga)


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

von Falk B. (falk)


Lesenswert?

@ Michael (Gast)

>Ja stimmt, das würde das Erscheinungsbild deutlich verbessern, aber so
>einfach ist die Umsetzung ja auch nicht,

Willst du programmieren oder jammern?

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.