Eine Funktion elegant mehrmals hintereinander aufrufen

OP Persönliche Seite #1961671
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
Gast #1961684
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");
#1961694
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
OP Persönliche Seite #1961725
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)?
Gast #1961731
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.
Gast #1961739
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");
Gast #1961742
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
OP Persönliche Seite #1961747
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');
OP Persönliche Seite #1961809
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
Gast #1961879
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".
Gast #1961907
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren