Ich habe einen AVr an ein Grafik Display (Typ:T6963) angeschlossen. Funktioniert ohne Probleme. Leider kann ich jetzt keine Zahlen darstellen lassen. Hier habe ich mal den Code: Mit diesem Code kann ich nicht alles Zahlen darstellen lassen. Kann mir da jemand helfen? ---------------------------------------- void lcd_write_zahl(unsigned char flash data, unsigned char x,unsigned char y, ) { unsigned char zahl; unsigned int address; address= y * 22 + x + 0x1000; zahl = data; if (zahl >=0 & zahl <=9) { if (zahl == 0) data = 0x30; if (zahl == 1) data = 0x31; if (zahl == 2) data = 0x32; if (zahl == 3) data = 0x33; if (zahl == 4) data = 0x34; if (zahl == 5) data = 0x35; if (zahl == 6) data = 0x36; if (zahl == 7) data = 0x37; if (zahl == 8) data = 0x38; if (zahl == 9) data = 0x39; out(0x24, address & 0xff,address >> 8); out(0xC0, 0, data-0x20); } if (zahl >=10 & zahl <=99) { if(zahl == 10) { out(0x24, address & 0xff,address >> 8); data = 0x31; out(0xC0, 0, data-0x20); data = 0x30; out(0xC0, 0, data-0x20); } } }
Warum denn so umständlich? Wenn Du WinAVR verwendest, kannst Du es auch so machen: unsigned char buffer[10]; data = 260; // z.B. itoa(data,buffer,10); // 10 steht für Dezimalsystem -> in buffer[] steht jetzt ein terminierter String ("260/0"), der direkt ans Display geschrieben werden kann.
Hallo hebel23! So ich habe mal deinen Vorschlag ausprobiert. leider funktioniert dies nicht. Kannst du mir bei dieser Funktion helfen? -------------------------------------------- void lcd_write_zahl_xy(unsigned int x, unsigned int y, unsigned int zahl) // write String an pos x, y { unsigned int address; unsigned char flash buffer[7]; itoa(zahl,buffer); address = ((unsigned int)y * 22) + x + 0x1000; out(0x24,address & 0xff,address >> 8); while (*buffer) { out(0xC0,0,(*buffer++)-0x20); } }
Ist das wirklich eine gute Idee, den buffer ins Flash zu legen? Normalerweise muss man nach jedem befehl, den das lcd verarbeitet, warten bis das display denselben verarbeitet hat, beispielsweise so: while ((displayCommandRregister & 3) !=3) {}; Ausserdem geht das schreiben in den Display-Speicher mittels des autowrite-commands wesentlich schneller. Zudem sind in dem oberen Codeschnipsel die UND-Verknüpfungen falsch: die syntax ist (a && b) , ein einfaches & ist eine bitweise UND-Verknüpfung.
Mir ist grad noch was aufgefallen, bin mir aber nicht sicher, da ich den eingebauten Font nicht benutze, sonder nur bitmap-fonts. Stimmt der Ausdruck (*buffer++)___-0x20___? Wenn das Display den ascii-zeichensatz beherrscht, dann ist das -0x20 falsch.
Hallo nochmal, also erstmal gehört der buffer, wie Matthias schon sagt, natürlich in den RAM und hat im Flash nichts zu suchen. Ich weiß jetzt nicht, was Deine "out"-Funktion macht, so dass ich das nicht nachvollziehen kann. Ich schicke einen String so ans Display: void glcd_PutString(unsigned char *data)// String schreiben { glcd_WriteCommand(0xB0); // Autoinc an while (*data) { glcd_WriteData( (*data) - 0x20); data++; } glcd_WriteCommand(0xB2); // Autoinc aus } klappt prima und hat den Vorteil, dass man weniger Daten übertragen muss, da das Display den RAM-Pointer automatisch inkrementiert. Gruß Andreas
Der T6963-Controller versteht kein Ascii, deshalb ist die Subtraktion von $20 richtig. Im Datenblatt ist irgendwo eine Tabelle des internen Zeichensatzes, daraus kann man das ersehen. Gruß
Hallo Hebel23! Kannst du mir erklären wie ich zum beispiel die Zahl 125 auf das Display angezeigt bekomme? Ich bekomme nicht hin! Vielen Dank Gruß
Hab noch was vergessen. Ich meine zum Beispiel wenn ich die char Varibale x=127 auf das Display ausgeben will oder eine int Varibale y=345. Wie muss ich dies Programmieren?
Guten morgen! Ich verstehe Deine Frage nicht. Ich dachte darum geht es die ganze Zeit schon?! Was genau ist denn jetzt unklar? Gruß Andreas
Mit der "itoa(data,buffer,10); " Funktion bekomme ich es nicht hin. Ich möchte es so machen: void lcd_write_zahl_xy(unsigned int x, unsigned int y, unsigned int zahl)
Ich vewende den Controller 90S8535. Programmiert wird das ganze mit dem CodeVision AVR. void main(void) { unsigned char buffer[10]; unsigned int i; DDRB = 0xFF; PORTB = 0; DDRD = 0x00; PORTD = 0; PORTC_output(); t6963cinit(); itoa(197,buffer); // Zahl 197 while (1) { if(PIND.6 == 1) { for(i=1;i<=10;i++) { lcd_write_char(buffer[i],1,1); } } if(PIND.5 == 1) { lcd_write_string_xy(2,3,"*Hallo Henning*"); } if(PIND.4 == 1) { lcd_Clear_Text(); } }; }
Wenn ich es mit dieser Funktion mache dann tut sich auch nichts. Ich möchte es so, dass ich in dieser Funktion z.B. einen int Variable übergeben kann und das der Wert auf dem Display erscheint. ---------------------------------------------------------------- void lcd_write_string_xy(unsigned int x, unsigned int y, unsigned char flash *text) // write String an pos x, y { unsigned int address; address = ((unsigned int)y * 22) + x + 0x1000; out(0x24,address & 0xff,address >> 8); while (*text) { out(0xC0,0,(*text++)-0x20); } } void main(void) { unsigned char buffer[8]; unsigned int i,t; t6963cinit(); itoa(24545,buffer); t=0; while (1) { if(PIND.6 == 1) { lcd_write_string_xy(1,8,buffer); } }; }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.