Bargraph für Text-LCD

Persönliche Seite #861248
Lesenswert?

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.

1
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)

1
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

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

12
void bargraph ( unsigned long value, unsigned int max,
13
        char line, char row, char bar_lengh,
14
        char char_lengh )
15
{
16
  char _x;
17
  char _y;
18
  char ganze;
19
  char teile;
20
  
21
  teile = ((value * bar_lengh * char_lengh) / max);
22
  ganze = (teile / char_lengh);
23
  teile = (teile - (ganze * char_lengh));
24
  
25
  lcd_write_posit(line, row);
26
  
27
  while(_x < ganze)
28
  {
29
    lcd_write_char(0xd6);
30
    
31
    _x++;
32
  }
33
  switch(teile)
34
  {  
35
    case 0: 
36
    {
37
      lcd_write_char(0x20);
38
      break;
39
    }
40
    case 1: 
41
    {
42
      lcd_write_char(0xda);
43
      break;
44
    }
45
    case 2: 
46
    {
47
      lcd_write_char(0xd9);
48
      break;
49
    }
50
    case 3: 
51
    {
52
      lcd_write_char(0xd8);
53
      break;
54
    }
55
    case 4: 
56
    {
57
      lcd_write_char(0xd7);
58
      break;
59
    }
60
    case 5: 
61
    {
62
      lcd_write_char(0xd6);
63
      break;
64
    }
65
  }
66
  _y = (bar_lengh - (ganze + 2));
67
  while (_y < (bar_lengh + 1))
68
  {
69
    lcd_write_char(0x20);
70
    _y--;
71
  }
72
  _x = 0;
73
  _y = 0;
74
}


mfg
Thomas
#861365
Lesenswert?

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.
Persönliche Seite #861655
Lesenswert?

@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
#861698
Lesenswert?

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.
Persönliche Seite #864470
Lesenswert?

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.
1
if (value != max) // hier die if abfrage die noch eingefügt werden muss
2
  { // beginn schleife
3
    switch(teile)
4
    {  
5
      case 0: 
6
      {
7
        lcd_write_char(0x20);
8
        break;
9
      }
10
      case 1: 
11
      {
12
        lcd_write_char(0xda);
13
        break;
14
      }
15
      case 2: 
16
      {
17
        lcd_write_char(0xd9);
18
        break;
19
      }
20
      case 3: 
21
      {
22
        lcd_write_char(0xd8);
23
        break;
24
      }
25
      case 4: 
26
      {
27
        lcd_write_char(0xd7);
28
        break;
29
      }
30
      case 5: 
31
      {
32
        lcd_write_char(0xd6);
33
        break;
34
      }
35
    }
36
  } // ende Schleife

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren