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
Benutze die Code-Tags. Benutze immer Copy&Paste für Code! Schau Dir nochmal im C-Buch den * Operator an.
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
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.
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""
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 *.
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
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.
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.