#include #byte PORTB=0xF81 #byte PORTD=0xF83 // Δήλωση της ρουτίνας διακοπής από τους ακροδέκτες RB4, RB5, RB6, RB7 void rb(void) ; void init(void); //Global μεταβλητή για να κρατήσουμε την τελευταία τιμή της πόρτας Β int8 lastPORTB; void main(){ // ρουτίνα αρχικοποίησης, ρυθμίσεις εισόδων/εξόδων, διακοπών κλπ. init(); // το κύριο πρόγραμμα δεν κάνει τίποτα while(TRUE){;} } void init (void){ set_tris_d(0x00); // Καθορισμός της πόρτας D ως εξόδου enable_interrupts(GLOBAL); //Ενεργοποίηση του γενικού διακόπτη διακοπών enable_interrupts(INT_RB); //Ενεργοποίηση διακοπής από αλλαγή //κατάστασης στους ακροδέκτες // RB4, RB5, RB6, RB7 PORTD=0x00; lastPORTB=PORTB; } #INT_RB // Διακοπή που προκαλείται από αλλαγή // κατάστασης στους ακροδέκτες RB4, RB5, RB6, RB7 void rb (void){ // Αρχή της ρουτίνας εξυπηρέτησης της διακοπής rb int8 changes; // Ορισμός μεταβλητής των 8 bit. changes = lastPORTB ^ PORTB; // Γίνεται 1 το bit που άλλαξε //Εμφανίζεται σαν 1 στη μεταβλητή changes το bit που άλλαξε. // Μεταφέρεται η νέα τιμή της Πόρτας Β //Στην τιμή της μεταβλητής lastPORTB lastPORTB=PORTB; PORTD=changes; //καθυστέρηση για αποφυγή αναπηδήσεων delay_ms (100); }