問:我應(yīng)該如何為一個(gè)PIC單片機(jī)編寫中斷服務(wù)程序?
答:僅僅是用一個(gè)'interrupt'關(guān)鍵詞聲明一個(gè)函數(shù)就好了。編譯器會把它放到合適的位置,并且會注意所有的寄存器保護(hù)和恢復(fù)。
#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;// 使用這個(gè)位來驅(qū)動一個(gè)繼電器
static unsigned int relay_timer; //繼電器驅(qū)動器的定時(shí)值
void
main(void)
{
RELAY = 1; // 確保繼電器在使能前是關(guān)閉的
TRISB = 0x3F; // Port B的第7、6位是輸出
T0CS = 0; // 定時(shí)器是以指令周期累加
T0IE = 1; // 使能TMR0溢出中斷
INTEDG = 0; // INT中斷是下降沿觸發(fā)
INTE = 1; // 使能INT中斷
GIE = 1; // 全局中斷使能
for(;;)
CLRWDT(); // 閑時(shí)喂一下狗
}
static void interrupt
isr(void) // 這里是中斷服務(wù)函數(shù)
// isr是函數(shù)名,并不重要,可任意命名
{
if(T0IF) { //如果是定時(shí)器0中斷
TMR0 -= 250; //重載定時(shí)器,每250uS中斷一次
T0IF = 0; //清中斷標(biāo)志位
if(relay_timer != 0) //繼電器定時(shí)到了嗎?
relay_timer--; //定時(shí)值減一
if(relay_timer == 0) //如果定時(shí)時(shí)間到了
RELAY = 1; //關(guān)閉繼電器
PORTB ^= 0x40;//翻轉(zhuǎn)一個(gè)端口來指示程序還是在正常工作的
}
if(INTF) { //有沒有一個(gè)按鍵按下?
RELAY = 0; //打開繼電器
relay_timer = 4000;//啟動定時(shí)器-4000個(gè)時(shí)間片=約1秒鐘
INTF = 0; //清中斷標(biāo)志位
}
}
(譯者注:建議在if條件中,同時(shí)檢查中斷標(biāo)志位和中斷使能位,如:if(T0IF && T0IE)。)
-
單片機(jī)
+關(guān)注
關(guān)注
6037文章
44558瀏覽量
635408 -
編譯器
+關(guān)注
關(guān)注
1文章
1634瀏覽量
49134
發(fā)布評論請先 登錄
相關(guān)推薦
評論