Forum: Mikrocontroller und Digitale Elektronik Textausgabe lcd c


von 8051_lcd (Gast)


Lesenswert?

Hallo, ich habe eine library für ein text-lcd und soweit funktioniert da 
auch alles, also einzelne Zeichen schreiben, Shiften usw.

aus der Funktion werde ich allerdings nicht schlau:

void displ_print(char *text)reentrant;  // Zeichenkette an Display
                                           senden
                                        // Bsp. displ_print("test");

void displ_print(char *text)reentrant //Textumwandlung in Zeichenfeld
{
 data unsigned char k;
 displ_clear();
 for (k=0;k<8;k++)  { displ_putchar(text[k]); }
}

Ich dachte ich könnte nun einfach

displ_print("test1");

nutzen, habe auch genug Zeit danach gelassen, also daran sollte es auch 
nicht liegen.

Hat jemand noch eine Idee wie man die Funktion umschreiben müsste bzw. 
in welcher Form ich den Text an die Funktion übergeben muss?

Vielen Dank schonmal im Voraus!

von Krapao (Gast)


Lesenswert?

Wenn du "test1" (5 Zeichen) übergibst, hast du einen Pufferüberlauf in 
der Funktion, weil die in der for-Schleife immer 8 Zeichen (0..7) aus 
gibt!

Abhilfe wäre, einen 8 Zeichen breiten Zwischenpuffer zu verwenden. Die 
Füllzeichen kann man im Prinzip frei wählen nachdem man den Puffer 
gefüllt hat.
1
  {
2
    char puffer[8];
3
    memset(puffer, 0, 8);        // #include <string.h> erforderlich
4
    strncpy(puffer, "test1", 8); // #include <string.h> erforderlich
5
    // hier ggf. Nullbytes durch Füllzeichen ersetzen
6
    displ_print(puffer);
7
  }

Siehe auch String-Verarbeitung in C

von Krapao (Gast)


Lesenswert?

>  for (k=0;k<8;k++)  { displ_putchar(text[k]); }

Gewöhne dir diese Schreibweise nicht an. Da lassen sich die Breakpoints 
beim zeilenweise Debuggen schlecht setzen.

von Peter D. (peda)


Lesenswert?

1.
Das "reentrant" ist völliger Quatsch, eine Ausgabe kann nicht reentrant 
sein. Es kann immer nur eine Task zur Zeit eine Ausgabe machen.
Es sei denn, Du willst absichtlich, daß Texte mehrerer Tasks 
durcheinander angezeigt werden.

2.
Display löschen gibt häßliches Flackern.
Sinnvoller ist, den Text zu überschreiben (bei Bedarf mit Leerzeichen 
auffüllen).

3.
Was machst Du, wenn der Text ungleich 8 Zeichen hat?
Besser ist daher, einen Text einfach bis zum Endezeichen 0x00 
auszugeben.


Peter

von 8051_lcd (Gast)


Lesenswert?

Hallo vielen Dank für die Antworten.

das mit dem reentrant hat mich auch ein bisschen verwundert.
Habe jetz (hätte ich natürlich auch gleich machen können, sorry) im GCC 
tutorial geguckt und dort die Funktion genutzt und dort noch ein delay 
eingefügt.

Jetzt funktioniert es also!

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.