/* taste2.c */ /* Eine Taste wird entprellt. Mit jedem Tastendruck wird der Zustand des LED umgeschaltet */ /* Definition besonderer Bits mit sbit */ sbit led1 = 0x91; /* Port 1, Bit 1 */ bit led1zustand; /* Flag für Entprellen */ /* Verwendung von Flags statt char-Variablen spart Speicherplatz */ sbit taste1 = 0x90; /* Port 1, Bit 0 */ bit taste1ENTPR; /* entprellte Version von taste1 */ bit taste1UMSCH; /* erzeugt aus dem Tastsignal ein umgeschaltetes Signal */ enum TASTENSTATE {STABIL=0, INSTABIL=1} taste1STATE; #define TEILER10MS (55538U + 19U) 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 { /* zuerst wird der Anfangswert des Teilers eingestellt */ TH0 = TEILER10MS/256; TL0 = TEILER10MS & 0x00FF; zeit++; switch(taste1STATE) { case INSTABIL: taste1STATE = STABIL; if (taste1ENTPR!=taste1) /* Annahme */ { taste1ENTPR = ~taste1ENTPR; if (taste1ENTPR==1) /* es war eine 0->1-Flanke */ { taste1UMSCH=~taste1UMSCH; /* Umpolen */ } } break; case STABIL: if (taste1ENTPR!=taste1) { taste1STATE = INSTABIL; } break; } } main() { /* 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 */ led1zustand=0; led1=led1zustand; /* LED ist zunächst ausgeschaltet */ taste1ENTPR = taste1; /* entprelltes Signal = anliegendes Signal */ taste1UMSCH = 0; /* der Umschalter ist in Grundstellung: AUS */ taste1STATE = INSTABIL; for (;;) { led1zustand=taste1UMSCH; led1 = led1zustand; } }