Forum: Mikrocontroller und Digitale Elektronik Auftrilung eines Strings und Ausgabe


von Linda (Gast)


Lesenswert?

Guten mrogen

Ich erarbeite mir gerade eine Fuktion die einen String aufteilt und die 
einzelnen Charakter an ein Display das an Output_d liegt weiter gibt. 
Ich abrbeite mit dem CCS compiler. Das Problem ist mit "PROBLEMZONE" 
angeschrieben.
Anscheinend nimmt der Output_d die Information die ich ihm gebe, nicht 
so auf wie ich es mir vorstelle. Hat jemand einen ähnlichen Code oder 
eine Idee wie ich das Realisieren könnte.


void lcd_puts (char string[10])
{

    int i=0;                  // reading of a sign of the character 
string
    for ( i=0 ; i <= 7; i++ ) // loop for a 20 character string
    {
      output_d(string[i]); PROBLEMZONE!!!!!!!!!!!!!!!!!!
      RS_1;
      RW_0;
     // delay_us(50);
      E_1;
     // delay_us(50);
      E_0;
    }
}

von Falk (Gast)


Lesenswert?

@Linda

>Ich abrbeite mit dem CCS compiler. Das Problem ist mit "PROBLEMZONE"
>angeschrieben.

Wo Frauen mittlerweile ihre Problemzonen haben . . . ;-)

>Anscheinend nimmt der Output_d die Information die ich ihm gebe, nicht
>so auf wie ich es mir vorstelle. Hat jemand einen ähnlichen Code oder
>eine Idee wie ich das Realisieren könnte.

Ok, mal wieder ein wenig sachlich. Läuft dein LCD überhaut schon 
irgendwie? Oder ist das erst der Versuch, es zu laufen zu kriegen?
Prinzipiell sieht der Code erstmal gut aus, WENN die Funktion output_d() 
Daten auf den richtigen Port schreibt und dort auch das LCD dran hängt. 
Mal getestet?
Ebenso mit den Macros RS_1, RW_0, E1_ und E_0;
Machen die, was der Name verspricht?
Ist das LCD bereits initialisiert?

MfG
Falk

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nun, ohne zu wissen, was "output_d" für Argumente erwartet, wird das 
ganze Glaskugelbowling.
Was mag

   nimmt der Output_d die Information die ich ihm gebe, nicht
   so auf wie ich es mir vorstelle.

bedeuten? Wie stellst Du es Dir denn vor? Und was geschieht stattdessen?


Die Kommentare sind beide ziemlicher Quark, sie haben nichts mit dem 
Code zu tun, den sie zu kommentieren scheinen:

    int i=0;                  // reading of a sign of the character

Hä?

Auch scheint

    for ( i=0 ; i <= 7; i++ ) // loop for a 20 character string

nicht so ganz zum davorstehenden Code zu passen. Hier werden 
offensichtlich 8 Zeichen ausgegeben, nicht 20.
Auch ist der der Funktion als Kopie übergebene String 10 Zeichen lang 
...

Im übrigen:

Wenn Du nullterminierte C-Strings verwendest, dann kann Deine Funktion 
lcd_puts selbst die Länge des Strings bestimmen, indem sie Zeichen für 
Zeichen ausgibt, bis sie auf das den String beendende \0-Zeichen stößt.

Auch ist es sinnvoll, Strings nur als Pointer auf ihr erstes Zeichen und 
nicht als komplettes Array zu übergeben - das landet schließlich alles 
auf dem Stack, was sowohl Rechenzeit als auch Speicher verbrät.

Vorschlag:
1
void lcd_puts(char* string)
2
{
3
  char* p;
4
5
  p = string;
6
7
  while (*p)
8
  {
9
    output_d(*p);
10
    RS_1;
11
    RW_0;
12
    // delay_us(50);
13
    E_1;
14
    // delay_us(50);
15
    E_0;
16
    p++;
17
  }
18
}


Das setzt natürlich voraus, daß "output_d()" eine Funktion ist, die 
einen einzelnen char als Argument erwartet ...





von ARM-Fan (Gast)


Lesenswert?

Naja... ob das so gut aussieht, wenns doch viel einfacher geht.

void lcd_puts (char * string)
{
    RS_1;
    RW_0;

    while(*string)
    {
      output_d(*string++);
     // delay_us(50);
      E_1;
     // delay_us(50);
      E_0;
    }
}

So wirds gehen, wenn die Ausgabe einzelner Zeichen bereits funktioniert.

Aufrufen so:

lcd_puts("Hallo Welt");
oder

char * meinText = "Hallo Welt";
lcd_puts(meinText);




von ARM-Fan (Gast)


Lesenswert?

Ok, Rufus war schneller... ;-)

von Unbekannter (Gast)


Lesenswert?

>  // reading of a sign of the character string

Vielleicht solltest Du besser in Deutsch kommentieren...

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.