#INT_XXXX
语法: #INT_AD //AD转化完结
#INT_ADOF //AD转化时刻溢出
#INT_BUSCOL //总线抵触
#INT_BUTTON //按钮
#INT_CCP1 //捕获或比较器1
#INT_CCP2 //捕获或比较器1
#INT_COMP //比较器勘探
#INT_EEPROM //EEPROM写完结
#INT_EXT //外部中止
#INT_EXT1 //外部中止1
#INT_EXT2 //外部中止2
#INT_I2C //I2C中止(只用于14000)
#INT_LCD //LCD举动
#INT_LOWVOLT //低电压勘探
#INT_PSP //并行端口PSP数据输入
#INT_RB //端口B在B4~B7的电平改变
#INT_RC //端口C在C4~C7的电平改变
#INT_RDA //RS232接纳到的数据有用, 使能UART接纳中止
#INT_RTCC //Timer0(RTCC)溢出
#INT_SSP //SPI口或I2C被激活
#INT_TBE //RS232发送缓冲区是空的
#INT_TIMER0 //Timer0(RTCC)溢出
#INT_TIMER1 //Timer1溢出
#INT_TIMER2 //Timer2溢出
#INT_TIMER3 //Timer3溢出
留意:大多数#INT_options在指定的芯片上是有用的. 在devices.h文件中,查看所给芯片的悉数列表.
意图:这些指令指定下面的函数是一个中止服务函数,中止函数可以没有任何参数.不是一切指令都可用于一切的元件,为了取得元件的有用中止,请参看devices.h文件或在PCW中,点击VIEW|Valid ints也可查得有哪些中止.
当中止被检测届时,编译器将发生代码跳到中止服务函数.它将发生代码来存储或从头存储机器状况,而且铲除中止标志位.为了避免标志位被铲除,请在#INT_XXXX后边增加NOCLEAR句子即可.
ENABLE_INTERRUPTS(INT_XXXX)在中止前初始化时要被激活,而且ENABLE_INTERRTUPTS(GLOBAL)也要使能中止,才可进入中止.
关键字HIGH和FAST可用于PCH编译中,用来标志高中止优先权.一个高优先权的中止可在另一中止正在进行的情况下发生中止.一个标有FAST中止在履行时,它不存储或从头存储任何寄存器,这就要你尽可能地存储你自己需求的存储器.标有HIGH的中止可以正常运用.在树立高优先权中止时,请参看#DEVICE以获取更多的信息.
比如:#int_ad
adc_handler(){
adc_active=FALSE;
}
#int_rtcc noclear
isr(){
…
}
比如文件:参看ex_sisr.c和ex_stwt.c以获取彻底的比如
文件: ex_stwt.c在前面现已介绍过了,这儿不再重述
文件: ex_sisr.c如下:
#if defined(__PCM__) //若运用了PCM编译器,则defined( __PCM__)回来值为1
#include <16F877.h> //包括16F877.h头文件
#fuses HS, NOWDT, NOPROTECT, NOLVP //HS:高速晶振/谐振器, NOWDT:不运用WDT
// NOPROTECT:程序存储器代码不维护
#use delay(clock=20000000) //使能内置函数的功用:delay_ms()和delay_us()
//#USE DELAY()必须在#use rs232()运用之前呈现.
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
//运用波特率为9600,
//发送脚为PIN_C6
//接纳脚为PIN_C7
//使能内置函数:GETC,PUTC和PRINTF, kbhit();
#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#endif //完毕if界说
#define BUFFER_SIZE 32 //用BUFFER_SIZE替代32
BYTE buffer[BUFFER_SIZE]; //声明字符型数组buffer[BUFFER_SIZE]
BYTE next_in = 0; //声明字符型变量next_in,并赋初值为0
BYTE next_out = 0; //声明字符型变量next_out,并赋初值为0
#int_rda //RS232接纳到的数据有用,指定下面的函数是一个中止函数
void serial_isr() {
int t; //声明整型变量t;
buffer[next_in]=getc(); //从RS232接口读1个字节,存到数阻buffer[]中
t=next_in; //将next_in赋给暂态变量t
next_in=(next_in+1) % BUFFER_SIZE; //%用来求余数
if(next_in==next_out)
next_in=t; // Buffer full !!
}
#define bkbhit (next_in!=next_out) //用bkbhit替代表达式(next_in!=next_out);
BYTE bgetc() {
BYTE c; //声明字符型变量c;
while(!bkbhit) ; //当next_in=next_out时,空操作,等候next_in不等于next_out
c=buffer[next_out];
next_out=(next_out+1) % BUFFER_SIZE; //%用来求余数
return(c); //函数回来暂态变量c的值,并退出该函数
}
void main() {
enable_interrupts(global); //使能总中止
enable_interrupts(int_rda); //使能UART在接纳到1个字节时,中止答应
printf(“\r\n\Running…\r\n”);
// The program will delay for 10 seconds and then display
// any data that came in during the 10 second delay
do {
delay_ms(10000); //延时10秒
printf(“\r\nBuffered data => “);
while(bkbhit) //当接纳缓冲区没有满,则履行下面句子
putc( bgetc() ); //将接纳到的数据再经过UART发送出去显现
} while (TRUE);
}
上面的比如首要介绍UART接纳中止的规划,将接纳到的数据及时送去显现.