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