/* taste3.c */ /* Entprellen mehrerer Tasten */ #define STABIL 0 #define INSTABIL 1 #define TASTEN 8 /* Definition besonderer Bits mit sbit */ sfr leds = 0xE8; /* Port 4 */ unsigned char ledzustand; sfr tasten = 0x90; /* Tasten auf Port 1 */ /* testen eines bestimmten Bit am Port der Tasten */ #define TESTBIT(x,y) ((x) & (1<<(y))?1:0) struct TASTE { char entpr:1; /* entprellte Version von taste1 */ char umsch:1; /* erzeugt aus dem Tastsignal ein umgeschaltetes Signal */ char state:1; } taste[TASTEN]; #define TEILER10MS (55536U + 21U) sfr TMOD = 0x89; sfr TH0 = 0x8C; sfr TL0 = 0x8A; sbit TR0 = 0x8C; sbit TF0 = 0x8D; sbit EAL = 0xAF; sbit ET0 = 0xA9; unsigned long zeit = 0; void IRS_timer0 (void) interrupt 1 { char i; /* zuerst wird der Anfangswert des Teilers eingestellt */ TH0 = TEILER10MS / 256; TL0 = TEILER10MS & 0x00FF; zeit++; for (i=0; i1-Flanke */ { taste[i].umsch=~taste[i].umsch; /* Umpolen */ } } break; case STABIL: if (taste[i].entpr!=TESTBIT(tasten,i)) { taste[i].state = INSTABIL; } break; } } } main() { char t; /* Initialisierung des Interrupt-Systems */ EAL = 1; /* Interrupts einschalten */ ET0 = 1; /* Interrupt von Timer 0 einschalten */ /* Initialisierung des Timers */ TMOD = 0x01; TH0 = TEILER10MS / 256; TL0 = TEILER10MS & 0x00FF; TR0 = 1; /* Timer wird gestartet */ ledzustand=0; leds=ledzustand; /* alle LEDs sind zunächst ausgeschaltet */ for (t=0; t