#include #include #include #include "initialisierung.h" uint8_t Prozessflag; uint8_t Anreiz; typedef unsigned char u8; typedef unsigned short u16; //#define RGND 10.0 // 10k to VCC //#define UB 5 // Spannung am Spanungsteilerregel //#define ADCWERT(n) UB/(1+(n/RGND)) // wurde in "initialisierung.h" //#define SCHWELLWERT(n) (u8)(((ADCVAL(n)+ADCVAL(n+9))/2)||((ADCVAL(n)+ADCVAL(n+23))/2)) // wurde in "initialisierung.h" prog_uint8_t SCHWELLWERTE[] = {SCHWELLWERT(33), SCHWELLWERT(10), SCHWELLWERT(1), 0}; // Ende der Tabelle static inline u8 taste_no( u8 adcwert ) { u16 num = 0x08; prog_uint8_t * thr = SCHWELLWERTE; while( adcwert < pgm_read_byte( &thr )){ thr++; num >>= 1; } return num & ~0x08; } u16 TastenStatus; // debounced key state: // bit = 1: key pressed u16 TastenDruck; // key press detect void TastenInterrupt(){ static u8 count0, count1; u8 i; TCNT0 = TCNT0init; //Startwert für Timer/Counter0 wird gesetzt i = TastenStatus ^ taste_no( ADCW ); // key changed ? count0 = ~(count0 & i ); // Zähler = 1 oder zurücksetzen count1 = count0 ^ (count1 & i); // Zähler = 2 oder zurücksetzen i &= count0 & count1; // Zähler = 3 TastenStatus ^= i; // Zähler = 4 TastenDruck |= TastenStatus & i; // wenn 0 zu 1 wird -> Tastendruck wird erkannt } u8 TastenErkennung( u8 TastenMaske ) { cli(); // Interrupt aus TastenMaske &= TastenDruck; // Tasten lesen TastenDruck ^= TastenMaske; // Tasten löschen sei(); //Interrupt ein return TastenMaske; } void TastenEntprellung(){ sei(); if( TastenErkennung( 1<<0 )){// Funktion an Taste 1 Anreiz=TasteEins; Prozessflag|=Benutzeroberflaeche; } if( TastenErkennung( 1<<1 )){ // Funktion an Taste 2 Anreiz=TasteZwei; Prozessflag|=Benutzeroberflaeche; } if( TastenErkennung( 1<<2 )){// Funktion an Taste 3 Anreiz=TasteDrei; Prozessflag|=Benutzeroberflaeche; } }