新闻中心

EEPW首页>嵌入式系统>设计应用> PIC单片机CCS之C语言(#INT_XXXX的应用)

PIC单片机CCS之C语言(#INT_XXXX的应用)

作者: 时间:2016-11-17 来源:网络 收藏
#INT_XXXX

语法: #INT_AD //AD转换完成

本文引用地址://m.amcfsurvey.com/article/201611/315398.htm

#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("rnRunning...rn");

// 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("rnBuffered data => ");

while(bkbhit) //当接收缓冲区没有满,则执行下面语句

putc( bgetc() ); //将接收到的数据再通过UART发送出去显示

} while (TRUE);

}

上面的例子主要介绍UART接收中断的设计,将接收到的数据及时送去显示.



评论


技术专区

关闭