Lab4. การใช้งาน CNInterupt

#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)