给你个例子。
void high_isr(void);
void low_isr(void);
////////////////////////////////////////////////////////////////////////////
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm
GOTO high_isr
_endasm
}
#pragma code // allow the linker to locate the remaining code
////////////////////////////////////////////////////////////////////////////
#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
_asm
GOTO low_isr
_endasm
}
#pragma code
////////////////////////////////////////////////////////////////////////////
#pragma interrupt high_isr //, section(".tmpdata")
void high_isr (void)
{
}
//***************************************************************************************************
//ILLUMINATE: 低优先级中断服务程序
//FUNCTION: 根据中断标志转向相应的服务子程序;
// timer0();2ms定时,算法:(4MHz/4)×(T0PS2:T0PS0:分频比)×(256-TMR0L定时常数)
// INT1();进入调试模式
//ARGUMENTS: void
//RETURN: void
//***************************************************************************************************
#pragma interruptlow low_isr //, section(".tmpdata")
void low_isr (void)
{
unsigned char RData = 0x00;//存储读取
if(INTCONbits.TMR0IF)
{
INTCONbits.TMR0IF = 0; //Clear Timer0 overflow flag
TMR0L += 40; //10ms timer
jiffies += 10;
tenms++;
if(U2.RxTimeOut > 0)//读取串口缓冲区
{
U2.RxTimeOut -= 10;
if(0 == U2.RxTimeOut)
{
U2.RxBytes = U2.RxNo;
U2.RxNo = 0; //缓冲区指示标志指向0
U2.Rxed = 1; //
}
}
if(U1_RxTimeOut > 0)//读取串口缓冲区
{
U1_RxTimeOut -= 10;
if(0 == U1_RxTimeOut)
{
//U1_RxNo = 0; //缓冲区指示标志指向0
U1_Rxed = 1; //接收完成标志---开始处理数据标志
}
}
}
if(PIR3bits.RC2IF)//接受中断标志
{
//TSSendTime();
PIR3bits.RC2IF = 0;
Nop();
RData = RCREG2;
if((U2.RxNo==(unsigned int)0)&&(RData != (unsigned char)0xA5))
{
;
}
else if(U2.Rxed == (unsigned char)0)//第一位
{
U2JSQ ++;//串口2接收计数器
if((RData == (unsigned char)0)&&(U2JSQ == (unsigned char)1))
//去掉开头为0的数 从第一个不是零的数开始接收
{
U2JSQ = (unsigned char)0;
}
else
{
if(U2.RxNo < UART_RX_BUF_SIZE) //如果接受到的数据个数还小于接收缓冲区大小
{
U2.RxBuf[U2.RxNo] = RData; //将接收到的数据存入缓冲区
U2.RxNo ++; //指示标志前移
}
else
{
U2.RxNo = 0; //否则清空缓冲区
}
U2.RxTimeOut = U2_RX_TIME_OUT_MS;//100
}
}
}
if(PIR1bits.RCIF)//串口接受中断
{
if(U1_RxNo==0)//第一位“S”
{
if(RCREG=='S')
{
U1_RxBuf[U1_RxNo++] = RCREG;//读出数据
}
else{U1_RxNo=0; return;}//接受到S位置
}
else if(U1_RxNo==1)
{
if(RCREG=='N')
{
U1_RxBuf[U1_RxNo++] = RCREG;//读出数据
}
else{U1_RxNo=0; return;}
}
else if(U1_RxNo==2)
{
if(RCREG=='D')
{
U1_RxBuf[U1_RxNo++] = RCREG;//读出数据
}
else{U1_RxNo=0; return;}
}
else if(U1_RxNo==3)
{
if(RCREG=='Z')
{
U1_RxBuf[U1_RxNo++] = RCREG;//读出数据
}
else{U1_RxNo=0; return;}
}
else if(U1_RxNo>3)
{
if(U1_RxNo < 100)//如果接受到的数据个数还小于接收缓冲区大小
{
U1_RxBuf[U1_RxNo] = RCREG;//将接收到的数据存入缓冲区
U1_RxNo++;//指示标志前移
}
else
{
U1_RxNo = 0;//否则清空缓冲区
}
U1_RxTimeOut= U1_RX_TIME_OUT_MS;//接受时间
}
}
}
|