#include <p30f2010.h> //เปิดใช้งานไลบรารี dspic30F2010
#include<ports.h> //เปิดใช้งานไลบรารี ports.h สำหรับการใช้งาน CN Interrupt
_FOSC(CSW_FSCM_OFF & XT); // โหมดการทำงาน แบบ XT คริสตอล 4 - 10 MHz ไม่มี PLL
_FWDT(WDT_OFF); //ปิดการทำงาน watchdog Timer
#define TRUE 1 //กำหนดค่าตัวแปรชื่อ TRUE เป็น 1
#define LED_TRIS TRISE //กำหนดค่าตัวแปรชื่อ LED_TRIS เป็น port E
#define LED_MOVE LATE //กำหนดค่าตัวแปรชื่อ LED_MOVE เป็น output port E
unsigned int dly = 50; //กำหนดค่าตัวแปรชื่อ dly = 50 เป็นจำนวนเต็มบวก 16 บิต
void delay_ms(unsigned int ms){ //ฟังก์ชัน delay_ms
unsigned int i;
for(; ms>0; ms--)
for(i=0; i<182; i++)
Nop();
}
void _ISR _CNInterrupt(void){ //ฟังก์ชัน CN Interrupt
if(_RB0 == 0) dly = 100; //ถ้า port B0 = 0 (กดสวิตซ์ 1), dly = 100
if(_RB1 == 0) dly = 300; //ถ้า port B1 = 0 (กดสวิตซ์ 2), dly = 300
if(_RC13 == 0) dly = 600; //ถ้า port C13 = 0 (กดสวิตซ์ 3), dly = 600
if(_RC14 == 0) dly = 1000; `//ถ้า port C14 = 0 (กดสวิตซ์ 4), dly = 1000
_CNIF = 0; //clear register CN interrupt เป็น 0
}
int main(void)
{
unsigned char led_m = 1; //กำหนดค่าตัวแปรชื่อ led_m = 1 เป็นตัวอักษร
ADPCFG = 0XFF; //ปิดการใช้งานโมดูล A to D
LED_TRIS = 0;
ConfigIntCN(CHANGE_INT_ON & CHANGE_INT_PRI_3 & 0XFF00000F); //กำหนดโมดูลค่าCNInterrupt ให้เช็ค ขอบขาขึ้น, ความสำคัญของ Interrupt อยู่ลำดับที่ 3
while(1)
{
LED_MOVE = led_m; // LED_MOVE = led_m (port E = 0x01 (00000001))
led_m = led_m << 1; //เลื่อนบิตไปทางซ้ายทีละ 1 ที่ port E (ไฟวิ่ง)
if(led_m == 0x20) led_m = 1; //ถ้า led_m = 0x20 (0100000), led_m = 00000001 (Reset)
delay_ms(dly); //delay ตามการเกิด Interrupt
}
return 0; //Reset ค่าเริ่มต้น
}
โปรแกรมนี้เป็นการใช้งาน CNInterrupt เพื่อขัดการทำงานของ โปรแกรมหลักคือ ไฟวิ่ง ที่พอร์ต E ถ้าเกิด Interrupt จะทำให้เวลาการ delay เปลี่ยนแปลง ตาม port CNInterrupt ที่กดปุ่ม (เกิด Interrupt)