//пример высокоприоритетного прерывания
#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){
    }
}

INTCON2



 

НАЗАД                                                                                                                                         ДАЛЕЕ