少走彎路,PIC單片機(jī)中斷總結(jié)
PIC單片機(jī)有多個中斷源,16系列只有一個中斷入口,18系列有兩個中斷入口,不同編譯器下書寫格式又不大一樣。網(wǎng)上資源千篇一律,也不夠系統(tǒng),只是簡單的羅列程序,代碼生存的環(huán)境不一樣也少有說明。在此做個簡單的總結(jié),因為又走了彎路...
1.先說18系列(MCC18編譯器下):
MPLAB C18不自動把中斷服務(wù)程序放在中端向量處。通常將GOTO指令放在中斷向量處,從而把控制權(quán)轉(zhuǎn)交給相應(yīng)中斷服務(wù)程序。
void low_isr(void);
void high_isr(void);
*****************************低級中斷入口及服務(wù)子程序************************************/
#pragma code low_vector=0x18//低優(yōu)先級中斷入口,轉(zhuǎn)自21ic基礎(chǔ)知識
void interrupt_at_low_vector(void)
{
_asm GOTO low_isr _endasm
}
#pragma interrupt low_isr
#pragma code
void low_isr(void)
{
//低優(yōu)先級中斷服務(wù)函數(shù)寫在這里
}
*****************************高級中斷入口及服務(wù)子程序************************************/
#pragma code high_vecotr=0x08//高優(yōu)先級中斷入口
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
#pragma code
#pragma interrupt high_isr
void high_isr(void)
{
//高優(yōu)先級中斷服務(wù)函數(shù)寫在這里
}
2.再說18系列(PICC18編譯器下):
//void PIC18F_High_isr(void);
//void PIC18F_Low_isr(void);
*****************************低級中斷服務(wù)子程序************************************/
#pragma interrupt lowlow_priority PIC18F_Low_isr
void PIC18F_Low_isr (void)
{
//低優(yōu)先級中斷服務(wù)函數(shù)寫在這里
}
*****************************高級中斷服務(wù)子程序************************************/
#pragma interrupt PIC18F_High_isr
void PIC18F_High_isr (void)
{
//高優(yōu)先級中斷服務(wù)函數(shù)寫在這里
}
3.三說16系列(PICC編譯器下)(只有一個中斷入口,無所謂高了就):
void interrupt isr (void)
{
//中斷服務(wù)函數(shù)寫在這里
}
void init_interrupt()
{
GIE=0;
PEIE=1;
IPEN=1;
//TMR1IE=1;
//TMR1IF=0;
//TMR1IP=0;
//TMR1L=61;
//T1CON=0xC7;//set up timer0 - 8bit -prescaler
//TMR0IE=1;
//TMR0IF=0;
//TMR0IP=0;
//TMR0L=61;
//T0CON=0xC7;//set up timer0 - 8bit -prescaler 1:256
GIE=1;
}