Forum: Compiler & IDEs Balkendiagramm für ein 2x16 LCD


von Daniel S. (docsneider)


Lesenswert?

Hallo,

versuche an einem LCD-Display in der 2. Zeile ein Balkendiagramm laufen 
zu lassen.
Grund ist ich möchte eine Sinuskurve messen und am Display soll dann 
sowas herauskommen      links oben der Wert im Klartext
                  ______________________________________
                 |________________________________________|
                 |________________________________________|

                 -1                  0                    +1
Ich würde jetzt gerne die schwarzen Blöcke auftauchen lassen, weiß zwar 
das es der Wert 255 oder 0xFF bei dem Display ist, weiß aber nicht wie 
ich es bei dem Display anzeigen lasse.

Benutze die Micro-SPS und habe dort das normale 2x16 Zeilen Display.

danke

docsneider

von Karl H. (kbuchegg)


Lesenswert?

Kannst du normalen Text ausgeben?
Was ist wenn du anstelle der Blöcke deinen Balken erst mal mit * malst, 
kriegst du es dann hin?

(Sooo schwer ist das doch gar nicht. Ausgehend vom auszugebenden Wert, 
der im Bereich -1.0 bis +1.0 liegt, errechnet man sich, wieviele * man 
benötigt und wo, relativ gesehen zum linken Rand man mit der Ausgabe 
anfangen muss. Dann positioniert man am LCD den Cursor in diese Spalte 
und gibt die entsprechende Anzahl an Zeichen aus. Etwas Überlegung muss 
man noch in das Problem stecken, dass einmal auf das LCD ausgegebene * 
ja auch wieder verschwinden müssen, aber auch das ist eigentlich nicht 
so schwer wenn man das Problem einmal erkannt hat. Auf jeden Fall bewegt 
sich alles in einem Mathe-Bereich, der nicht mehr als den 
allgegenwärtigen Drei-Satz erfordert. Du weißt schon: 3 Äpfel kosten 2 
Euro, wieviel kosten 7 Äpfel)

von Klaus W. (mfgkw)


Lesenswert?

mein Vorschlag dazu:
1
// zeigt einen Wert von -100 bis +100 auf einem 2x16-LCD an, und zwar
2
// in der ersten Zeile als Bruchzahl, in der zweiten als Balken
3
// (-100->"-1.00", -99->"-0.99" ...):
4
void writeValue( int value )
5
{
6
  // Zeilenlänge des LCD:
7
  const int LEN_ZEILE = 16;
8
9
  int iKlotz;
10
11
  // soviele Klötze sollen gemalt werden:
12
  // Man hat 16 Möglichkeiten für die Klötze, sowie 201 mögliche
13
  // Zahlenwerte (-100...+100).
14
  // Jeder Klotz steht also für 201/16 mögliche Werte, das sind 12 bis
15
  // 13 Werte je Klotz.
16
17
  // so werden jeweils etwa gleich viele Werte auf einen Klotz
18
  //abgebildet, also:
19
  // value:      nKloetze:
20
  // -100...-89   0
21
  // -88...-77    1
22
  // -76...-65    2
23
  //  ...
24
  // 78...88     15
25
  // 89...100    16
26
  //int  nKloetze = ( value+100 )*LEN_ZEILE/(201-(201/LEN_ZEILE));
27
28
  // so dagegen haben 0 und 16 Klötze nur halb soviele Werte, also:
29
  // value:      nKloetze:
30
  // -100...-94   0
31
  // -93...-81    1
32
  // -80...-69    2
33
  //  ...
34
  // 83...95     15
35
  // 96...100    16
36
  int  nKloetze = ( value+100+201/LEN_ZEILE/2 )*( LEN_ZEILE - 1 )/(201-(201/LEN_ZEILE));
37
38
  lcd1.setCursor( 0, 0 );
39
40
  // In erster Zeile den Wert ausgeben:
41
42
  // Vorzeichen:
43
  if( value<0 )
44
  {
45
    lcd1.writeData( '-' );
46
    value = -value;
47
  }
48
  else
49
  {
50
    lcd1.writeData( '+' );
51
  }
52
53
54
  // Wert begrenzen:
55
  if( value>100 )
56
  {
57
    value = 100;
58
  }
59
60
  if( value==100 )
61
  {
62
    lcd1.writeData( '1' );
63
    value = 0;
64
  }
65
  else
66
  {
67
    lcd1.writeData( '0' );
68
  }
69
70
71
  lcd1.writeData( '.' );
72
73
  // 1. Nachkommastelle:
74
  lcd1.writeData( '0'+(value/10) );
75
76
  // 2. Nachkommastelle:
77
  lcd1.writeData( '0'+(value%10) );
78
79
80
  // Klötze ausgeben:
81
  lcd1.setCursor( 0, 1 );
82
  for( iKlotz=0; iKlotz<nKloetze; ++iKlotz )
83
  {
84
    lcd1.writeData( 0xff );
85
  }
86
  for( ; iKlotz<LEN_ZEILE; ++iKlotz )
87
  {
88
    lcd1.writeData( ' ' );
89
  }
90
91
}

(die lcd-Funktionen entsprechend durch deine eigenen ersetzen...)

von Klaus W. (mfgkw)


Lesenswert?

Dann noch eine Idee dazu:
Man könnte sich einen Zeichensatz definieren, in dem ein Zeichen die
linke Pixelspalte gesetzt hat, das zweite Zeichen die linken beiden 
etc.;
dadurch könnte man den Balken feiner auflösen.

von Daniel S. (docsneider)


Lesenswert?

das ist ja ne ausführliche Antwort, Danke.

Nun das Prinzip verstehe ich schon, nur ich benutze die lib_sps Libary 
und habe dort habe ich " printf("%6d", irgendeine Zahl) " befehle. Da 
hatte ich jetzt versucht 0xFF oder 255 einzugeben um ein Klotz 
erscheinen zu lassen.

Sorry wenn ich mich zu ungenau ausgedrückt habe !!

Hab noch kaum Erfahrung mit MC, will es aber ändern. ;-)

von MaWin (Gast)


Lesenswert?

Dessen
http://www.gb97816.homepage.t-online.de/
Projekt KT88 macht so was,
Sourcecode konnte ich aber auf die Schnelle nicht finden,

Hab ich aber auch schon woanders gesehen.
Man bracht halt 5 von den 8 frei definierbaren Bitmuster-zeichen.

von Daniel S. (docsneider)


Lesenswert?

Klaus Wachtler schrieb:
> Dann noch eine Idee dazu:
> Man könnte sich einen Zeichensatz definieren, in dem ein Zeichen die
> linke Pixelspalte gesetzt hat, das zweite Zeichen die linken beiden
> etc.;
> dadurch könnte man den Balken feiner auflösen.

Das finde ich eine gute Idee !!

von Vlad T. (vlad_tepesch)


Lesenswert?

MaWin schrieb:
> Dessen
> http://www.gb97816.homepage.t-online.de/
> Projekt KT88 macht so was,
> Sourcecode konnte ich aber auf die Schnelle nicht finden,
>
> Hab ich aber auch schon woanders gesehen.
> Man bracht halt 5 von den 8 frei definierbaren Bitmuster-zeichen.

du brauchst 8.
da er die balken in beide richtung will (wenn ich sein diagram richtig 
interpretiert hab

Edit:
Ich hab mal ein video gesehen, da haben welche ein text-display ion 
ihren PC eingebaut und da irre Effekte drauf gezeigt.

von yalu (Gast)


Angehängte Dateien:

Lesenswert?

Man kann auf einem 2×16-Display mit einem geeigneten Zeichensatz auch
vier Bargraphs übereinander mit jeweils bis zu 33 Abstufungen zeichnen
(s. Bild).

Da die horizontalen Zwischenräume zwischen den Zeichen bei den meisten
Displays gerade 1 Pixel breit sind, haben die einzelnen Kästchen alle
den gleichen Abstand zueinander, was ein homogenes Erscheinungsbild
ergibt. Das sieht besonders gut aus, wenn man die einzelnen Balken
schnell zappeln lässt, wie es bspw. bei einer Aussteuerungsanzeige der
Fall ist.

Der verwendete Zeichensatz belegt alle der acht frei definierbaren
Zeichen des Display-Controllers. Im Bild ist zur Verdeutlichung eines
dieser Spezialzeichen rot eingerahmt.

Man kann natürlich wahlweise statt der vier Bargraphs nur zwei anzeigen
und hat dann noch eine Zeile für Textinformationen frei.

Leider können die Balken nur in eine Richtung (im Bild nach rechts)
wachsen, da man sonst mit den acht Zeichen nicht auskommt. Wenn aber 17
horizontale Abstufungen ausreichen, kann man mit sieben Spezialzeichen
sogar sechs Bargraphs (jeweils 2 Pixel hoch) übereinander darstellen und
jeweils in beide Richtungen wachsen lassen.

von Klaus W. (mfgkw)


Lesenswert?

Wenn die 8 frei definierbaren Zeichen nicht reichen, kann man auch
das aktuell benötigte neu definieren; man braucht ja nie alle
gleichzeitig :-)

von Klaus W. (mfgkw)


Lesenswert?

Daniel Schneider schrieb:
> das ist ja ne ausführliche Antwort, Danke.
>
> Nun das Prinzip verstehe ich schon, nur ich benutze die lib_sps Libary
> und habe dort habe ich " printf("%6d", irgendeine Zahl) " befehle. Da
> hatte ich jetzt versucht 0xFF oder 255 einzugeben um ein Klotz
> erscheinen zu lassen.

dann mal printf( "%c", 0xff ) und putchar( 0xff ) probieren

> ...

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.