#include // AVR Standardbibliothek #include // AVR Interrupt-Bibilothek #include // Bibliothek für Dateityp uint_8t #ifndef F_CPU // Prüfen ob F_CPU nicht definiert #define F_CPU 8000000 // F_CPU in Hz definieren #warning kein F_CPU definiert // Warnung das F_CPU nicht definiert #endif // Ende von #ifndef // Definitionen der Eingänge #define Taster_DDR DDRD // Datenrichtungsregister Taster #define Taster_PORT PORTD // Port-Datenregister Taster #define Taster_PIN PIND // Zustandsregister Taster #define Taster1 0 // Registerbit Taster 1 #define Taster2 1 // Registerbit Taster 2 #define Taster3 2 // Registerbit Taster 3 #define Taster4 3 // Registerbit Taster 4 #define Taster5 4 // Registerbit Taster 5 #define Taster6 5 // Registerbit Taster 6 #define Taster7 6 // Registerbit Taster 7 #define Alle_Taster (1< Taster gedrückt volatile uint8_t taster_gedr; // Tastendruck registriert volatile uint8_t taster_rpt; // Taster lang oder wiederholt gedrückt // Entprellfunktion durch Interrupt ISR (TIMER0_OVF_vect) // Interrupt alle 10ms { static uint8_t ct0, ct1, rpt; // Deklaration der Funktionsregister uint8_t i; // Deklaration Hilfsregister TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5); // Zählerstand für 10ms i = taster_status ^ Taster_PIN; // Abfrage ob ein Tasterzustand verändert ct0 = ~ (ct0 & i); // Reset oder Erfassung von ct0 ct1 = ct0 ^ (ct1 & i); // Reset oder Erfassung von ct1 i &= ct0 & ct1; // Abfrage ob bis Überlauf gezählt taster_status ^= i; // Wechseln des entprellten Zustands taster_gedr |= taster_status & i; // 0->1: Tastendruck erkannt if ((taster_status & REPEAT_MASK) == 0) // Überprüfung Repeat-Funktion { rpt = REPEAT_START; // Startverzögerung } if (--rpt == 0) { rpt = REPEAT_NEXT; // Wiederholungsverzögerung taster_rpt |= taster_status & REPEAT_MASK; } } // Funktion 1: Überprüfung ob ein Taster gedrückt wurde. Jeder Tastendruck wird nur einmal gemeldet. Nach dem Abruf wird der Tasterzustand gelöscht! uint8_t get_taster_gedr (uint8_t taster_bit) { cli(); // Interrupts sperren taster_bit &= taster_gedr; // Lesen der Tasterzustände taster_gedr ^= taster_bit; // Löschen der Tasterzustände sei(); // Interrupts entsperren return taster_bit; } // Funktion 2: Überprüfung ob ein Taster lang genug gedrückt wurde, dass die Repeat-Funktion aktiviert wurde. Nach der Startverzögerung wird in den Abständen der Wiederholungsverzögerung der Tastzustand wiederholt gemeldet. Dies Simuliert das unterbrochene Drücken eines Tasters. uint8_t get_taster_rpt (uint8_t taster_bit) { cli(); // Interrupts sperren taster_bit &= taster_rpt; // Lesen der Tasterzustände taster_rpt ^= taster_bit; // Löschen der Tasterzustände sei(); // Interrupts entsperren return taster_bit; } // Funktion 3: Aktuellen Tastzustand melden. uint8_t get_taster_status (uint8_t taster_bit) { taster_bit &= taster_status; return taster_bit; } // Funktion 4: Tastzustand melden, wenn Taster kurz gedrückt wurde. uint8_t get_taster_kurz (uint8_t taster_bit) { cli(); // Interrupts sperren return get_taster_gedr (~taster_status & taster_bit); } // Funktion5: Tastzustand melden, wenn Taster lang gedrückt wurde. uint8_t get_taster_lang (uint8_t taster_bit) { return get_taster_gedr (get_taster_rpt(taster_bit)); } int main(void){ Steuer_DDR |= Alle_Steuer; // Konfiguration der Ausgänge Steuer_PORT &= ~Alle_Steuer; // Alle Ausgänge auf 0 setzten Steuer_PORT |= _BV(L1); // Lampe 1 ein // Konfiguration der Entprellfunktion Taster_DDR &= ~Alle_Taster; // Konfiguration der Eingänge Taster_PORT &= ~Alle_Taster; // Pull-Up-Widerstände deaktivieren Taster_PIN &= ~Alle_Taster; // Alle Tasterzustände auf 0 setzten TCCR0B = (1<