www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Display


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
         }
      };
}

Autor: Uwe B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: chrissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo chrissy!

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

Autor: chrissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chrissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: hebel23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das scheint in den letzten Tagen ganz schön in Mode geraten zu sein.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
         }
      };
}

Autor: chrissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Steffen (Gast)
Datum:
Angehängte Dateien:

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

Autor: Steffen (Gast)
Datum:

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

Autor: chrissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]);
         }
      };
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.