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 |
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
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 | 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 | }
|
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.