Problem mit C-Quellcode "Tastenmatrix einlesen"

OP #2282231
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
#2394729
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.

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