Forum: Mikrocontroller und Digitale Elektronik Probleme mit Display


von Alex (Gast)


Lesenswert?

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);
         }
      };
}

von Uwe B. (Gast)


Lesenswert?

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

von chrissy (Gast)


Lesenswert?

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?

von Steffen (Gast)


Lesenswert?

Hallo chrissy!

Vielen Dank!
Wie muss ich jetzt die Funktion "sprintf(buffer,"%d",4711);" in
meine Funktion einbinden. Ich verstehe das jetzt nicht.

von chrissy (Gast)


Lesenswert?

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.

von chrissy (Gast)


Lesenswert?

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!

von hebel23 (Gast)


Lesenswert?

...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...

von OldBug (Gast)


Lesenswert?

Das scheint in den letzten Tagen ganz schön in Mode geraten zu sein.

von Steffen (Gast)


Lesenswert?

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);
         }
      };
}

von chrissy (Gast)


Lesenswert?

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?

von Steffen (Gast)


Angehängte Dateien:

Lesenswert?

Ja das flash habe ich entfernt. Und den rest habe ich auch ausprobiert.
So ein Mist funktioniert noch immer nicht.

von Steffen (Gast)


Lesenswert?

Wenn ich dies ausprobiere wie hier sprintf(buffer,"%d",bla);
dann erscheint immer %d auf dem Display.

von chrissy (Gast)


Lesenswert?

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.

von Steffen (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.