/* Sende- und Empfangsroutinen mit Interrupt */ /* Pufferung für ein Zeichen */ #include #include volatile bit i_txempty=1; /* Keine Versendung aktiv, gesetzt vom Interruptprogramm */ volatile bit i_rxovfl=0; /* Zeichenüberlauf, gesetzt von der Interruptroutine */ volatile bit i_txrdy=0; /* Ein Zeichen soll gesendet werden, gesetzt vom Hauptprogramm */ volatile bit i_rxrdy=0; /* Ein Zeichen wurde empfangen, gesetzt von der Interruptroutine */ volatile char i_txchar; /* Zu sendendes Zeichen */ volatile char i_rxchar; /* empfangenes Zeichen */ void serial(void) interrupt 4 { if (TI) { if (i_txrdy) /* Ein Zeichen ist abzusenden */ { SBUF = i_txchar; i_txrdy = 0; i_txempty = 0; } else /* kein Zeichen abzusenden */ { i_txempty = 1; } TI=0; } if (RI) { if (i_rxrdy) /* Voriges Zeichen wurde nicht abgeholt */ { i_rxovfl = 1; } i_rxchar = SBUF; i_rxrdy = 1; RI=0; } } void serinit(void) { /* SCON */ SM0=0;SM1=1; /* Modus 1, 8 Bit, Timer 1 */ SM2=0; /* Multi-Controller aus */ REN=1; /* Empfänger einschalten */ TB8=0;RB8=0; /* kein 9-tes Bit */ TI=1; /* PCON */ PCON |= 0x80; /* Division durch 2 */ /* TMOD */ TMOD &= 0x0F; /* T1 auf Modus 2, Reload */ TMOD |= 0x20; TH1 = 0xf3; /* Reload-Wert für 2400 Baud */ /* TCON */ TR1 = 1; /* T1 einschalten */ ES = 1; /* Serieller Interrupt ein */ } char txs (void) /* SendeStatus */ { return i_txrdy; } char putchar (char c) /* Senden */ { if (i_txrdy) { /* das vorige Zeichen ist noch nicht abgesendet */ while (i_txrdy) ; /* Jetzt ist das vorvorige Zeichen abgesendet und das vorige wird gerade gesendet */ } i_txchar = c; i_txrdy = 1; if (i_txempty) TI=1; } char rxs (void) /* EmpfangsStatus */ { return i_rxrdy; } char _getkey(void) /* Empfang */ { if (i_rxovfl) { /* Fehlerbehandlung */ i_rxovfl = 0; /* Rücksetzen einer Overflow-Situation */ } while (i_rxrdy==0) { /* Diese Warteschleife wird nur aktiv, wenn man unvorsichtigerweise ein Zeichen empfangen will ohne Rückversicherung rxs(), dass auch eines ansteht */ } i_rxrdy = 0; return i_rxchar; } void main(void) { char txchar='a'; char rxchar=' '; serinit(); EA=1; ES=1; while (1) { /* Senden von Zeichen */ if (txs()==0) /* voriges Zeichen wurde schon abgeholt */ { putchar(txchar); txchar++; if (txchar=='z'+1) { printf ("12"); txchar='a'; } } /* Empfang von Zeichen */ if (rxs()) { rxchar = _getkey(); putchar(rxchar); } } }