Ich verwende einen AVR mit einem T6963 Display. Text und Pixel kann ich ohne Probleme anzeigen lassen. Nur mit Zahlen, da gibt es Probleme. Ich möchte es so, dass wenn ich der Funktion z.B. eine Int-Variable übergabe diese auch auf dem Display darstellt wird. Leider habe ich bisher keinen Erfolg gehabt. Ich würde mich auf eure Unterstützung sehr freuen. ---------------------------------------------------------------- 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); } }; }
Ich habe das so gelöst: Wenn Du z.B. Werte bis 99999 darstellen willst. (IntVariable / 10000) = Stelle10T; ((IntVariable-Stelle10T) / 1000) = Stelle1T; ((IntVariable-Stelle10T-Stelle1T) / 100) = StelleH; ...... ...... Int_String[0] = Stelle10T+0x30; Int_String[1] = Stelle1T+0x30; Int_String[2] = StelleH+0x30; ...... ...... Int_String[5] = 0; Wenn Du eine einfachere Lösung findest: Immer her damit :) MfG Uwe
itoa ist kein ansi c und ich würde in jedem Fall sprintf vorziehen. d.h. du machst anstelle itoa ein sprintf(buffer,"%d",4711); Die Ausgabefunktion funktioniert ja, sagst du. Ist unsigned char flash ein compilerspezifischer Typ bei dir? Warum nicht nicht unsigned char, denn schließlich ist buffer ja auch kein 'flash'. Ist das so sicher korrekt?
Hallo chrissy! Vielen Dank! Wie muss ich jetzt die Funktion "sprintf(buffer,"%d",4711);" in meine Funktion einbinden. Ich verstehe das jetzt nicht.
Sprintf funktioniert wie printf, nur daß die Argumentliste formatiert, mit samt \0 in den String buffer kopiert wird. Führst du also einfach aus, wenn du eine Zahl als String brauchst, nämlich z.B anstelle des itoa(24545,buffer). Wenn die Ausgabefunktion ja schon funktioniert, würde ich die gar nicht ändern. Ich hab mich nur gewundert, daß lcd_WriteString als Argument unsigned char flash* hat -das kenne ich nämlich nicht- und buffer ganz normal unsigned char* ist. Wenn du so was wie unsigned char TestBuffer[] = "24545"; machst und dann deine Ausgabefunktion damit aufrufst dann klappt das wirklich? Wenn die Ausgabe immer noch nicht funktioniert, würde ich für Typengleichheit sorgen, sprich das 'flash' entfernen. Sofern das nicht notwendig ist; Wie gesagt ich verstehs nicht.
Nachtrag: Was mir noch einfällt was für dich praktisch sein könnte, wenn die Ausgabe funktioniert. Probier es erst mal wie oben hinzukriegen, wenn das problemlos klappt kannst du dir mit vsprintf ne printf-Funktion machen, die automatisch auf dem Display schreibt, so wie man das am PC mit printf kennt. Finde ich sehr praktisch. vsprint ist das Selbe wie sprintf, erwartet aber anstatt einer Argumentliste einen Zeiger auf eine. Du könntest dann also mit einer Funktion wie void LCD_prinf(const char* alist,...){ char buf[80]; va_list lst; va_start(lst,alist); vsprintf(buf,alist,lst); DeineFunktionDieEinenStringDruckenKann(buf); } dein ganzen Leben erleichtern, sprich immer LCD_printf benutzen wie du am PC printf nehmen würdest. Aber wie gesagt erst ma ans laufen kriegen. Hoffe es klappt!
...ist natürlich schon peinlich, wenn man unter falschem Namen (Alex) hier reinpostet und sich dann selber verrät (Steffen, Martin, usw.)... Wenn Du Dir keine Mühe gibst die Antworten, die Dir hier gegeben werden, zu verstehen und nachzuvollziehen, kannst Du Dir noch zig Namen ausdenken und die Fragen umformulieren. Nur schade um die Zeit der Antwortenden...
Mit der funktion sprintf von CodeVision AVR funktioniert es auch nicht. Auf dem Display erscheint "%d". Was mache ich da falsch. void main(void) { char buffer[10]; t6963cinit(); sprintf(buffer,"%d",4456); while (1) { if(PIND.6 == 1) { lcd_write_string_xy(2,8,buffer); } }; }
Ich schätze CodeVision ist ein Compiler, was falsch ist wird mir langsam mystisch. Versuche halt mal vorher int bla = 4456; Und dann sprintf(buffer,"%d",bla), weiß der geier vielleicht haben die die Funktion irgendwie krass implementiert. ansonsten: - das unsigned char flash* hast du mal rausgenommen? - ein unsigned char blub[]="muss ja ma funzen"; LCD_WriteString(blub); haste ausprobiert und das geht?
Ja das flash habe ich entfernt. Und den rest habe ich auch ausprobiert. So ein Mist funktioniert noch immer nicht.
Wenn ich dies ausprobiere wie hier sprintf(buffer,"%d",bla); dann erscheint immer %d auf dem Display.
Unter printf steht doch, daß der Formatstring eine Konstante im Flash sein muss - daher verwertet sprintf auch das %d nicht, sondern denkt, daß das als String gedruckt werden soll. Da ich nicht weiß, wie man bei dem Compiler so was anlegt, kann ich da auch keinen code zu angeben. Ich würde mal versuchen per direktive oder so eben diesen Formatstring ins Flash zu packen (rein geschätzt evtl const char flash FORMATSTRING[] = "%d" Vielleicht kann da einer helfen, der sich mit diesem Compiler auskennt. ) Dann versuchst du den sprintf-Aufruf mit sprintf(buffer,FORMATSTRING,4711). Vielleicht geht das.
Hmm...die Zahl 234 erscheint nicht auf dem Display. Ich weiß jetzt nicht was ich da noch tun kann. ---------------------------------------- void main(void) { unsigned char flash format_string[3]; unsigned char flash buffer[10]; unsigned int xy=234; t6963cinit(); format_string[3]="%2d"; sprintf(buffer,format_string,xy); while (1) { if(PIND.6 == 1) { lcd_write_string_xy(2,8,buffer[10]); } }; }
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.