Forum: Mikrocontroller und Digitale Elektronik Eingänge auf LCD anzeigen


von Rudi K. (yast)


Lesenswert?

Abend aller seitz,

ich bin gerade dran datenbereiche aufzudröseln und diese auf ein LCD die 
biemen.

hier mal ein ausschnitt:

      int D_PC;    //Wertebereich Port C  (soll später von TWI gesendet 
werden
      D_PC = 0x02;  //Wertvorgabe zur Simulation

//Bereiche für Anzeigemerker PORT C
      int PCB0_M;    //Anzeigemerker Port C Bit0
        PCB0_M= 2;
      int PCB1_M;    //Anzeigemerker Port C Bit1
        PCB1_M= 3;
    PCB1_fix:

    if (!SP_1 O ST_RST) return; //Verlässt die Funktion O=&&
    if (!SP_3) goto AZ_2;     //Springt in eine Andere Anzeige

//Abfrage des einzelnen 
Bits-------------------------------------------------------------------- 
-----------

//Abfrage PortC Bit 0

    if (PCB0_M==0x01&D_PC)goto PCB0_fix;
    if(1==0x01&D_PC) goto PCB0_1;
    else goto PCB0_0;
         PCB0_1:
        lcd_setcursor(4,1);
        lcd_string("\x1A");
        PCB0_M = 1;
        goto PCB0_fix;
        PCB0_0:
        lcd_setcursor(4,1);
        lcd_string(" ");
        PCB0_M = 0;
        goto PCB0_fix;

        PCB0_fix:


//Abfrage Port C Bit 1

    if (PCB1_M==0x02&D_PC)goto PCB1_fix;
    if(2==0x02&D_PC) goto PCB1_1;
    else goto PCB1_0;
         PCB1_1:
        lcd_setcursor(6,1);
        lcd_string("\x1A");
        PCB1_M = 1;
        goto PCB1_fix;
        PCB1_0:
        lcd_setcursor(6,1);
        lcd_string(" ");
        PCB1_M = 0;
        goto PCB1_fix;


mit dem Bit 0 geht das, nur mit dem bit 1 nicht mehr. kann es sein das 
ich mit der ersten Maske mir mein D_PC (Daten_PortC, wird später über 
TWI gesendet) versaue und das deshalb nicht mehr mit dem Bit 1 geht?

weiter wollte ich noch fragen ob es eine schönere Möglichkeit gibt die 
Bits abzufragen. Meine ist ja wirklich viel schreib kram.....bei 3 Ports 
macht das keinen spass.

Bitte macht mich nicht zur Sau, bringe mit gerade "C" selbst bei, macht 
spass manchmal kommt man leider aber nicht allein weiter.



Gruß und danke schon mal.

von Karl H. (kbuchegg)


Lesenswert?

Wirf als erstes erst mal ALLE goto raus.
Sieh dir statt dessen an, was du alles zb mit Schleifen und dergleichen 
machen kannst. Du stehst dir mit der Verwendung (und der dazugehörigen 
Denkweise) von goto nur selbst im Weg.

Wenn du in den nächsten 2 Jahren einen goto verwendest, klopfst du dir 
erst mal selbst auf die Finger. Und zwar ordentlich, so dass es weh tut!

Das was du vorhast, kann man für 1 kompletten 8 Bit Port in 5 Zeilen 
C-Code strukturiert so hinschreiben, dass es jeder versteht. Aber dazu 
musst du erst mal deinen goto über Bord werfen und anfangen in Schleifen 
zu denken, anstelle von "mach das und wenn du fertig bist gehts dort und 
dort weiter".

von Rudi K. (yast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wirf als erstes erst mal ALLE goto raus.
> Sieh dir statt dessen an, was du alles zb mit Schleifen und dergleichen
> machen kannst. Du stehst dir mit der Verwendung (und der dazugehörigen
> Denkweise) von goto nur selbst im Weg.
>
> Wenn du in den nächsten 2 Jahren einen goto verwendest, klopfst du dir
> erst mal selbst auf die Finger. Und zwar ordentlich, so dass es weh tut!

wollte es zuerst mit einer schleife (while) machen, aber da bin ich 
durch "return" bzw "break" nicht mehr rausgekommen, keine ahnung warum.

Werde mich weiter dran probieren, ich weiß das es nicht schön ist. 
versuche auch das ich nicht weit "hüpfe" um nicht den überblick 
zuverlieren.

von Karl H. (kbuchegg)


Lesenswert?

Yannik Stümper schrieb:
> Karl Heinz Buchegger schrieb:
>> Wirf als erstes erst mal ALLE goto raus.
>> Sieh dir statt dessen an, was du alles zb mit Schleifen und dergleichen
>> machen kannst. Du stehst dir mit der Verwendung (und der dazugehörigen
>> Denkweise) von goto nur selbst im Weg.
>>
>> Wenn du in den nächsten 2 Jahren einen goto verwendest, klopfst du dir
>> erst mal selbst auf die Finger. Und zwar ordentlich, so dass es weh tut!
>
> wollte es zuerst mit einer schleife (while) machen, aber da bin ich
> durch "return" bzw "break" nicht mehr rausgekommen, keine ahnung warum.

Weil du viel zu kompliziert denkst.
1
funktion Drösle_auf( uint8_t v )
2
{
3
   für i = 0 bis 7 {
4
      if das Bit i ist gesetzt im Wert v
5
        mach ein 'x' aufs LCD
6
      else
7
        mach ein ' ' aufs LCD
8
   }
9
}

wo brauchst du da einen return oder einen break?
Du brauchst Grundlagen

von Rudi K. (yast)


Lesenswert?

habe noch andere sachen die ich anzeigen wollte, und diese stehen nicht 
in der funktion.

von Rudi K. (yast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Du brauchst Grundlagen

ja ich weiß, und ich bin dran ;-)

von Karl H. (kbuchegg)


Lesenswert?

Yannik Stümper schrieb:
> habe noch andere sachen die ich anzeigen wollte, und diese stehen nicht
> in der funktion.

Dann malst du die eben mit einer anderen Funktion hin. Sagt ja keiner, 
dass andere Funktionen nicht auch auf das LCD malen dürfen.
Aber diese Funktion hat die Aufgabe einen 8 Bit Wert in Form von x bzw. 
Leerzeichen, beginnend ab einer bestimmten LCD Position hinzumalen. Und 
genau das (und nur das) tut sie auch.

  lcd_setcursor( 4, 0 );  Drösle_auf( PINA );

und schon stehen alle 8 Bit von A am LCD, beginnend bei 4/0

  lcd_setcursor( 4, 1 );  Drösle_auf( PINB );

gleich darunter stehen dann alle 8 Bit von PINB

  lcd_setcursor( 4, 2 );  Drösle_auf( PINC );

gefolgt von den 8 Bit von PINC

3 Zeilen (6 Anweisungen) plus die Funktion und du hast 3 komplette Input 
Ports abgehandelt.

von Karl H. (kbuchegg)


Lesenswert?

Yannik Stümper schrieb:
> Karl Heinz Buchegger schrieb:
>> Du brauchst Grundlagen
>
> ja ich weiß, und ich bin dran ;-)

Entschuldige, aber so was
1
    if(1==0x01&D_PC) goto PCB0_1;
2
    else goto PCB0_0;
3
         PCB0_1:
4
        lcd_setcursor(4,1);
5
        lcd_string("\x1A");
6
        PCB0_M = 1;
7
        goto PCB0_fix;
8
        PCB0_0:
9
        lcd_setcursor(4,1);
10
        lcd_string(" ");
11
        PCB0_M = 0;
12
        goto PCB0_fix;
13
14
        PCB0_fix:

das schreit förmlich nach einem Einführungsbuch in die C-Programmierung!
Ich hab wirklich schon viel gesehen, aber so einen Unsinn hab ich noch 
nie gesehen. Es scheint fast, dass die einzigen beiden C-Schlüsselwörter 
die du kennst 'if' und 'goto' sind. Von abhängigen ANweisungen hast du 
noch nie etwas gehört, genausowenig wie von Blöcken. Das ist aber: 
C-Kurs, 2. Stunde (von 40 Unterrichtseinheiten).

von Rudi K. (yast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> lcd_setcursor( 4, 0 );  Drösle_auf( PINA );
>
> und schon stehen alle 8 Bit von A am LCD, beginnend bei 4/0
>
>   lcd_setcursor( 4, 1 );  Drösle_auf( PINB );
>
> gleich darunter stehen dann alle 8 Bit von PINB
>
>   lcd_setcursor( 4, 2 );  Drösle_auf( PINC );

leuchtet mir leider noch nicht ein

aber ich habe gelernt


if (PCB0_M != (0x01&D_PC))
    {
      if(0x01&D_PC)
      {
         PCB0_1:
        lcd_setcursor(4,1);
        lcd_string("\x1A");
        PCB0_M = 1;
      }
      else
      {
        PCB0_0:
        lcd_setcursor(4,1);
        lcd_string(" ");
        PCB0_M = 0;
      }
    }

von Rudi K. (yast)


Lesenswert?

könnte mir einer bitte nochmal die "Drösel_auf" funktion erklären???

von Johannes G. (gutenberg)


Lesenswert?

Hat glaub keinen Sinn Yannik. Mach mal Pause hiervon und arbeite ein C 
Buch für Anfänger von Anfang an durch. Das spart dir langfristig 
haufenweise Zeit und Frust, auch wenn du glaubst du brauchst dafür 
länger als ohne Buch.

von Yast (Gast)


Lesenswert?

Gerne welche bücher werden empfohlen?

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.