codier schalter

OP #2443887
Lesenswert?

hallo. ich bin noch in der Lernphase und hab folgendes problem.

ich möchte durch einen codier schalter mein lcd zählen lassen.


zum beispiel: codier schalter auf 1 => lcd zeigt 1
                                  2 => lcd zeigt 2
                                  3 => lcd zeigt 3
                                          ...

der codier schalter ist BCD "fähig"
code 0 1 2 3 4 5 6 7 8 9
 1     1   1   1   1   1
 2       1 1     1 1
 4           1 1 1 1
 8                   1 1

die 0 hab ich jetzt weggelassen

logischer text für euch:

if (PINC & (1<<PINC0))
{
lcd_setcursor( 0 , 1 );
lcd_string("1");
lcd_setcursor( 0 , 2 );
lcd_string("Eins");
_delay_ms(100);

(schreibe 1)

}

else if (PINC & (1<<PINC1))
{
schreibe 2
}

else if (PINC & (1<<PINC0) | (1<<PINC1))
{
schreibe 3
}

mein problem ist, wenn ich auf 3 bin schreibt es eine 1...
was mach ich falsch.?
Gast #2443894
Lesenswert?

Johannes Adler schrieb:
> der codier schalter ist BCD "fähig"

Was ist da dran "BCD fähig?" Für Zahlen zwischen 0 und 9 sind Binär- und 
BCD-Zahlen identisch.

Die erforderliche Kodierung für deine LCD-Anzeige hängt davon ab, wie 
die angesteuert werden muß. Vermutlich mußt du die Binärzahl in eine 
ASCII-Zeichencode umsetzen.
OP #2443902
Lesenswert?

ja sorry wegen bcd fähig...
wusste nicht recht, wie ich es beschreiben soll...


wieso muss ich das in ascii umschreiben.?

ich habe die 4 pins vom codier schalter einfach als eingang gesetzt...

die 1 und 2 zeigt es ja an, das geht schon, jedoch wenn ich 2 eingänge 
auf einmal verwenden will
(PINC & (1<<PC0) | (1<<PC1))

funktioniert es nicht.
Gast #2443908
Lesenswert?

Johannes Adler schrieb:
> ... jedoch wenn ich 2 eingänge auf einmal verwenden will
> (PINC & (1<<PC0) | (1<<PC1))

Vermutlich meinst du
(PINC & 0x0f) == ((1<<PC0) | (1<<PC1))

Die Lösung mit den vielen IFs ist allerdings sehr aufwendig.

Einfacher wäre
  lcd_string((PINC & 0x0f) | 0x30 );
oder so ähnlich, d.h. eine direkte algorithmische Umsetzung vom 
Binärcode in den zugehörigen ASCII-Code
OP #2443928
Lesenswert?

#include <avr/io.h>
#include "lcd-routines.h"
#include <util/delay.h>

int main(void)
{

  lcd_init();
  DDRC  = 0x00;

  while(1)
  {
   if (PINC & (1<<PC0))
    {


      lcd_setcursor( 0 , 1 );
      lcd_string("1");
      lcd_setcursor( 0 , 2 );
      lcd_string("Eins");
      _delay_ms(100);


    }
   else if (PINC & (1<<PC1))
    {

      lcd_setcursor( 0 , 1 );
      lcd_string("2");
      lcd_setcursor( 0 , 2 );
      lcd_string("Zwei");
      _delay_ms(100);
    }


  else if((PINC & (PC0|PC1)) == 1)
      {

      lcd_setcursor( 0 , 1 );
      lcd_string("3");
      lcd_setcursor( 0 , 2 );
      lcd_string("Drei");
      _delay_ms(100);

    }

  else
    {
      lcd_clear();
      lcd_setcursor( 0 , 1 );
      lcd_string("nix...");
      _delay_ms(100);
      lcd_clear();

    }
  }


  return 0;
}
Gast #2443940
Lesenswert?

Sorry, mit 'PINC & (PC0|PC1)'
dachte ich an (PINC & ((1<<PC0) | (1<<PC0))).

Wie sieht es wie folgt aus:
  switch (PINC & 0x03)
   case 1: ...
   case 2: ...
   case 3: ...
   default: ...

oder halt
  if ((PIN & 0x03) == 1)
  ...
  else if ((PIN & 0x03) == 2)
  ...
  else if ((PIN & 0x03) == 3)
  else
  ....
OP #2443947
Lesenswert?

hilfe schrieb:
> Sorry, mit 'PINC & (PC0|PC1)'
> dachte ich an (PINC & ((1<<PC0) | (1<<PC0))).
>
> Wie sieht es wie folgt aus:
>   switch (PINC & 0x03)
>    case 1: ...
>    case 2: ...
>    case 3: ...
>    default: ...
>
> oder halt
>   if ((PIN & 0x03) == 1)
>   ...
>   else if ((PIN & 0x03) == 2)
>   ...
>   else if ((PIN & 0x03) == 3)
>   else
>   ....



passiert immer noch nichts sinnvolles :(
Persönliche Seite #2443982
Lesenswert?

Tom schrieb:
> Einfacher wäre
>   lcd_string((PINC & 0x0f) | 0x30 );
> oder so ähnlich, d.h. eine direkte algorithmische Umsetzung vom
> Binärcode in den zugehörigen ASCII-Code

Johannes Adler schrieb:
> Tom schrieb:
>> lcd_string((PINC & 0x0f) | 0x30 );
>
> was schreibe ich dann in die if schleife.? bzw. else if
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
#include <util/delay.h>
4

5
int main(void)
6
{
7

8
  lcd_init();
9

10
  /* Warum der ganze Port? Für den Schalter reicht das erste Nibble. */
11
  DDRC  = 0x00;
12

13
  while(1)
14
  {
15
    lcd_setcursor( 0 , 1 );
16

17
    /* Vorraussetzung für folgende Zeile ist, das der
18
       Codierschalter an PC0 bis PC3 angeschlossen ist. */
19
      lcd_string((PINC & 0x0f) | 0x30 );
20

21
    /* Hier musst du dir noch was überlegen,
22
       mein Vorschlag wäre eine Array mit allen Strings. */
23
//  lcd_setcursor( 0 , 2 );
24
//  lcd_string("Eins");
25
    _delay_ms(100);
26
  }
27

28
  return 0;
29
}
Gast #2443989
Lesenswert?

Das einzge Problem am obigen Programm wäre die Beschaltung des 
Codierschalters: Werden die Digits gegen Vcc oder gegen GND geschaltet?
Das eine wäre eine Invertierung, die man mit einer "~" aus der Welt 
schaffen könnte...

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