/* taste4.c */ /* Entprellen mehrerer Tasten */ #define TASTE0 0 #define TASTEn 1 #define TASTE1 2 /* Definition besonderer Bits mit sbit */ sbit leds = 0xE8; /* Port 4 */ sfr tasten = 0x90; /* testen eines bestimmten Bit am Port der Tasten */ #define TESTBIT(x,y) ((x) & (1<<(y))?1:0) #define TASTINP (tasten>>4) #define TASTOUT(x) (1<<(x)) /* Tastenmatrix für 16 Tasten an Port 1*/ /* P10..P13 sind Ausgänge P14...P17 sind Eingänge */ struct TASTEN { unsigned char entpr:4; /* entprellte Version von taste1 */ unsigned char state:2; unsigned char out:2 } tasten; #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 { char i; /* zuerst wird der Anfangswert des Teilers eingestellt */ TH0 = TEILER10MS/256; TL0 = TEILER10MS & 0x00FF; zeit++; tasten.out = switch(tasten.state) { case TASTE0: /* keine Taste */ switch (TESTINPUT) { case 0: /* keine Taste */ break; case 1: case 2: case 4: case 8: /* eine Taste */ tasten.state = TASTE1; break; default: tasten.state = TASTEn; break; } break; case TASTEn: /* mehrere Tasten */ switch (TESTINPUT) { case 0: /* keine Taste */ /* es war nur ein Spike */ break; case 1: case 2: case 4: case 8: /* eine Taste */ tasten.state = TASTE1; break; default: /* wir bleiben im unsicheren Zustand */ tasten.state = TASTEn; break; } case TASTE1: switch (TESTINPUT) { case 0: /* keine Taste */ /* es war nur ein Spike */ break; case 1: case 2: case 4: case 8: /* eine Taste */ tasten.state = TASTE1; break; default: /* wir bleiben im unsicheren Zustand */ tasten.state = TASTEn; break; } break; case INSTABIL: tasten.state = STABIL; if (tasten.entpr!=TESTBIT(tasten,i)) /* Annahme */ { taste[i].entpr = ~taste[i].entpr; if (taste[i].entpr==1) /* es war eine 0->1-Flanke */ { taste[i].umsch=~taste[i].umsch; /* Umpolen */ } } 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 */ led1=0; /* LED ist zunächst ausgeschaltet */ led1zustand=led1; tasten.entpr = TESTINPUT; /* entprelltes Signal = anliegendes Signal */ tasten.state = INSTABIL; for (;;) { if (led1zustand!=taste[0].umsch) { led1zustand=taste[0].umsch; led1 = led1zustand; } } }