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
@ 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
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('|');> }
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
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.
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.
@ 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
voiddraw_bar(uint8_tcount){
2
uint8_ti;
3
4
if(count>16)count=16;
5
6
Disp_Command(0x80+0x40);// Cursor auf 2. Zeile, Spalte 1
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 ?
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
@ 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?