#include #byte PORTB=0xF81 //δηλώσεις συναρτήσεων void init (void); void timer0_int(void); //συνάρτηση που με χρήση Timer0 θα μετράει 100μs void mydelay_100us(int); int32 counter_time=0; //Δήλωση μεταβλητής για μέτρηση των διακοπών. //Στη μεταβλητή αυτή δίνεται η αρχική τιμή 0. //Θα αυξάνεται κατά 1 κάθε 100 μs int32 counter_time_old=0; //Μεταβλητή που χρησιμοποιείται στην αυτοσχέδια ρουτίνα καθυστέρησης. int32 aaa=1; // ακέραιη μεταβλητή που χρησιμοποιείται σαν όρισμα στην //αυτοσχέδια ρουτίνα καθυστέρησης // Κύριο πρόγραμμα void main(){ init(); // Κλήση της ρουτίνας των αρχικών ρυθμίσεων while (TRUE){ PORTB=PORTB^0b11111111; mydelay_100us(500); //καθυστέρηση 500Χ100μs=50 000 μs= 50 ms } } // Αρχή ρουτίνας εξυπηρέτησης της διακοπής #INT_TIMER0 void timer0_int(void) { set_timer0(64336); //αρχική τιμή του timer0 ώστε η επόμενη διακοπή να συμβεί σε // χρόνο ίσο με 100 μs counter_time++; // O μετρητής διακοπών αυξάνεται κατά 1 κάθε 100 μs // Χρησιμοποιείται για να μετράμε καθυστέρηση σε // πολλαπλάσια των 100 μs } // Αρχή ρουτίνας αρχικών ρυθμίσεων void init (void) { SETUP_TIMER_0(T0_INTERNAL | T0_DIV_1 ); // Ρύθμιση του προγραμματιζόμενου διαιρέτη(prescaler) στην τιμή 1 set_timer0(64336); // Αρχική τιμή του timer0 ώστε να συμβαίνουν διακοπές κάθε 100 μs enable_interrupts(INT_TIMER0); // Ενεργοποίηση της διακοπής από τον timer0 enable_interrupts(GLOBAL); // Ενεργοποίηση του γενικού διακόπτη των διακοπών set_tris_b(0x00); PORTB=0x00; } //Κώδικας ρουτίνας καθυστέρησης aaax100μs ------------------- void mydelay_100us(aaa){ counter_time_old=counter_time; // O counter_time_old παίρνει την τιμή του χρόνου // την στιγμή που μπαίνουμε στην ρουτίνα while(counter_time < counter_time_old+aaa) { } //Αναμονή έως ότου ο μετρητής χρόνου φτάσει // την τιμή του χρόνου τη στιγμή που μπαίνουμε στην ρουτίνα + aaa }