当前位置: 首页 > article >正文

语法: 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,PUTCPRINTF, 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 flagsleep_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 countercounter置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.


http://www.kler.cn/a/597381.html

相关文章:

  • JVM常用垃圾回收器
  • 使用Trae 生成的React版的贪吃蛇
  • 算法刷题记录——LeetCode篇(7) [第601~700题](持续更新)
  • SpringSecurity——基于角色权限控制和资源权限控制
  • 【leetcode题解】贪心算法
  • C++ string的模拟实现
  • ospf动态路由
  • 带你从入门到精通——自然语言处理(十. BERT)
  • Rust语言学习
  • Java IO性能优化:字节流与缓冲流的对比与实战分析
  • Docker --shm-size参数含义
  • 09-ArcGIS For JavaScript -- 基于ThreeJS实现动态GLTF模型加载
  • 八股JVM
  • Ubuntu上查看GPU使用情况并释放内存
  • MyBatis StatementHandler是如何创建 Statement 对象的? 如何执行 SQL 语句?
  • Python JSON模块loads、load、dump、dumps详解
  • 第16届蓝桥杯单片机4T模拟赛三
  • Transaction rolled back because it has been marked as rollback-only问题解决
  • Ceph集群2025(Squid版)快速对接K8S cephFS文件存储
  • Web测试