Hey Leute Ich habe mir vorgenommen zum Zeitvertreib mir mal anzuschauen wie ich ein LCD ansteuern kann. Ich habe dies noch nie gemacht und in C programmierung bin ich auch nicht wirlich gut. Ich habe mir nun ein Buch mit Codebeispielen und Übungen etc. gekauft um mir das mal anzuschauen. Dabei bin ich auf etwas mir unerklärliches gestossen das mir Kopfschemerzen bereitet. Der Typ vom Buch verwendet einen PIC von Microchip und den Hi-Tech C compiler Der kann mit der printf funktion dinge auf sein LCD schreiben z.B printf("Hallo Welt") er selber verwendet dabei 2 funktionen Diese ist zum Anzeigen einzelner Zeichen. void lcd_putc(char ch) { switch (ch) { case '\r': case '\n': lcd_gotoxy(0,1); break; case '\f': lcd_clear(); break; default: LCD_RS=1; lcd_send(get_spec_char(ch),1); LCD_RS=0; } } Diese ist zum Anzeigen von Strings void lcd_puts(char *ptr) { while(*ptr!=0) lcd_putc(*ptr++); } Er beschreibt das ganze im Buch folgendermassen: Wie können wir die vom Compiler zur Verfügung gestellten Standard-Ausgabefunktionen wie printf für das LCD eingesetzt werden? Der Trick ist, das der Compiler für die Printf-Funktion eine vom Programmierer auscodierte putch()-Funktion verwendet. So kann sehr einfach der Standard-Output auf das LCD umgebogen werden. Die entsprechen Funktion wurde folgendermassen umgesetzt. #define STDOUT_LCD true void putch(unsigned char c) { #ifdef STDOUT_LCD lcd_putc(c); #endif #ifndef STDOUT_LCD #error please define the symbol for standard output function #endif } Kann mir jemand erklären wie der Typ das macht mit dem printf weil ich sehe da absolut nicht durch ich hab mal das printf file vom compiler(im Anhang) durchgesehen doch da sehe ich noch weniger durch da dies alles in Assembler geschrieben ist.
Maurin Vögeli schrieb: > Kann mir jemand erklären wie der Typ das macht mit dem printf es ist ganz einfach. printf bereitet sich die Ausgabe auf. Aber irgendwann muss ja auch printf mal die Zeichen dann tatsächlich auf den Weg bringen. Entweder UART oder I2C oder was auch immer, oder eben LCD. Nur macht das printf nicht selbst. printf nimmt einfach an, es gibt eine Funktion namens putch und über diese Funktion wickelt printf dann die Ausgabe seines aufbereiteten Textes ab. Genauso wie du ja auch hier
1 | void out_string(char *ptr) |
2 | {
|
3 | while(*ptr!=0) |
4 | putch(*ptr++); |
5 | }
|
eine Funktion (in Anlehnung an deine String-Ausgabefunktion) geschrieben hast, die einen String ausgibt. Wo gibt die Funktion aus? Das steht nicht fest. Die Funktion benutzt ganz einfach wieder die putch Funktion um 1 Zeichen auszugeben. Wo auch immer dann diese Funktion ihre Ausgabe macht, dort landet der String, indem out_string Zeichen für Zeichen durch diese Funktion durchschleust. Schreibst du also eine Funktion putch() die ein Zeichen über die UART verschickt, dann wird der String eben über die UART ausgegeben. Schreibst du eine Funktion putch() die auf ein LCD ausgibt, dann landet der String eben am LCD. Schreibst du eine Funktion, die ein Zeichen in Form von Pfeiftönen ausgibt, dann pfeift dir out_string den String vor, schreibst du ein putch() ....
Super sache so ist das ganze schon viel verständlicher vielen Dank ;)
Fast ;) printf() gehört zu der Familie fprintf( fp, ...), also streamed I/O. Mit fopen() wird ein Stream geöffnet der dann Ein- und Ausgabe über diesen fp (File Pointer) abwickelt. printf() verwendet den Standardausgabe-Stream, der ist per default immer geöffnet und zeigt auf die Console. Ich verwende AVR, im GNU C ist da wird das so gehandhabt, daß die Funktionen für den Stream registriert werden und man diesen Stream dann stdio zuordnet. Es hört sich etwas umständlich an, ist aber recht durchdacht. Die Ein- Ausgabefunktionen sind dann unabhängig von irgendwelchen Spezialitäten. Über den Stream wird dann die o.g. Funktion putch() zugeordnet.
Bin mir nicht sicher... aber fehlt da nicht noch ne wichtige Codezeile? Ich mach das selbe über die fwrite Methode in einem Projekt und hab mir ergoogelt, dass man die stderr Ausgabe so umbiegt: //Filestream für Ausgabe auf Display erstellen FILE lcd_str = FDEV_SETUP_STREAM(write_char, NULL, _FDEV_SETUP_WRITE); dann in der main... //Standarderror Ausgabe auf write_char Funktion umleiten stderr = &lcd_str; jedenfalls kann man so mit fwrite(stderr, .... arbeiten ... Möglichkeit 2 =)
Basti schrieb: > Bin mir nicht sicher... aber fehlt da nicht noch ne wichtige Codezeile? Vorsicht! Anderer Compiler!
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.