Forum: Mikrocontroller und Digitale Elektronik Eine Funktion elegant mehrmals hintereinander aufrufen


von PIC N. (eigo) Benutzerseite


Lesenswert?

Hallo zusammen,
ich habe mal eine Frage an die C-Gurus: Gibt es eine Möglichkeit eine 
Funktion in C, welcher immer genau ein Char Wert übergeben wird, 
mehrmals hintereinander elegant in Kurzform aufzurufen?

*Hintergrund*: Ich habe eine Zeichenausgabe für ein GLCD geschrieben und 
ich möchte nicht für jedes Zeichen, dass ich ausgeben möchte, immer 
wieder die Funktion aufschreiben.

Also das man so etwas vereinfachen kann:
1
GLCD_Schreiben(H);
2
GLCD_Schreiben(a);
3
GLCD_Schreiben(l);
4
GLCD_Schreiben(l);
5
GLCD_Schreiben(o);

Ich hoffe es ist verständlich was ich meine..
Nabend

von holger (Gast)


Lesenswert?

void GlcdText(char *txt)
{
 while(*txt)
  {
   GLCD_Schreiben(*txt);
   txt++;
  }
}


GlcdText("Hallo");

von remote one (Gast)


Lesenswert?

mach dir eine zweite Funktion für ganze Zeichenketen:
1
void GLCD_Schreiben_string (char *s)
2
{
3
    while (*s)
4
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
5
        GLCD_Schreiben(*s);
6
        s++;
7
    }
8
}

Hier kannst du nun schreiben
1
GLCD_Schreiben_string ("Hallo");

von Falk B. (falk)


Lesenswert?

@  Nicolas M. (eigo) Benutzerseite

>ich habe mal eine Frage an die C-Gurus:

Bich ich zwar nicht, will aber trotzdem was sagen . . .

>Gibt es eine Möglichkeit eine
>Funktion in C, welcher immer genau ein Char Wert übergeben wird,
>mehrmals hintereinander elegant in Kurzform aufzurufen?

Nennt sich Schleife.

>*Hintergrund*: Ich habe eine Zeichenausgabe für ein GLCD geschrieben und
>ich möchte nicht für jedes Zeichen, dass ich ausgeben möchte, immer
>wieder die Funktion aufschreiben.

Hmm, ist dein C-Buch sooooo schlecht? Oder hast du am Ende gar keins? 
Hmmmm . . .

>GLCD_Schreiben(H);
>GLCD_Schreiben(a);
>GLCD_Schreiben(l);
>GLCD_Schreiben(l);
>GLCD_Schreiben(o);

>Ich hoffe es ist verständlich was ich meine..

Ja.

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

Schau dir mal die Funktionen lcd_string an und staune.

MfG
Falk

von Klaus W. (mfgkw)


Lesenswert?

Mindestens so elegant wie eine Schleife wäre Rekursion :--)

von PIC N. (eigo) Benutzerseite


Lesenswert?

Okay, das ging schnell =) Dankeschön!

von PIC N. (eigo) Benutzerseite


Lesenswert?

1
 void GLCD_Schreiben_string (char *s)
2
 {
3
     while (*s)
4
     {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
5
         GLCD_Schreiben(*s);
6
         s++;
7
     }
8
}

Ich habe die Variante probiert aber es scheint nicht zu funktionieren. 
Liegt es evtl. daran, dass ich mit dem T6963c arbeite und ich nicht 'A' 
schreibe sondern A, da ich zuvor das A definiert habe mit 0x21 (ist ja 
der interne Zeichensatz vom Controller)?

von Peter (Gast)


Lesenswert?

Nicolas M. schrieb:
> Ich habe die Variante probiert aber es scheint nicht zu funktionieren.
> Liegt es evtl. daran, dass ich mit dem T6963c arbeite und ich nicht 'A'
> schreibe sondern A, da ich zuvor das A definiert habe mit 0x21 (ist ja
> der interne Zeichensatz vom Controller)?

dann zeig doch mal den code den du geschrieben hast.

von holger (Gast)


Lesenswert?

>Liegt es evtl. daran, dass ich mit dem T6963c arbeite und ich nicht 'A'
>schreibe sondern A, da ich zuvor das A definiert habe mit 0x21 (ist ja
>der interne Zeichensatz vom Controller)?

Schreib den Text ganz normal.

void GlcdText(char *txt)
{
 while(*txt)
  {
   GLCD_Schreiben(*txt - 0x20);
   txt++;
  }
}


GlcdText("Hallo");

von Spess53 (Gast)


Lesenswert?

Hi

>da ich zuvor das A definiert habe mit 0x21 (ist ja
>der interne Zeichensatz vom Controller)?

Hättest du dir sparen können. Einfach an geeigneter Stelle 0x20 vom 
ASCII-Zeichen abziehen und du kannst normale Zeichen übergeben.

MfG Spess

von PIC N. (eigo) Benutzerseite


Lesenswert?

Okay. Ich habe den Code (oben) genommen:
1
void GLCD_Schreiben_String (char *S)
2
{
3
    while (*S)
4
    {   
5
        GLCD_Schreiben(*S);
6
        S++;
7
    }
8
}

Und habe jetzt versucht "Hallo" auszugeben:
1
  GLCD_Schreiben_String("Hallo");

Da ich den T6963c ansteuere, welche ja iwie nicht so richtig ASCII treu 
ist oder wie auch immer man das nennen mag. Habe ich z.B. die Buchstaben 
vorerst einmal definiert (nur zum Testen). Und habe die dann einzeln 
ausgegeben:
1
#define H 0x28
2
...

Und vorher hab ich sie eben so ausgegeben:
1
GLCD_Schreiben(H);
2
3
Und nicht so:
4
5
GLCD_Schreiben('H');

von PIC N. (eigo) Benutzerseite


Lesenswert?

Spess53 schrieb:

> Einfach an geeigneter Stelle 0x20 vom ASCII-Zeichen abziehen
> MfG Spess

Danke!

von PIC N. (eigo) Benutzerseite


Lesenswert?

Tut mir Leid aber irgendwas scheint noch schief zu laufen. Es wird beim 
String nichts dargestellt. Hier mein Code:

Unterprogramm für die Zeichenkette:
1
void GLCD_Zeichenkette (unsigned char *Text)
2
{
3
    while (*Text)
4
    {   
5
        GLCD_Schreiben(*Text);
6
        Text++;
7
    }
8
}

Unterprogramm für die Ausgabe:
1
void GLCD_Schreiben (unsigned char Zeichen)
2
{
3
  unsigned char ASCII;  
4
5
  // Wird eine 0 gesendet, dann direkt ausgeben
6
  // Zum Beispiel beim Display löschen.. 
7
  if(Zeichen==0)          
8
  {
9
    GLCD_Daten   (Zeichen);
10
    GLCD_Befehl  (0xC0);    
11
  }
12
13
  // Wenn ein ASCII Zeichen gesendet wird, dann
14
  // die Information um 32 verringern (T6963c)
15
  else
16
  {
17
    ASCII = Zeichen-0x20;
18
    GLCD_Daten   (ASCII);
19
    GLCD_Befehl  (0xC0);
20
  }
21
}

Und so klappt es nicht mit der Ausgabe:
1
  GLCD_Zeichenkette("Hallo");

So schon:
1
  GLCD_Schreiben('H');


PS: Compiler ist C18

von Karl H. (kbuchegg)


Lesenswert?

Nicolas M. schrieb:

> PS: Compiler ist C18

Kann es sein, dass das wieder so ein Müll ist von wegen: Zeichenketten 
werden ganz woanders gespeichert, nur nicht im RAM?

von holger (Gast)


Lesenswert?

>Kann es sein, dass das wieder so ein Müll ist von wegen: Zeichenketten
>werden ganz woanders gespeichert, nur nicht im RAM?

Könnte schon sein;)

Hier mal eine uralte Routine aus meinen PIC Zeiten (auch für T6963):

void LCDText(const rom char *txt)
{
 char ps;

 while(ps = *txt)
  {
   txt++;
   WriteData1(ps,0xC0);
  }
}

Das besondere ist wohl das "const rom".

von PIC N. (eigo) Benutzerseite


Lesenswert?

Funktioniert! Kann mir jemand erklären warum? ^^

von holger (Gast)


Lesenswert?

>Funktioniert! Kann mir jemand erklären warum? ^^

So langsam dämmert es wieder;)

Beispiel:

LCDWriteText("Hallo");

"Hallo" ist hier beim C18 ein konstanter Text im ROM (Flash).
Das dumme daran ist das man das dann so nicht mehr machen kann:

char buffer[egal];
LCDWriteText(buffer);

buffer liegt im RAM. Der Datentyp "const rom" stimmt dann nicht.
Es wird eine zweite Routine benötigt die dann Text aus dem RAM
anzeigen kann.

Beim AVR-GCC ist es genau umgekehrt:

LCDWriteText("Hallo");

"Hallo" liegt im RAM. Für Texte aus dem ROM (Flash) wird eine
andere Routine die Texte per pgm_read_byte() ausgiebt benötigt.

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.