問:我應該如何為一個PIC單片機編寫中斷服務程序?
答:僅僅是用一個'interrupt'關鍵詞聲明一個函數就好了。編譯器會把它放到合適的位置,并且會注意所有的寄存器保護和恢復。
#include
/*
-
Interrupt demo for PIC; wait for button press on RB0/INT,
-
turn on a relay on another port bit for a period of time.
-
For simplicity here, literal constants are used, usually these
-
should be calculated with compile-time arithmetic.
*/
static bit RELAY @ (unsigned)&PORTB*8+7;// 使用這個位來驅動一個繼電器
static unsigned int relay_timer; //繼電器驅動器的定時值
void
main(void)
{
RELAY = 1; // 確保繼電器在使能前是關閉的
TRISB = 0x3F; // Port B的第7、6位是輸出
T0CS = 0; // 定時器是以指令周期累加
T0IE = 1; // 使能TMR0溢出中斷
INTEDG = 0; // INT中斷是下降沿觸發
INTE = 1; // 使能INT中斷
GIE = 1; // 全局中斷使能
for(;;)
CLRWDT(); // 閑時喂一下狗
}
static void interrupt
isr(void) // 這里是中斷服務函數
// isr是函數名,并不重要,可任意命名
{
if(T0IF) { //如果是定時器0中斷
TMR0 -= 250; //重載定時器,每250uS中斷一次
T0IF = 0; //清中斷標志位
if(relay_timer != 0) //繼電器定時到了嗎?
relay_timer--; //定時值減一
if(relay_timer == 0) //如果定時時間到了
RELAY = 1; //關閉繼電器
PORTB ^= 0x40;//翻轉一個端口來指示程序還是在正常工作的
}
if(INTF) { //有沒有一個按鍵按下?
RELAY = 0; //打開繼電器
relay_timer = 4000;//啟動定時器-4000個時間片=約1秒鐘
INTF = 0; //清中斷標志位
}
}
(譯者注:建議在if條件中,同時檢查中斷標志位和中斷使能位,如:if(T0IF && T0IE)。)
-
單片機
+關注
關注
6037文章
44558瀏覽量
635355 -
編譯器
+關注
關注
1文章
1634瀏覽量
49133
發布評論請先 登錄
相關推薦
評論