PIC单片机CCS之C语言(#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发送出
PIC单片机CCSINT_XXX 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)