//приоритеты множественных прерываний
#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);
#pragma interrupt MyHighInt
#pragma code high_vector=0x08
void high_vector(void){
_asm GOTO MyHighInt _endasm
}
#pragma code
void Int0(void){
INTCONbits.INT0IF=0;
PORTBbits.RB7^=1;
}
void Int1(void){
INTCON3bits.INT1IF=0;
PORTBbits.RB6^=1;
}
void Int2(void){
INTCON3bits.INT2IF=0;
PORTBbits.RB5^=1;
}
void MyHighInt(void){
if(INTCONbits.INT0IF){ //это прерывание на INT0?
Int0();
}
else if(INTCON3bits.INT1IF){ //это прерывание на INT1?
Int1();
}
else if(INTCON3bits.INT2IF){ //это прерывание на INT2?
Int2();
}
}
void main(void){
ADCON1=0x7f;
TRISB=0b0000111;
RCONbits.IPEN=1;
INTCON2bits.INTEDG0=0; //объявление INT0 переключаемым по отрицательному перепаду сигнала
INTCON2bits.INTEDG1=0; //объявление INT1 переключаемым по отрицательному перепаду сигнала
INTCON2bits.INTEDG2=0; //объявление INT2 переключаемым по отрицательному перепаду сигнала
INTCON3bits.INT1IP=1; //объявление INT1 высокоприоритетным
INTCON3bits.INT2IP=1; //объявление INT2 высокоприоритетным
INTCONbits.INT0IE=1; //разрешение прерывания от INT0
INTCON3bits.INT1IE=1; //разрешение прерывания от INT1
INTCON3bits.INT2IE=1; //разрешение прерывания от INT0
INTCONbits.GIE=1; //разрешение высокоприоритетных прерываний
PORTB=0;
while(1){
}
}