การใช้งานอินเทอร์รัปต์จากภายนอก RB0/INT
     อินเทอร์รัปต์(Interrupt) คือ การขัดจังหวะการทำางานของซีพียูหรือโปรแกรมที่กำ
ลังทำงานอยู่ เพื่อมาทำงานในส่วนโปรแกรมบริการอินเทอร์รัปต์ที่กำหนดไว้ล่วงหน้า
แล้ว การใช้งานอินเทอร์รัปต์นั้นจะช่วยประหยัดเวลาการทำงานของโปรแกรมทีไม่ต้อง
คอยไปตรวจสอบเงื่อนไขใดเงื่อนไขหนึ่งตลอดเวลา โดยส่งหน้าที่การตรวจสอบนี้ให้
กับการบริการอินเทอร์รัปต์แทน สำหรับ CCS ได้จัดเตรียมฟังก์ชั่นที่ใช้ในการจัดการกับ อินเทอร์รัปต์ไว้แล้ว มีรูปแบบการใช้งานดังนี้

ฟังก์ชั่น enable_interrupts()
     เป็นฟังก์ชั่นที่ใช้กำหนดให้มีการอินเทอร์รัปต์เกิดขึ้น โดยมีรูปแบบการใช้งานดังนี้

     enable_interrupts(level)

โดยที่
     level          คือ ลำดับค่าคงที่ของการอินเทอร์รัปต์ที่กำหนดในดีไวน์ของไฟล์เฮด                       เดอร์(devices.h file) ของไมโครคอนโทรเลอร์ PIC แต่ละเบอร์
ตัวอย่าง
     enable_interrupts(GLOBAL) // เปิดใช้งานอินเทอร์รัปต์ทั้งหมด
     enable_interrupts(INT_RB0) // เปิดใช้งานอินเทอร์รัปต์จากภายนอก RB0/INT

ฟังก์ชั่น disable_interrupts()
     เป็นฟังก์ชั่นที่ใช้ในการยกเลิกการใช้งานอินเทอร์รัปต์ โดยมีรูปแบบการใช้งานดังนี้

     disable_interrupts(level)

โดยที่
     level           คือ ลำดับค่าคงที่ของการอินเทอร์รัปต์ที่กำหนดในดีไวน์ของไฟล์เฮด                        เดอร์(devices.h file) ของไมโครคอนโทรเลอร์ PIC แต่ละเบอร์
ตัวอย่าง
     disable_interrupts(GLOBAL) // ปิดใช้งานอินเทอร์รัปต์ทั้งหมด
     disable_interrupts(INT_RB0) // ปิดใช้งานอินเทอร์รัปต์จากภายนอก RB0/INT
|
ฟังก์ชั่น ext_int_edge()
     เป็นฟังก์ชั่นที่ใช้กำหนดให้อินเทอร์รัปจากภายนอก RB0/INT ตรวจจับสัญญาณที่ ขอบขาลงหรือขอบขาขึ้น โดยมีรูปแบบการใช้งานดังนี้

     ext_int_edge(L_TO_H) // ตรวจจับสัญญาณที่ขอบขาขึ้น(Rising Edge)
     ext_int_edge(H_TO_L) // ตรวจจับสัญญาณที่ขอบขาลง(Falling Edge)

ต้วอย่างการใช้งาน
     เป็นโปรแกรมไฟกระพริบติดดับสลับกัน เมื่อกดสวิตซ์ครั้งแรกไฟกระพริบจะหยุดกระ
พริบ และเมื่อกดสวิตซ์อีกครั้งไฟกระพริบก็จะกระพริบเหมือนเดิม โดยทำงานสลับกัน
แบบนี้ไปเรื่อยๆ

#include <16F877.h>
#fuses HS
#fuses NOLVP
#fuses NOWDT
#fuses NOPROTECT
#use delay(clock = 20000000)

int1 i=0;

// ในส่วนของฟั่งก์ชั่นอินเทอร์รัปต์
#INT_EXT
void Isr_ext(void)
{
     i =~ i; // กลับค่า i จาก 0 เป็น 1 และจาก 1 เป็น 0 แบบนี้ไปเรื่อยๆ
}

// ฟังก์ชั่นเมนโปรแกรม
void main (void)
{
     enable_interrupts(GLOBAL); // เปิดใช้งานอินเทอร์รัปต์ทั้งหมด
     enable_interrupts(INT_EXT); // เปิดใช้งานอินเทอร์รัปต์จากภายนอก RB0/INT
     ext_int_edge(H_TO_L); // ตรวจจับที่ขอบขาลง

     while(true)
     {
     if(i == 0)
          {
          output_high(pin_b7); // LED ติด
          delay_ms(1000); // หน่วงเวลา 1 วินาที
          output_low(pin_b7); // LED ดับ
          delay_ms(1000); // หน่วงเวลา 1 วินาที
          }
     }
}

CODE
กลับสู่หน้าหลัก