Forum: Mikrocontroller und Digitale Elektronik Verwendung der Standar-Output-Funktion printf für das LCD


von Maurin V. (Firma: Keine) (maurin)


Angehängte Dateien:

Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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() ....

von Maurin V. (Firma: Keine) (maurin)


Lesenswert?

Super sache so ist das ganze schon viel verständlicher vielen Dank ;)

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

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.

von Basti (Gast)


Lesenswert?

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 =)

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.