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 | }
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|