Das von dir im OB gepostete wird so gut wie niemals eine fallende Flanke
erkennen.
Eine Flanke ist etwas das dynamisch auftritt, du weist nie wann. Also
muss es zumindest irgendeine Form von Schleife geben, die regelmässig am
Port-Pin nachsieht, ob sich was verändert hat. Um eine Veränderung zu
erkennen musst du aber den Zustand kennen, der vorhanden war, ehe du
erneut nachsiehst ob sich etwas verändert. Dazu muss dieser
'vorhergehende Zustand' irgendwo zwischengespeichert werden.
Daher muss eine Funktion, die erkennen kann ob sich der Zustand der Pins
im Vergleich zum nächsten mal nachsehen verändert hat, zumindest 2
Parameter haben: wo soll nachgesehen werden und was war der zuletzt
festgestellte Zustand. Jetzt wirst du aber erkennen, dass dieses 'wo
soll nachgesehen werden' gar nicht so simpel zu realisieren ist.
Am ehesten könnte man sich noch auf sowas einigen:
uint8_t isFlanke( uint8_t newValue, uint8_t mask, uint8_t* oldValue )
{
uint8_t retVal = FALSE;
if( ( newValue & mask ) != ( oldValue & mask ) )
retVal = TRUE;
oldValue &= ~mask;
oldValue |= ( newValue & mask );
return retVal;
}
#define KEY_1 ( 1 << PD0 )
#define KEY_2 ( 1 << PD1 )
#define KEY_3 ( 1 << PB5 )
int main()
{
uint8_t prevPinD, prevPinB;
...
prevPinD = PIND;
prevPinB = PINB;
while( 1 ) {
if( isFlanke( PIND, KEY_1, &prevPinD ) )
...
if( isFlanke( PIND, KEY_2, &prevPinD ) )
...
if( isFlanke( PINB, KEY_3, &prevPinB ) )
Aber selbst das ist ziemlicher Mist. Horrend ineffizient. Da ist es sehr
viel simpler die Flankenerkennung beim Aufrufer zu machen und auf eine
Funktion zu verzichten.