/******************************************************************** * * * Name: led_blinken_hausaufgabe.c * * Datum: 15.09.05 * * Version: 0.5 * * Autor: Holger Ströher * * * * Aufgabe: Eine LED soll eine Sekunde lang leuchten, eine * * Sekunde lang nicht leuchten, das Blinken soll durch einen * * Taster an- und ausgeschaltet werden. * * * * Der gedrückte Taster legt 0 V an den Eingang. Eine 0 am Ausgang * * lässt die LED leuchten. * * * * Der jeweilige Zustand wird in einer Bitvariablen (einem Flag) * * gespeichert, welche ständig abgefragt wird. Tastendruck löst * * Interrupt aus, der die Bitvariable negiert (von 0 auf 1 oder * * von 1 auf 0). Steht in dem Flag eine 1, blinkt die LED, steht * * in dem Flag eine 0, bleibt die LED aus. * * * ********************************************************************/ #include #define SEKUNDE 184319 // Rechenweg siehe delay() #define ENTPRELLZEIT SEKUNDE/100 // Entprellzeit 10 ms // macht den Quelltext leichter lesbar #define AUS 1 #define AN 0 sbit sbLED = P2^0; // LED wird an Pin 0 von Port 2 angeschlossen sbit sbTaster = P1^3; // Taster wird an Pin 3 von Port 1 angeschlossen. // Drücken löst externen Interrupt 0 aus. bit btBlinken; // speichert den Zustand void delay( unsigned long ulCount ); void main( void ) { P2M1 = 0xFE; // P2^1 bidirektional IT0 = 1; // Interrupt 0 (int 0) ausgelöst bei fallender Flanke IE0 = 0; // int 0 zurücksetzen EX0 = 1; // int 0 freigeben EA = 1; // Interruptsperre aufheben sbLED = AUS; btBlinken = 0; while( 1 ) { if( btBlinken == 1 ) { sbLED = AN; delay( SEKUNDE ); sbLED = AUS; delay( SEKUNDE ); } } } // Definition von Verzögerungsfunktion delay() // Frequenz auf Board ist 7,3728 MHz => T = 135,63 ns. // 1 State braucht 2 Takte => 1 State entspricht 271,26 ns. // Den Zähler um eins erniedrigen dauert 20 States, // Einspringen in die Funktion 6 States, Ausspringen 2 States. void delay(unsigned long ulCount) { while( ulCount ) { ulCount--; } } // ISR Interrupt Service Routine void v_int0( void ) interrupt 0 using 1 { delay( ENTPRELLZEIT ); // warten bis Prellen vorbei ist if( sbTaster == AN ) // Taste noch gedrückt? { // btBlinken ändern btBlinken = ~btBlinken; } }