Forum: Mikrocontroller und Digitale Elektronik Problem mit C-Quellcode "Tastenmatrix einlesen"


von Rainer B. (guitero)


Lesenswert?

Hallo zusammen,

ich habe einige Probleme diesen Quellcode von Peter Dannegger zu 
verstehen:

Beitrag "Tastenmatrix auslesen über nur 2 Leitungen"

Am besten fange ich mal vorne an:
1
static inline
2
u16 key_no( u8 adcval )
3
{
4
  u16 num = 0x1000;      //4096 dezimal
5
  prog_uint8_t * thr = THRESHOLDS;  //hier werden alle Schwellwerte gespeichert
6
7
  while( adcval < pgm_read_byte( thr ))
8
  {
9
    thr++;
10
    num >>= 1;
11
  }
12
  return num & ~0x1000;
13
}

Hier wird die aktuelle Tastennummer ermittelt durch Übergabe des
eingelesenen ADC-Wertes. Innerhalb der while-Schleife wird dann der
ADC-Wert mit der Treshold-Liste verglichen. Soweit hab ich das
verstanden. Aber was kommt am Ende dabei raus? Was bedeutet
1
num >>= 1;
und was wird hier zurückgegeben?
1
return num & ~0x1000;

Diese Zeilen innerhalb der main-Schleife verstehe ich auch nicht.
Wozu werden die Bits hier nach links geschiftet und wie kommt man auf
"8", "4" oder "0".
1
  PORTA = 0xFF;
2
  DDRA = 0xFF;
3
  for(;;){
4
    if( get_key_press( 1<<8 ))    // "1"
5
      PORTA ^= 1<<0;      //  toggle
6
    if( get_key_press( 1<<4 ))    // "2"
7
      PORTA ^= 1<<1;
8
    if( get_key_press( 1<<0 ))    // "3"
9
      PORTA ^= 1<<2;

Das wären erstmal die wichtigsten Fragen. Wäre nett wenn mir jemand dazu 
helfen könnte.

Gruß,
guitero

von Rainer B. (guitero)


Lesenswert?

Keiner? Ist die Frage zu einfach, zu lang oder hab ich sie zum falschen 
Zeitpunkt gestellt?

von Uwe (de0508)


Lesenswert?

Hallo,
1
num >>= 1;

ist die Kurzschreibweise von
1
num = num >> 1;

d.h. also num = num/2;
1
return num & ~0x1000;

Hier muss man die einzelnen Terme expandieren und kann dann sehen was 
passert.
1
return num & 0xEFFF;

nun fragst Du dich bestimmt was das nun soll ?

Wenn
1
num = 0x1000;
 ist, dann ist der Rückgabewert "0".

Die Tasten '0' hat das Bitmuster 1<<0 und die Taste '1' das Bitmuster 
1<<1, usw.

So hat Peter das definiert, das alle Tasten Bitkodiert in einem Feld 
stehen.

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.