mikrocontroller.net

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


Autor: Daniel Schneider (docsneider)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mein Vorschlag dazu:
// zeigt einen Wert von -100 bis +100 auf einem 2x16-LCD an, und zwar
// in der ersten Zeile als Bruchzahl, in der zweiten als Balken
// (-100->"-1.00", -99->"-0.99" ...):
void writeValue( int value )
{
  // Zeilenlänge des LCD:
  const int LEN_ZEILE = 16;

  int iKlotz;

  // soviele Klötze sollen gemalt werden:
  // Man hat 16 Möglichkeiten für die Klötze, sowie 201 mögliche
  // Zahlenwerte (-100...+100).
  // Jeder Klotz steht also für 201/16 mögliche Werte, das sind 12 bis
  // 13 Werte je Klotz.

  // so werden jeweils etwa gleich viele Werte auf einen Klotz
  //abgebildet, also:
  // value:      nKloetze:
  // -100...-89   0
  // -88...-77    1
  // -76...-65    2
  //  ...
  // 78...88     15
  // 89...100    16
  //int  nKloetze = ( value+100 )*LEN_ZEILE/(201-(201/LEN_ZEILE));

  // so dagegen haben 0 und 16 Klötze nur halb soviele Werte, also:
  // value:      nKloetze:
  // -100...-94   0
  // -93...-81    1
  // -80...-69    2
  //  ...
  // 83...95     15
  // 96...100    16
  int  nKloetze = ( value+100+201/LEN_ZEILE/2 )*( LEN_ZEILE - 1 )/(201-(201/LEN_ZEILE));

  lcd1.setCursor( 0, 0 );

  // In erster Zeile den Wert ausgeben:

  // Vorzeichen:
  if( value<0 )
  {
    lcd1.writeData( '-' );
    value = -value;
  }
  else
  {
    lcd1.writeData( '+' );
  }


  // Wert begrenzen:
  if( value>100 )
  {
    value = 100;
  }

  if( value==100 )
  {
    lcd1.writeData( '1' );
    value = 0;
  }
  else
  {
    lcd1.writeData( '0' );
  }


  lcd1.writeData( '.' );

  // 1. Nachkommastelle:
  lcd1.writeData( '0'+(value/10) );

  // 2. Nachkommastelle:
  lcd1.writeData( '0'+(value%10) );


  // Klötze ausgeben:
  lcd1.setCursor( 0, 1 );
  for( iKlotz=0; iKlotz<nKloetze; ++iKlotz )
  {
    lcd1.writeData( 0xff );
  }
  for( ; iKlotz<LEN_ZEILE; ++iKlotz )
  {
    lcd1.writeData( ' ' );
  }

}


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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel Schneider (docsneider)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel Schneider (docsneider)
Datum:

Bewertung
0 lesenswert
nicht 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 !!

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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

> ...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.