
 
 
 
//RB2(INT2)作为外中断
 #include <p18cxxx.h>/*18F系列单片机头文件*/
void PIC18F_High_isr(void);/*中断服务函数声明*/
 void PIC18F_Low_isr(void);
#pragma code high_vector_section=0x8
 /*高优先级中断响应时,会自动跳转到0x8处*/
 /*利用预处理器指令#pragma code来指定后面的程序在ROM中的起始地址为0x08,*/
 /*它是告诉连接器定位到特定的代码段,HIGH_INTERRUPT_VECTOR 是该特定代码段的段名*/
 void high_vector (void)
 {
     _asm goto PIC18F_High_isr _endasm/*通过一条跳转指令(汇编指令),跳转到中断服务函数(中断服务程序)处*/
 }
#pragma code low_vector_section=0x18
 /*低优先级中断响应时,会自动跳转到0x18处*/
 void low_vector (void)
 {
     _asm goto PIC18F_Low_isr _endasm
 }
#pragma code
 /*这条语句不是多余的,它是告诉连接器回到默认的代码段,*/
 /*如果不加的话,连接器就会傻傻地把后面的代码紧跟着上面的代码一直放下去。*/
 /*而18f4520.lkr文件里定义了向量区地址最多到0x29,所以如果没加此句通常会报错*/
/*---高优先级中断服务程序---*/
 #pragma interrupt PIC18F_High_isr
 /*利用预处理器指令#pragma interrupt来声明后面的函数是低优先级中断服务函数(中断服务程序),*/
 /*注意:关键字是interrupt,和低优先级中断时不同*/
 /*一旦指定后面的函数是低优先级中断服务程序,系统在进入该函数时,会自动保护现场,退出前自动恢复现场,*/
 /*同时中断服务程序执行完毕后,会自动返回断点,*/
 /*中断服务函数前必须加该语句*/
 void PIC18F_High_isr (void)
 {
 /*如果只有一个同级中断源被使能:*/
 /*1、执行中断服务语句部分*/
 /*2、清除中断标记*/
/*如果有多个同级中断源被使能:*/
 /*1、用查询法确定是哪个中断源提出了中断请求*/
 /*2、确定是哪个中断源提出了中断请求后,执行中断服务语句部分*/
 /*3、最后清除该中断源中断标志*/
 }
/*---低优先级中断服务程序---*/
 #pragma interruptlow PIC18F_Low_isr
 /*注意:关键字是interruptlow,和高优先级中断时不同*/
 void PIC18F_Low_isr (void)
 {
     PORTBbits.RB4=~PORTBbits.RB4;
     INTCON3bits.INT2IF=0;/*清除中断标志*/
 }
 void main(void)/*主函数*/
 {
     TRISBbits.TRISB4=0;//B4输出
     PORTBbits.RB4=1;   //B4输出高电平
    INTCONbits.GIE=0;/*关全局中断*/
     RCONbits.IPEN=1;/*使能中断优先级*/
     INTCON2bits.INTEDG2=0;/*设定外部中断触发边沿*/    
     INTCON3bits.INT2IP=0;/*设定中断优先级*/
     INTCON3bits.INT2IF=0;/*清除中断标志*/  
     INTCON3bits.INT2IE=1;/*使能中断*/    
     INTCONbits.GIEL=1;/*开低优先级全局中断*/
     INTCONbits.GIE=1;/*开全局中断*/
while(1) ;/*这里写主程序语句*/
}
     
    
     



















