语法: ext_int_edge(source, edge)
EXT_INT_EDGE()是PIC CCS编译器中PIC单片机的专有函数。
语法: ext_int_edge(source, edge)
参数: source在PIC18XXX中是0, 1,或2的常数,除PIC18XXX之外source是一个0的常数,除此之外source是一个可选项;在通常情况下, source的默认值为0.
edge是H_TO_L或L_TO_H的常数. H_TO_L代表“high to low”, L_TO_H代表“low to high”.
返回值: 没有
功能: 决定什么时候产生外部中断. L_TO_H指定上升沿产生外部中断; H_TO_L指定下降沿产生外部中断;
有效性: 只适合PCM和PCH带有外部中断的器件.
要求: 必须包含devices.h的头文件,常数H_TO_L和L_TO_H位于devices.h的头文件中.
例子: ext_int_edge(2, L_TO_H); //设定PIC18外部中断2(EXT2)
ext_int_edge(H_TO_L); //由于source的默认值为0,所以设定的是外部中断0
例子文件: ex_wakeup.c
文件: ex_wakeup.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定义
// global flag to send processor into sleep mode
short sleep_mode; //声明位变量sleep_mode
// external interrupt when button pushed and released
#INT_EXT //指定下面的函数是int0的外部中断服务函数
void ext_isr() {
static short button_pressed=FALSE; //声明静态位变量button_pressed,并赋初值FALSE
if(!button_pressed) // if button action and was not pressed
{
button_pressed=TRUE; //若button_pressed为低电平,则将button_pressed赋值TRUE
sleep_mode=TRUE; // activate sleep设置睡眠软件标志位
printf("The processor is now sleeping.\r\n");
ext_int_edge(L_TO_H); // L_TO_H指定int0上升沿产生外部中断
}
else // if button action and was pressed
{
button_pressed=FALSE; //若button_pressed为高电平,则将button_pressed赋值FALSE
sleep_mode=FALSE; // reset sleep flag
ext_int_edge(H_TO_L); // H_TO_L指定下降沿产生外部中断
}
if(!input(PIN_B0)) // keep button action sychronized wth button flag
button_pressed=TRUE; //若PIN_B0脚为低电平,则将button_pressed赋值TRUE
delay_ms(100); // debounce button按键去抖
}
// main program that increments counter every second unless sleeping
void main() {
long counter; //声明长整型变量counter
sleep_mode=FALSE; // init sleep flag将sleep_mode置为FALSE
ext_int_edge(H_TO_L); // H_TO_L指定下降沿产生外部中断
enable_interrupts(INT_EXT); //外部中断允许位置1
enable_interrupts(GLOBAL); //开总中断允许
printf("\n\n");
counter=0; // reset the counter将counter置0
while(TRUE)
{
if(sleep_mode) // if sleep flag set若睡眠软件标志位为1,则执行睡眠
sleep(); // make processor sleep使CPU进入睡眠状态
printf("The count value is: %5ld \r\n",counter);
counter++; // display count value and increment
delay_ms(1000); // every second
}
}
上面的例子通过外部中断来唤醒CPU.