//пример высокоприоритетного прерывания
#include<p18cxxx.h>
#pragma config OSC=RC
#pragma config WDT=OFF
#pragma config LVP=OFF
#pragma config BOR=OFF
#pragma config MCLRE=OFF
void MyHighInt(void); //Прототипы подпрограммы обслуживания
void MyLowInt(void); //прерываний
#pragma interrupt MyHighInt //Это высокоприоритетное прерывание
#pragma code high_vector=0x08 //Это вектор по адресу 0х08
void high_vector(void){
_asm GOTO MyHighInt _endasm
}
#pragma interrupt MyLowInt //Это низкоприоритетное прерывание
#pragma code low_vector=0x18 //Это вектор по адресу 0х18
void low_vector(void){
_asm GOTO MyLowInt _endasm
}
#pragma code //Этот оператор должен здесь присутствовать,иначе программа не будет корректно скомпилирована
void MyHighInt(void){
if(INTCONbits.INT0IF){ //это прерывание на INT0?
INTCONbits.INT0IF=0; //Да.Сбросим обязательно флаг
PORTBbits.RB7^=1; //xor с битом 7 единицы
}
}
void MyLowInt(void){
}
void main(void){
ADCON1=0x7f; //выключаем АЦП
TRISB=0b0000001; //объявляем RB0 входом
RCONbits.IPEN=0; //включено только высокоприоритетное прерывание
INTCON2bits.INTEDG0=0; //INT0 переключается по отрицательному перепаду сигнала
INTCONbits.INT0IE=1; //разрешение прерывания по INT0
INTCONbits.GIE=1; //глобальное разрешение прерывания
PORTB=0;
while(1){
}
}