/* taste1.c */ /* Eine Taste wird entprellt (Port 1, Bit 0). Mit jedem Tastendruck wird der Zustand eines LED (Port 1, Bit 1 umgeschaltet */ /* Definition besonderer Bits mit sbit */ sbit taste1 = 0x90; /* Port 1, Bit 0 */ sbit led1 = 0x91; /* Port 1, Bit 1 */ /* Verwendung von Flags statt char-Variablen spart Speicherplatz */ bit taste1ENTPR; /* entprellte Version von taste1 */ bit taste1UMSCH; /* erzeugt aus dem Tastsignal ein umgeschaltetes Signal */ bit taste1START; /* Flag für Entprellen */ bit led1zustand; /* Flag für Entprellen */ #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++; if (taste1START) /* es gab bereits einen Polaritätswechsel */ { taste1START = 0; if (taste1ENTPR!=taste1) /* Annahme */ { taste1ENTPR = taste1; if (taste1ENTPR==1) /* es war eine 0->1-Flanke */ { taste1UMSCH=~taste1UMSCH; /* Umpolen */ } } else { /* die zuerst festgestellte Zustandsänderung wird als "Spike" verworfen */ } } else /* geprüft wird Polaritätswechsel */ { if (taste1ENTPR!=taste1) /* Umschaltevorgang wird angekündigt */ { taste1START=1; } } } 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 */ led1=0; /* LED ist zunächst ausgeschaltet */ led1zustand=led1; taste1ENTPR = taste1; /* entprelltes Signal = anliegendes Signal */ taste1UMSCH = 0; /* der Umschalter ist in Grundstellung: AUS */ taste1START = 0; /* keine Tasterberührung angekündigt */ for (;;) { if (led1zustand!=taste1UMSCH) { led1zustand = taste1UMSCH; led1 = led1zustand; } } }