Compiler & IDEs
›
Thread
GLCD dynamische Variable Anzeigen
Hallo,
Ich brauche mal einen kleinen Denkanstoß. Ich arbeite mit einem
Grafik-LCD von Pollin mit einem ks0108 Chip und der lib vom ape hier aus
dem Forum.
Ich bin nicht sehr erfahren was mikrocontroller betrifft, daher ist die
Freude das es erstmal funktioniert groß :-)
Nun möchte ich aber Variablen ausgeben die sich ändern (später
Temperatur und zeit).
Im Moment simuliere ich die Änderung der Variablen mit dem hochzuholen
von einem Taster.
Wenn jetzt aber z.b. aus einer 2 eine 3 wird dann ist die 2 immernoch im
Hintergrund und die 3 überlagert die alte Zahl.
Wie kann ich das denn ändern? Ich komm nicht so wirklich drauf.
Ich hoffe ihr könnt mir helfen.
Anbei der Code von der Main.c (bin noch Anfänger daher ist der Code wohl
nicht der schönste...)
1 #include <inttypes.h>
2 #include <avr/io.h>
3 #include <avr/pgmspace.h>
4 #include <stdlib.h>
5
6 #include "ks0108.h"
7 #include "font12x16.h"
8 #include "font6x8.h"
9
10 //Setzen PD2 und PD3 als Eingänge
11 t1 = PD2;
12 t2 = PD3;
13
14 int oel1;
15 oel1 = 12 ;
16 int oel2;
17 oel2 = 5;
18 int luft1;
19 luft1 = 22;
20 int luft2;
21 luft2 = 0;
22
23 int main(void) {
24
25 DDRD &= ~((1<<PD2) | (1<<PD3));
26 DDRD |= (1<<PD4);
27
28 volatile uint16_t in;
29 struct font largeFont, smallFont;
30
31 for(in=0; in<15000; in++);
32
33
34 largeFont.width = FONT12X16_WIDTH;
35 largeFont.height = FONT12X16_HEIGHT;
36 largeFont.charData = Font12x16;
37
38 smallFont.width = FONT6X8_WIDTH;
39 smallFont.height = FONT6X8_HEIGHT;
40 smallFont.charData = Font6x8;
41
42 ks0108Init();
43
44 while(1) {
45
46 if (PIND & (1<<PD2) ) { PORTD ^= (1<<PD4); oel1++ ; }
47
48
49 //Anzeige Zeit
50 ks0108GotoXY(34,0);
51 ks0108PutString("16:38 \n", largeFont);
52
53 // Anzeige Datum & Text
54 ks0108GotoXY(15,17);
55 ks0108PutString("Montag 03.08.2012",smallFont);
56 ks0108DrawLine(63,31,63,63);
57 ks0108GotoXY(1,31);
58 ks0108PutString("Temp. Luft", smallFont);
59 ks0108GotoXY(70,31);
60 ks0108PutString("Temp Oel",smallFont);
61
62
63 //Ausgabe Öl Temperatur
64 ks0108GotoXY(1,45);
65 char Buffer[20];
66 itoa( oel1 , Buffer, 10);
67 ks0108PutString( Buffer , largeFont);
68 ks0108PutString(".", largeFont);
69 itoa( oel2 , Buffer, 10);
70 ks0108PutString( Buffer , largeFont);
71
72 //Ausgabe Luft Temperatur
73 ks0108GotoXY(70,45);
74 itoa( luft1 , Buffer, 10);
75 ks0108PutString( Buffer , largeFont);
76 ks0108PutString(".", largeFont);
77 itoa( luft2 , Buffer, 10);
78 ks0108PutString( Buffer , largeFont);
79
80
81 }
82 return 0;
83 }
ks0108ClearScreen();
Oder vorher die Zeichen wo die Variable auftaucht entsprechend der max
länge mit Leerzeichen überschreiben
oder den Bereich mit einem gefüllten Rechteck überschreiben.
D.h. du musst eine Routine schreiben die jeden Pixel abklappert
Das habe ich für einen ILI9325 geschrieben: 1 void LCD_Square ( uint16_t hor , uint16_t ver , uint16_t wide , uint16_t high , uint16_t Color , uint16_t fill )
2 //if fill = 0xAAAA then transparent
3 {
4 if ( fill != 0xAAAA ) //wenn nicht Transparent, dann Füllen
5 {
6 for ( uint16_t i = 0 ; i <= high ; i ++ )
7 {
8 LCD_GRAM_select ( hor , ver + i ); //Pixel anwählen
9 for ( uint16_t j = 0 ; j <= wide ; j ++ )
10 {
11 //Der ILI9325 inkrementiert von alleine in x-Richtung
12 LCD_WRITE ( 0x22 , fill ); //Farbwert des Pixels ändern
13 }
14 }
15
16 }
17
18 //hier wird ein Rahmen von 1px drumherumgezogen
19 LCD_GRAM_select ( hor , ver );
20 for ( int i = 0 ; i <= wide ; i ++ ) LCD_WRITE ( 0x22 , Color );
21 LCD_GRAM_select ( hor , ver + high );
22 for ( int i = 0 ; i <= wide ; i ++ ) LCD_WRITE ( 0x22 , Color );
23
24 for ( int i = 0 ; i <= high ; i ++ )
25 {
26 LCD_GRAM_select ( hor , ver + i );
27 LCD_WRITE ( 0x22 , Color );
28 LCD_GRAM_select ( hor + wide , ver + i );
29 LCD_WRITE ( 0x22 , Color );
30 }
31 //Rahmen Ende
32
33 }
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren