mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tastendruck am LCD darstellen


Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte gerne 6 Tasten bei gedrückt auf einem LCD als Symbol 
darstellen.
Dabei dachte ich mir das ganze mit einer switch Anweisung zu lösen:
      Summe = 0;

      if(!(KEY_PIN &(1<<KEY2)))                          // Wenn Taste PortD.2 auf LOW
        Summe |= KonfigPattern[nKonfig][0];
      if(!(KEY_PIN &(1<<KEY3)))                          // Wenn Taste PortD.3 auf LOW
        Summe |= KonfigPattern[nKonfig][1];
      if(!(KEY_PIN &(1<<KEY4)))                          // Wenn Taste PortD.4 auf LOW
        Summe |= KonfigPattern[nKonfig][2];
      if(!(KEY_PIN &(1<<KEY5)))                          // Wenn Taste PortD.5 auf LOW
        Summe |= KonfigPattern[nKonfig][3];
      if(!(KEY_PIN &(1<<KEY6)))                          // Wenn Taste PortD.6 auf LOW
        Summe |= KonfigPattern[nKonfig][4];
      if(!(KEY_PIN &(1<<KEY7)))                          // Wenn Taste PortD.7 auf LOW
        Summe |= KonfigPattern[nKonfig][5];

      OUT_PORT = Summe;

      switch (Summe)
      {
        case 1<<OUT0:
          lcd_gotoxy(10,0);
          lcd_puts("%");
          break;
        case 1<<OUT1:
          lcd_gotoxy(11,0);
          lcd_puts("%");
          break;
        case 1<<OUT2:
          lcd_gotoxy(12,0);
          lcd_puts("%");
          break;
        case 1<<OUT3:
          lcd_gotoxy(13,0);
          lcd_puts("%");
          break;
        case 1<<OUT4:
          lcd_gotoxy(14,0);
          lcd_puts("%");
          break;
        case 1<<OUT5:
          lcd_gotoxy(15,0);
          lcd_puts("%");
          break;
        default:
          lcd_gotoxy(10,0);
          lcd_puts("§§§§§§");
          break;
      }
Das Problem dabie ist nur das ich hier jeweils nur eine Taste anzeigen 
kann.
Wenn allerdings mehrere Tasten gleichzeitig gedrückt werden funktioniert 
das ganze natürlich schon nicht mehr.

Hat jemand eine Idee wie man das Lösen könnte?

Kann man vielleicht Case Anweisungen auch mit | verknüpfen?
Sonst müßte ich jede erdenkliche Tastenkombination "hineinpfuschen".

Autor: matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach doch die Abfragen der einzelnen Taster jeweils in eine IF-Abfrage.

Mal ein bisschen Text, welches den Code ausreichend erklären sollte:

anfang
gehe zu LCD-Pos.1
Taster1 gedrückt?
ja->gib Zeichen aus
nein->gib Leerzeichen aus

gehe zu LCD-Pos.2
...

gehe zu LCD-Pos.n
Taster n gedrückt?
ja...
nein...
Springe zu anfang

Gruss
Matthias

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der switch ist falsch, weil er immer nur 1 Bedingung auswerten kann. Du 
mußt aber jedes Bit einzeln abfragen, weil du ja auch jedes Bit einzeln 
darstellen willst:
 
        :
        :
        if(!(KEY_PIN &(1<<KEY7)))                          // Wenn Taste PortD.7 auf LOW
           Summe |= KonfigPattern[nKonfig][5];

        OUT_PORT = Summe;

        lcd_gotoxy(10,0);
        if(summe&(1<<OUT0)) lcd_puts("%");
        else                lcd_puts("§");
        lcd_gotoxy(11,0);
        if(summe&(1<<OUT1)) lcd_puts("%");
        else                lcd_puts("§");
        lcd_gotoxy(12,0);
        if(summe&(1<<OUT2)) lcd_puts("%");
        else                lcd_puts("§");
        :
        :

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char tasten;
tasten=KEY_PIN&&MASKE;

switch(tasten){
case
do something
break

case
do something
break


usw....

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> tasten=KEY_PIN&&MASKE;
Ein logisches UND? Meinst du das wirklich?

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke euch.

Könnte man vielleicht das Ergebnis der Summe dafür nutzen um die Ausgabe 
am LCD zu machen?
In etwa so das man sich dort jeweils nur die Zahlen rausholt. Also von 
1<<OUT0 den 0 und mit zb. 10 addiert und das als Displayposition des 
Zeichens her nimmt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> danke euch.
>
> Könnte man vielleicht das Ergebnis der Summe dafür nutzen um die Ausgabe
> am LCD zu machen?
> In etwa so das man sich dort jeweils nur die Zahlen rausholt. Also von
> 1<<OUT0 den 0 und mit zb. 10 addiert und das als Displayposition des
> Zeichens her nimmt.

Ja kann "man".
Und eigentlich solltest DU das auch schon längst können!

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Idee dazu hätte ich ja, nur wie hol ich mir aus der kompletten 
"Wurst" wenn alle Tasten gedrückt sind:

1<<OUT0 | 1<<OUT1 | 1<<OUT2 .... nur die Daten die ich benötige?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> Eine Idee dazu hätte ich ja, nur wie hol ich mir aus der kompletten
> "Wurst" wenn alle Tasten gedrückt sind:
>
> 1<<OUT0 | 1<<OUT1 | 1<<OUT2 .... nur die Daten die ich benötige?

Wie hast du dir denn aus dem Port-Pin das jeweils eine Bit herausgeholt, 
dass du dann mittels deiner Tabelle woanders ausgegeben hast?

Vielleicht solltest du nochmal dein Artikel über Bitmanipulationen 
studieren. Ein Bit aus einem Byte zu extrahieren ist eine 
Standardtechnik! Eine Standardtechnik, die du sogar in deinem Programm 
schon benutzt hast!

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Manfred W. schrieb:
>> Eine Idee dazu hätte ich ja, nur wie hol ich mir aus der kompletten
>> "Wurst" wenn alle Tasten gedrückt sind:
>>
>> 1<<OUT0 | 1<<OUT1 | 1<<OUT2 .... nur die Daten die ich benötige?
>
> Wie hast du dir denn aus dem Port-Pin das jeweils eine Bit herausgeholt,
> dass du dann mittels deiner Tabelle woanders ausgegeben hast?
>
Hiermit: if(!(KEY_PIN &(1<<KEY2)))

Das ganze dann auf den Ausgangsport ergibt ja im prinzip wieder das 
gleiche wie ich es mit der Switch-Anweisung gemacht habe.
Bzw. wie es Lothar oben vorgeschlagen hat.

Ich dachte das würde man vielleicht mit einer einzigen Anweisung 
hinbekommen.

lcd_gotoxy(Ausgabe,1);
lcd_puts("§");

bitte ein paar mehr Infos.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:

> Hiermit: if(!(KEY_PIN &(1<<KEY2)))
>

Und das allgemeine Schema dafür ist:

       Byte & ( 1 << Bitnummer )

'extrahiert' das Bit mit der Bitnummer 'Bitnummer' aus Byte. Der 
Ausdruck liefert 0, wenn das Bit 0 war und einen Wert ungleich 0, wenn 
es 1 war.

Dieses Schema hast du bei der Auswertung von KEY_PIN benutzt und 
natürlich kannst du auch dieses Schema bei der 'Zerlegung' bzw. 
'Auswertung' von Summe benutzen.

Programmieren findet nicht statt, indem man sich Unmengen an 
Codestückchen merkt, sondern indem man sich die allgemeinen Schemata 
merkt und erkennt wann welches Schema angebracht ist.

> Ich dachte das würde man vielleicht mit einer einzigen Anweisung
> hinbekommen.

Dann hätte man das wohl auch bei der Abfrage von KEY_PIN benutzt, bzw. 
es würde einen Hinweis im Artikel 'Bitmanipulation' geben.


> ergibt ja im prinzip wieder das
> gleiche wie ich es mit der Switch-Anweisung gemacht habe.

Das hingegen ist ein Irrtum. Ein großer Irrtum!

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, und wie geb ich das nun am LCD aus?
Wenn ich mein Bitmuster habe.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.