Lab3. การใช้งาน External Interrupt

#include <p30f2010.h>                    //เปิดใช้งานไลบรารี dspic30F2010                                                 
#include<ports.h>                              //เปิดใช้งานไลบรารี ports.h สำหรับการใช้งาน External Interrupt

_FOSC(CSW_FSCM_OFF & XT);      // โหมดการทำงาน แบบ XT คริสตอล 4 - 10 MHz ไม่มี PLL
_FWDT(WDT_OFF);                            //ปิดการทำงาน  watchdog Timer

#define TRUE                      1              //กำหนดค่าตัวแปรชื่อ TRUE เป็น 1
typedef unsigned char byte;

void delay_ms(unsigned int ms){                    //ฟังก์ชัน delay_ms
                unsigned int i;
               
                for(; ms>0; ms--)
                for(i=0; i<182; i++)
                Nop();
}
void _ISR _INT0Interrupt(void){                        //ฟังก์ชัน External Interrupt0
                LATB = 0x0F;                        //กำหนดพอร์ต B0 – B3 คือ 00001111 (0x0F) B7, B6,B5,B4,B3,2B1,B0
                delay_ms(200);                    //delay 200 ms.
                _INT0IF = 0;                          //clear register Interrupt0 เป็น 0
}
void _ISR _INT1Interrupt(void){                        //ฟังก์ชัน External Interrupt0
                LATB = 0xF0;                        //กำหนดพอร์ต B4 – B5 ON คือ 11110000 (0xF0) B7, B6,B5,B4,B3,2B1,B0 แต่ B6, B7 ไม่มี จึงใช้ E0, E1 แทน
                _LATE0 = 1;                          //port E0 ON
                _LATE1 = 1;                          //port E1 ON
                delay_ms(200);                    //delay 200 ms
                _INT1IF = 0;                          //clear register Interrupt1 เป็น 0
}
byte Rotate_Left(byte *x, byte i)        //ฟังก์ชั่นเลื่อนข้อมูลไปทางซ้าย
{
                for(; i>0; i--)
                *x = (*x<<1)|(*x>>7);          //เลื่อนข้อมูล *x ไปทางซ้ายทีละ 1 หรือ เลื่อนข้อมูล *x ไปทางขวาทีละ 7
                return(*x);                              //Reset ค่า *x เมื่อครบการทำงาน for loop
}                                                               //ถ้ากำหนดตัวแปร i = 1 ก็จะเลื่อนไปทีละ 1 หรือ I = 2 ก็จะเลื่อนไปทีละ 2

int main(void)
{
                unsigned int config;           //ประกาศตัวแปรชื่อ config แบบจำนวนเต็มบวก
                byte r1 = 1, dout = 0x01;    //ประกาศตัวแปรชื่อ r1= 1  แบบจำนวนเต็มบวก 8 bits และ dout = 1 แบบจำนวนเต็มบวก 8 bits
                ADPCFG = 0XFF;                                //ปิดการใช้งานโมดูล A to D
                TRISB = 0;                             //กำหนดพอร์ต B (B0 – B7) เป็น 0
                _TRISE0 = 0;                        //กำหนดพอร์ต E0 เป็น 0
                _TRISE1 = 0;                        //กำหนดพอร์ต E1 เป็น 0

                config = FALLING_EDGE_INT;        //กำหนดค่าตัวแปร config = FALLING_EDGE_INT
                ConfigINT0(EXT_INT_ENABLE & config);//กำหนดการทำงาน External Interrupt0 แบบเช็คขอบขาลง
                config = RISING_EDGE_INT;           //กำหนดค่าตัวแปร config = RISING_EDGE_INT
                ConfigINT1(EXT_INT_ENABLE & config); //กำหนดการทำงาน External Interrupt1 แบบเช็คขอบขาขึ้น

                while(1)                                
                {              
                if(dout < 0x40){//ถ้า dout < 0x40 (10000000) แน่นอนว่าน้อยกว่าเพราะว่า dout = 0x01 (00000001)
                LATE = 0;              //port E0 OFF
                LATB = dout;        // port B = dout
                }
                else{                       // ถ้า dout = 0x40
                LATB = 0;              //port B = 0
                LATE = dout >> 6;               // port E = dout >> 6 หรือ dout = 00000001
                }
                //ฟังก์ชัน if  else นี้เพื่อทำให้ค่า dout = 0x01 ตลอดเวลาเพื่อทำให้เกิดไฟวิงตลอดเวลา
                dout = Rotate_Left(&r1,1);                 //dout จะทำให้เกิด การเลื่อนบิตไปทางซ้าย (ไฟวิ่ง) ทีละ 1 B0-B6, E0, E1 ตามลำดับ
                delay_ms(500);    //delay 500 ms.
                }
return 0;                 //Reset ค่าเริ่มต้น
}
โปรแกรมนี้เป็นการใช้งาน Interrupt โดยที่โปรแกรมหลักคือ ไฟวิ่งที่ port B0 – B5 และ E0, E1 ตามลำดับ เมื่อกดสวิตซ์ หรือเกิด Interrpt0 port B0 – B3 ON ส่วน B4, B5, E0, E1 OFF และ Interrpt1 port B4, B5 ON ส่วน B0 – B3 OFF พูดง่ายๆ interrupt เพื่อขัดจังหวะการทำงานโปรแกรมหลัก