Hallo, ich habe einen T6963 Display zu laufen bekommen. jetzt habe ich da noch Probleme mit der Text Ausgabe. Ich soche eine Funktion die so aufgebaut ist wie die printf Funktion in ANSI C. Das heisst dass ich das Format der Ausgabe noch einstellen kann. Gibt es im Netz irgendwo so eine Funktion für das Display T6963?
Wenn ich eine Int oder Char Variable habe möchte ich diese der Funktion printf übergebn, und diese soll den Wert auf das Display darstellen.
Man muss mit "sprintf" die auszugebenden Strings im Speicher erstellen und dann entweder an den Textlayer ausgeben oder in Grafik umwandeln über einen eigenen Zeichensatz. Der Speicherbereich sollte als 2-dim. Array, z.B. mit char textarray[4][20] definiert werden (mit der tatsächlich verwendeten Zeilen- und Spaltenzahl des LCD). Zunächst das Textarray jedesmal löschen mit Blanks 0x20 oder Nullen 0x00. Dann z.B. mit sprintf(&textarray[1][8], "Hallo"); in den Speicher schreiben ; Format sonst wie bei printf, also z.B. %d usw. Das Textarray mit den einzelnen Strings über einzelne sprint beschreiben, dabei Überschneidungen vermeiden. Ausgaberoutine so gestalten, dass kein Abbruch bei 0x00 stattfindet sondern erst am Ende des Arrays (Abschluss-Null der einzelnen Strings!).
Hallo, ich hab mal die Funktionen mit CodeVision AVR programmiert. //Deklaration char text_buffer[20]; float zahl_buffer[20]; char flash format[20]; //Funktionen void LCD_write_zahl(unsigned int x, unsigned int y, unsigned char *zahl) // write String an pos x, y { unsigned int address; address = ((unsigned int)y * 22) + x + 0x1000; out(0x24,address & 0xff,address >> 8); while (*zahl) { out(0xC0,0,(*zahl++)-0x20); } } void LCD_write_text(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 LCD_printfz(unsigned int x, unsigned int y, unsigned char flash *format, unsigned char *zahl) { sprintf(zahl_buffer,format,zahl); LCD_write_zahl(x, y, zahl_buffer); } void LCD_printft(unsigned int x, unsigned int y, unsigned char flash *text) { sprintf(text_buffer,text); LCD_write_zahl(x, y, *text_buffer); } Der Compiler von CodeVision AVR bringt immer folgende Warnung: --> suspicious point conversion Was mache ich da falsch?
Kann mir dazu echt niemand helfen! Ich komme wirklich nicht weiter. Ich habe jatzt mal eine andere Funktion gemacht, mit der ich einen ganzen String auf das Display ausgeben will. Warum mekert der Compiler. Ich weiss nicht mehr weiter. Der CodeVisionAVR Compiler mekert mal wieder: -->pointers are to different memory areas //Code void lcd_printf(unsigned char * string, unsigned char x, unsigned char y) { unsigned int address,i; address= y * 22 + x + 0x1000; out(0x24, address & 0xff,address >> 8); out(0xB0, 0, 0); for (i=0; string[i]; i++) { out(0xC0, 0, string[i]-0x20); } out(0xB2, 0, 0); } //Hautprogramm lcd_printf("HALLO",10,10);
jetzt funzt es: und zwar muss man bei dem sprintf Befehl das flash davor stehe. //Code void lcd_printf(unsigned char flash * string, unsigned char x, unsigned char y) { unsigned int address,i; address= y * 22 + x + 0x1000; out(0x24, address & 0xff,address >> 8); out(0xB0, 0, 0); for (i=0; string[i]; i++) { out(0xC0, 0, string[i]-0x20); } out(0xB2, 0, 0); } //Hautprogramm lcd_printf("HALLO",10,10); Ok, mit dieser Funktion kann ich jetzt einen Text Ausgeben. Ja wie müsste die Funktion aussehen wenn ich eine Integer Variable auf dem Display ausgeben will? Da hab ich noch meine Probleme. Die Funktion sollte da so aussehen: void lcd_printf(unsigned int x, unsigned int y, unsigned char flash *format, unsigned char *zahl); Im Hauptprogramm müsste man die Funktion so aufrufen: int TEST = 1234; lcd_printf(0,0."Variable %4d",TEST); Könnte mir da irgend jemand dabei helfen?
Hi Klaus, mmmhhh...das ist echt kompliziert. Gibt es nicht irgendwo eine fertige Routine mit der ich dies tun kann. Ok ich weiss es ist blöde wenn man im Forum nach fertige Codes anfrägt. Aber ich hab ja soweit alles mir fehlr halt nur noch diese Funktion.
so mein erster Versuch: //Funktion void lcd_test(unsigned int x, unsigned int y) { unsigned int address,i=0; sprintf(zahl_buffer,"%04u","1234"); address = ((unsigned int)y * 22) + x + 0x1000; out(0x24,address & 0xff,address >> 8); while (zahl_buffer[i]) { out(0xC0,0,zahl_buffer[i]-0x20); i++; } } //Hauptprogramm lcd_test(0,0); Auf meinem Display erscheint statt 1234 der Wert 04. GRRRRRRRRRRRR ich bekomme noch die Krise. Was stimmt da nicht?
Ich brauche nur die eine Unterstützung. Warum wandelt die Funktion sprintf die Zahl nicht um?
int flash zahl_buffer[20]; void lcd_test(unsigned int x, unsigned int y) { unsigned int address,i=0; sprintf(zahl_buffer,"ZAHL=%6d",19385); address = ((unsigned int)y * 22) + x + 0x1000; out(0x24,address & 0xff,address >> 8); for (i=0; zahl_buffer[i]; i++) { out(0xC0, 0, zahl_buffer[i]-0x20); } } Wenn diese Funktion ausführe, dann erscheint auf dem Display nicht exakt "ZAHL=19385 sondern nur jedes zweite Zeichen "ZH=135". Wie kann dass denn sein?
...na, wer ist denn so ungeduldig. Auch Rom wurde nicht an einem Tag erbaut. Bin der Klaus von gestern. Meine Tips sind nur prinzipiell, weil ich in meinen Projekten nur den alten HD61830 drinhatte, nicht den T6963 ; außerdem auch keinen AVR. Es gibt aber ein gut dokumentiertes Referenzprojekt mit einem T6963 und aber HC12 (HCS12), geschrieben in C bei ... http://elmicro.com/hc12web/acprd/ Das sollte weiterhelfen. Das Programm habe ich nur kurz angesehen. Ich habe keine Möglichkeit das irgendwie auszuprobieren. Mysterium: Nur jedes 2. Zeichen: Es wäre aber zweckmäßig, deinen "zahl_buffer" mal anzusehen, ob da die ASCII-Zeichen korrekt drinstehen. --> Liegt also das Problem an der Erzeugung (sprintf) oder an der Ausgabe / Darstellung am LCD ? Und das Datenblatt des DISPLAYS des T6969 die Initialisierung nochmals GENAU ansehen. Vielleicht hat der Textbereich komische Adresszuordnungen, oder es ist ein Modus wo nur das erste Byte als Zeichen dargestellt wird und das zweite als Attribut vorgesehen ist (blinken, Negativdarstellung etc.). Klaus
Hi Klaus, vielen Dank! Ich kann jetzt zumindest mal einen Integer Wert auf dem Display darstellen. Wie mache ich dies mit einer Float variable? //Deklaration char zahl_buffer[20]; char flash format[10]; //Funktion void lcd_test(unsigned int x, unsigned int y, unsigned char flash *format,unsigned int value) { unsigned int address,i=0; sprintf(zahl_buffer,format,value); address = ((unsigned int)y * 22) + x + 0x1000; out(0x24,address & 0xff,address >> 8); for (i=0; zahl_buffer[i]; i++) { out(0xC0, 0, zahl_buffer[i]-0x20); } } //Hauptprogramm lcd_test(0,0,"DEZ:%6d",23456);
Vielleicht mit ... //Hauptprogramm lcd_test(0,0, " %4.2f ", 3.14 * 12.34 ); Natürlich kann man auch float Variablen anlegen und dann damit rechnen. Allerdings: Sobald man "float" verwendet, wird das Programm ofmals erheblich größer weil dann die entsprechenden Funktionen aus den Libraries eingebaut werden müssen. Auf kleinen uP kriegt man schnell Speicherplatzprobleme. Das ist dann alles ganz normales C. Vielleicht mal ein Vorlesungsskript lesen: kommunikationstechnik.fht-esslingen.de/~harms/inf1/c_gesamt.pdf Klaus
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.