#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 เพื่อขัดจังหวะการทำงานโปรแกรมหลัก