Forum: Mikrocontroller und Digitale Elektronik eigene LCD_write Funktion


von Hans W. (coglione)


Lesenswert?

Hallo zusammen,

ich arbeite an einer Funktion um Text an ein LCD zu senden.
Dazu habe ich eine Funktion geschrieben welche über ein Arry Buchstabe
für Buchstabe liest und an den LCD senden. Klappt auch.

Nun aber zum Problem. Ich muss den Text in eine Variable schreiben und
diese dann in die Funktion einfügen. Gibt es eine Möglichkeit den Text
direkt in die Funktion zu schreiben?


//Das ist die Funktion

void lcd_write(char txt)
{
     while(*txt)
  {
  Port_D = *txt;
  clock_set();
  *txt++;
  }
}

//So muss ich sie einsetzen:

char txt1[] = {"test"};
lcd_write(txt1);

Kann ich irgend wie die Variable umgehen und direkt lcd_write("Hallo")
machen?
Zur Info, ich benutze keine Libs, mache alles selber. Dem Lerneffekt
zuliebe :)

Ich danke für eure Hilfe

von Peter D. (peda)


Lesenswert?

Benutze die Code-Tags.
Benutze immer Copy&Paste für Code!

Schau Dir nochmal im C-Buch den * Operator an.

von Uwe (de0508)


Lesenswert?

Hallo,

Hilfe findest Du im Forum:

http://www.mikrocontroller.net/articles/Erweiterte_LCD-Ansteuerung

Siehe bitte hier nach: 
//////////////////////////////////////////////////////////////////////// 
////////
// Ausgabe eines Strings an der aktuellen Cursorposition
// String liegt im Flash
void lcd_string_P( PGM_P data );

Dann gibt's noch die avr gcc Hilfe für PROGMEM:

http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

von Hans (Gast)


Lesenswert?

Hans Wiederkehr schrieb:
> //Das ist die Funktion
>
> void lcd_write(char txt)
> {
>      while(*txt)
>   {
>   Port_D = *txt;
>   clock_set();
>   *txt++;
>   }
> }

Die Funktion geht so nicht durch den Compiler. Es sei denn Du hast 
irgendwie char zu char* umdefiniert. Es muss heißen:
1
void lcd_write(char* txt)

> //So muss ich sie einsetzen:
>
> char txt1[] = {"test"};
> lcd_write(txt1);

Das ist so auch falsch. Die geschweiften Klammern gehören da nicht hin. 
So wäre es richtig:
1
char txt1[] = "test";
2
lcd_write(txt1);

> Kann ich irgend wie die Variable umgehen und direkt lcd_write("Hallo")
> machen?

Wenn die Funktion richtig ist, ja.

von Max H. (hartl192)


Lesenswert?

Hans Wiederkehr schrieb:
> Kann ich irgend wie die Variable umgehen und direkt lcd_write("Hallo")
> machen?
So etwas ähnliches hatten wir Gestern schon mal:
Beitrag "PIC XC8 "warning: (359) illegal conversion between pointer types""

von Peter D. (peda)


Lesenswert?

Max H. schrieb:
>> *txt++;
> So inkrementierst du nur den Inhalt der Adresse auf den der Pointer
> zeigt und nicht die Adresse

Nö.
Der Pointer wird incrementiert.
++ hat Vorrang vor *.

von Hans W. (coglione)


Lesenswert?

So ich hab jetzt ein bisschen umher gelesen und ausprobiert.
Es funktioniert.

Und zwar, muss ich bei der Funktion einfach
1
void lcd_write(Char ROM *txt)
 schreiben.
dann kann ich den text direkt in die Funktion setzten.
also:
1
lcd_write("Hallo")

Die Frage ist jetzt, warum muss ich da ein "char ROM" nehmen. Kennt sich 
da jemand aus. Ich würde gerne den Zusammenhang begreifen.

PS: ich benutze MBlab mit PIC

von Karl H. (kbuchegg)


Lesenswert?

Das ist doch dieser Mist, dass manche Compiler Konstanten automatisch 
ins Flash verlagern, was bei Harvard Architekturen ein ständiger 'Pain 
in the ass' ist, weil man dann eben nicht einfach Funktionen schreiben 
kann, die sowohl mit Stringliteralen als auch mit im Ram befindlichen 
Strings arbeiten können.
Na ja. wenigstens hat der Compiler ja offenbar den Versuch im 
Originalposting mit einer Fehlermeldung bedacht, die du hättest erwähnen 
und im Wortlaut veröffentlichen sollen. Dann hätte man dir schon vorher 
sagen können, dass es sich da um eine Eigenheit deines Compilers 
handelt, die nichts mit dem C-Standard zu tun hat.

von Max H. (hartl192)


Lesenswert?

Hans Wiederkehr schrieb:
> PS: ich benutze MBlab mit PIC
Welcher Compiler?

von Hans W. (coglione)


Lesenswert?

Der CCS C Compiler ist installiert. Version 4.074

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.