#include #byte PORTB=0xF81 void init (void); //Δήλωση της ρουτίνας αρχικοποίησης void timer0_int(void); //Δήλωση της ρουτίνας διακοπών από τον timer0 int counter1=20; //Δήλωση μεταβλητής για μέτρηση των διακοπών. //Στη μεταβλητή αυτή δίνεται η αρχική τιμή 20. void main(){ init(); // Κλήση της ρουτίνας των αρχικών ρυθμίσεων while (TRUE){ // το κύριο πρόγραμμα δεν κάνει τίποτα. Εκτελεί έναν ατέρμονα βρόχο } } // Αρχή ρουτίνας εξυπηρέτησης της διακοπής // Οδηγία ότι η επόμενη ρουτίνα είναι η ρουτίνα εξυπηρέτησης της από τον Timer0 #INT_TIMER0 void timer0_int(void){ //αρχική τιμή του timer0 ώστε η επόμενη διακοπή να συμβεί σε χρόνο ίσο με 10 ms set_timer0(63661); counter1--; if (counter1==0){ counter1=20; PORTB=PORTB^0b11111111; // με την λογική πράξη του αποκλειστικού //ή (Exclusive OR) ανάμεσα στην PORTB και //την τιμή 11111111 αλλάζουμε την κατάσταση //όλων των bit της PORTB // Κάθε 20 διακοπές αλλάζουν όλα τα bit της πόρτας Β } } // Αρχή ρουτίνας αρχικών ρυθμίσεων void init (void) { // Ρύθμιση του προγραμματιζόμενου διαιρέτη στην τιμή 1/64 SETUP_TIMER_0(T0_INTERNAL | T0_DIV_64 ); // Αρχική τιμή του timer0 ώστε να συμβαίνουν διακοπές κάθε 10 ms set_timer0(63661); // Ενεργοποίηση της διακοπής από τον timer0 enable_interrupts(INT_TIMER0); // Ενεργοποίηση του γενικού διακόπτη των διακοπών enable_interrupts(GLOBAL); set_tris_b(0x00); PORTB=0x00; } // Interrupt κάθε (65536-63661)*[1/(Fclock/4)]*Prescaler = 9.994ms