www.mikrocontroller.net

Forum: Codesammlung Bargraph für Text-LCD

Autor: Thomas Müller (thomas1123) Benutzerseite
Datum: 07.05.2008 10:31

Ich habe mich mal rangemacht eine Funktion zu schreiben, welche einen
Bargraphen auf einem Text-Display ausgibt. Der Balken kann eine
"belibige" Länge haben (bisher nur von 10 bis 20 getestet auf einem 20*4
Zeichen Dispaly).

Geschrieben und getestet wurde diese Funktion für einen PIC 16F690 mit
dem Hitech PicC-Lite Compiler da aber keine prozessorspezifischen
Befehle verwendet wurden, müsste diese Funktion auch für den AVR und co
verwendbar sein.

lcd_write_posit(line, row);
ist ein Funktionsaufruf der in einer anderen Funktion dem Display
mitteilt wo der Cursor possitioniert werden soll (dort fängt der Balken
dann auch an)

lcd_write_char(0xd9);
diese Funktion gibt ein asci Zeichen auf dem Display aus eventuell muss
dies angepasst werden falls das von Euch verwendete Display einen
anderen Zeichensatz hat als dieses =>
http://www.lcd-module.de/deu/pdf/doma/dip204-4.pdf

//------------------------------------------------------------------------
// Funktion gibt einen Bargraphen belibiger Länge auf einem Textdisplay aus
// value    => Wert
// max       => Maximalwert des Bargraphen
// line      => Displayzeile
// row      => Diaplayspalte
// bar_lengh  => Die Länge des Balkens in ganzen Zeichen
// char_lengh  => Die Pixelbreite eines Zeichens (die Pixelbreite eines 
//           Zeichens + 1 für den Freiraum zwischen zwei Zeichen
//           sodass der balken "flüssig" durchläuft.

void bargraph ( unsigned long value, unsigned int max,
        char line, char row, char bar_lengh,
        char char_lengh )
{
  char _x;
  char _y;
  char ganze;
  char teile;
  
  teile = ((value * bar_lengh * char_lengh) / max);
  ganze = (teile / char_lengh);
  teile = (teile - (ganze * char_lengh));
  
  lcd_write_posit(line, row);
  
  while(_x < ganze)
  {
    lcd_write_char(0xd6);
    
    _x++;
  }
  switch(teile)
  {  
    case 0: 
    {
      lcd_write_char(0x20);
      break;
    }
    case 1: 
    {
      lcd_write_char(0xda);
      break;
    }
    case 2: 
    {
      lcd_write_char(0xd9);
      break;
    }
    case 3: 
    {
      lcd_write_char(0xd8);
      break;
    }
    case 4: 
    {
      lcd_write_char(0xd7);
      break;
    }
    case 5: 
    {
      lcd_write_char(0xd6);
      break;
    }
  }
  _y = (bar_lengh - (ganze + 2));
  while (_y < (bar_lengh + 1))
  {
    lcd_write_char(0x20);
    _y--;
  }
  _x = 0;
  _y = 0;
}


mfg
Thomas
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum: 07.05.2008 12:25

Hmm

>      lcd_write_char(0xda);
>      lcd_write_char(0xd9);
>      lcd_write_char(0xd8);
>      lcd_write_char(0xd7);
>      lcd_write_char(0xd6);

Welches Display hast du benutzt? Die obigen Zeichen sind doch
auf einem Standard-44780 LCD irgendwelche japanische Sonderzeichen.

IMHO müsste man dazu auf einem Standard Display sich selbst ein
paar Zeichen definieren.
Autor: Manfred B. (vorbeigeschlendert)
Datum: 07.05.2008 13:03

Karl heinz Buchegger wrote:
[...]
> IMHO müsste man dazu auf einem Standard Display sich selbst ein
> paar Zeichen definieren.

Full Ack
Autor: Frank L. (hermastersvoice)
Datum: 07.05.2008 13:13

Selbstdefinierte Zeichen wären schon das Mittel der Wahl. Beispiel auch
hier:
http://www.holger-klabunde.de/projects/bargraph.htm

bye

Frank
Autor: Michael Haberler (mah)
Datum: 07.05.2008 13:21

diese Funktion kannst aus der Procyon AVRlib abmalen, siehe lcd*.c in
http://hubbard.engr.scu.edu/avr/avrlib/docs/html/index.html

lg Michael
Autor: Läubi Mail@laeubi.de (laeubi) Benutzerseite
Datum: 07.05.2008 15:32

Na nun demotiviert den guten doch nicht gleich!
Ich würde aber gerade Konstanten doch kommentieren, sonst ist es schwer
für jemand das nachzuvollziehen/anzupassen.
Autor: Thomas Müller (thomas1123) Benutzerseite
Datum: 07.05.2008 16:04

@Karl heinz Buchegger
ich habe ein EA DIP-204-4 benutzt wie auch aus dem link zum datenblatt
erkennbar sein sollte.
ich habe aber eben mal bei dem Hitachi controller ins datenblatt
geschaut und festgestellt das an den betrffenden stellen wirklich nur
irgentwelche seltsamen zeichen sind. tut mir leid jungs ich habe die
funktion unter zuhilfenahme eines displays mit KS0073 controller
entwickelt

@Manfred B.
ich weiss zwar nicht genau wie "Full Ack" zu interpretieren ist aber ich
bin auch nicht sehr froh darüber das für den standartcontroller erst
noch irgentwelche zeichen erstellt werden müssen. ich selbst habe es
noch nicht geschafft eigene zeichen auf einem display zu erstellen
siehe beitrag: Beitrag "Eigene Zeichen bei LCD mit KS0073 für blöde"

@Michael Haberler
welche funktion die die ich geschrieben habe oder die die man benötigt
um eigene zeichen zu definieren?

@Läubi Mail@laeubi.de
ja das mit den kommentaren werde ich versuchen in zukunft weiter
einfliessen zu lassen. zu meiner verteidigung kann ich aber sagen das
ich auch den link zum datenblatt gepostet habe worin eine tabelle der
asci-zeichen des verwendeten displays enthalten ist

@alle die sich beschwert haben
>...eventuell muss
>dies angepasst werden falls das von Euch verwendete Display einen
>anderen Zeichensatz hat als dieses =>
>http://www.lcd-module.de/deu/pdf/doma/dip204-4.pdf
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum: 07.05.2008 16:36

Thomas Müller wrote:
> @Karl heinz Buchegger
> ich habe ein EA DIP-204-4 benutzt wie auch aus dem link zum datenblatt
> erkennbar sein sollte.

Mea culpa.
Das hab ich dann nicht geschnallt bzw. nicht weit genug
gelesen.

Aber nun ist es ja ausreichend dokumentiert, so dass jemand
der deine Routine benutzen will, vorher abklären kann, ob er sie
ohne Anpassung einsetzen kann oder nicht.

Darum ging er mir und um sonst nichts.
Vielen Dank für die Veröffentlichung deiner Funktion in der
Codesammlung.
Autor: Thomas Müller (thomas1123) Benutzerseite
Datum: 07.05.2008 17:34

habe noch nen Schmankerl.
habe mal nen Video gemacht und bei Youtube hochgeladen.
http://www.youtube.com/watch?v=LxFvcsAs9gM
Autor: Mehmet Kendi (mkmk)
Datum: 07.05.2008 18:48
Dateianhang: youtube.jpg (100,3 KB, 64 Downloads)
preview image for youtube.jpg

Leider wurde in der Türkei auch youtube gesperrt. Vor ein paar Wochen
war es groups.google gewesen. Heute youtube. Toll. Wir naehern uns immer
mehr iranischen Verhaeltnissen. Oder chinesischen? Oder burmanesischen?
Autor: Thomas Müller (thomas1123) Benutzerseite
Datum: 07.05.2008 19:53

@Mehmet
ich bin entsetzt!
wenn du das video umbedingt sehen wilst könnte ich es bei rapisshare
hochladen. is aber fast 50Mb gross, weil meine digicam immer so riesen
videos daraus macht

P.S. könntest du mal übersetzen was bei deinem screenshot steht?
würde mich mal interessiern
Autor: Mehmet Kendi (mkmk)
Datum: 07.05.2008 20:28

Der Zugriff auf diese Seite wurde unterbunden

Gemaess eines Entscheids des 11. Amtsgerichts Ankara vom 24.04.2008 und
Aktennummer 2008/368  wurde der Zugriff auf diese Webseite durch das
Ministerium für Telekomunikation unterbunden.

Aber Thomas, damit wir uns nicht missverstehen: nicht Deine Seite wurde
gesperrt, sondern youtube als Ganzes.
Autor: Thomas Müller (thomas1123) Benutzerseite
Datum: 11.05.2008 12:52

habe noch einen kleinen fehler gefunden. und zwar muss die switch case
funktion noch mit einer if funktion überwacht werden. denn wenn value
den gleichen wert hat wie max, dann schreibt er noch das nächste zeichen
vom display(also insgesamt bar_lengh + 1).
anbei noch ein auszug des berictigten codes.
if (value != max) // hier die if abfrage die noch eingefügt werden muss
  { // beginn schleife
    switch(teile)
    {  
      case 0: 
      {
        lcd_write_char(0x20);
        break;
      }
      case 1: 
      {
        lcd_write_char(0xda);
        break;
      }
      case 2: 
      {
        lcd_write_char(0xd9);
        break;
      }
      case 3: 
      {
        lcd_write_char(0xd8);
        break;
      }
      case 4: 
      {
        lcd_write_char(0xd7);
        break;
      }
      case 5: 
      {
        lcd_write_char(0xd6);
        break;
      }
    }
  } // ende Schleife

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net