/************************************************************************/ /* */ /* Debouncing 8 Keys */ /* Sampling 4 Times */ /* With Repeat Function */ /* */ /* Author: Peter Dannegger */ /* danni@specs.de */ /* */ /************************************************************************/ #include #include typedef unsigned char u8; typedef signed short s16; #define XTAL 8e6 // 8MHz #define KEY_PIN PIND #define KEY0 0 #define LED_DDR DDRB #define LED_PORT PORTB #define LED0 0 u8 key_state; // debounced and inverted key state: // bit = 1: key pressed u8 key_press; // key press detect ISR (SIG_OVERFLOW0) // every 10ms { static u8 ct0, ct1; u8 i; TCNT0 = (u8)(s16)-(XTAL / 1024 * 10e-3 + 0.5); // preload for 10ms i = key_state ^ ~KEY_PIN; // key changed ? ct0 = ~( ct0 & i ); // reset or count ct0 ct1 = ct0 ^ (ct1 & i); // reset or count ct1 i &= ct0 & ct1; // count until roll over ? key_state ^= i; // then toggle debounced state key_press |= key_state & i; // 0->1: key press detect } u8 get_key_press( u8 key_mask ) { cli(); // read and clear atomic ! key_mask &= key_press; // read key(s) key_press ^= key_mask; // clear key(s) sei(); return key_mask; } int main( void ) { TCCR0 = 1<