zoukankan      html  css  js  c++  java
  • 5.2 SW1控制LED1亮灭(中断功能)

    中断:CPU收到中断请求后暂停正在执行的程序,而去执行中断服务函数中的程序,处理结束后,继续执行原来的程序。

    能够产生中断请求的中断源如下:

    CC2530中断设置步骤:使能端口组中断(IEN)——端口组中具体端口中断使能/禁止(PxIEN)——设置中断触发方式PICTL——使能系统总中断(EA)

    下文按此思路展开:

    1、使能端口组中断

    IEN2|=0x10;    //10000,设置IEN2的第4位,使能P1端口组中断

    2、使能具体端口中断

    P1IEN|=0x04;    //0100,P1_2口中断

    3、设置中断触发方式

    PICTL|=0x02;   //P_3到P1_1下降沿触发中断,SW1按下,电平由高变低

    4、使能总中断

    EA=1;    

    要想使用中断功能,必须使能中断总开关EA,并且使能各个中断源的自身控制开关IEN。

    具体寄存器详情如下:

    中断服务函数格式:以P1为例。函数体不能带有参数,也不能有返回值

    #pragma vector=P1INT_VECTOR
    __interrupt void P1_INT(void) //注意,interrupt前是两个_
    {
      /*处理程序*/
    }

    中断向量名如下:可查看ioCC2530.h头文件内容

    中断标志位:中断源很多,需要识别触发中断的中断源。

    P0、P1、P2端口组的中断标志位分别是P0IF、P1IF、P2IF。

    P1_2连接着SW1按键,按键按下P1IF值变为1,CPU就去执行P1的中断服务函数。标志位不能自动复位,需要手动清除该中断标志位。

      P1IF=0;  //清除P1端口组中断标志位

    具体是P1中哪一个针脚引起的中断,可以通过PxIFG寄存器的值来判断。当然也需要手动清除具体的针脚标志位(在中断服务函数中)。

      P1IFG&0x04     //判断P1_2的中断标志位是否为1

      P1IFG &=~ 0x04;   //清除P1_2的中断标志位

     清除过程,先小再大。即先关局部再关总闸。

    #include "ioCC2530.h"
    
    #define  LED1   P1_0
    
    /*==================端口初始化函数=====================*/
    void Init_Port()
    {
      //将P1_0设置为通用I/O端口功能
      P1SEL &= ~0x01;   
      //将P1_0的端口传输方式设置为输出
      P1DIR |= 0x01;   
      LED1 = 0;
    }
    /*===============外部中断初始化函数==================*/
    void Init_INTP()
    {
      IEN2 |= 0x10;         //端口1中断使能
      P1IEN |= 0x04;        //端口P1_2外部中断使能
      PICTL |= 0x02;        //端口P1_0到P1_3下降沿触发 
      EA = 1;               //使能总中断
    }
    /*================外部中断1服务函数====================*/
    #pragma vector = P1INT_VECTOR     //外部中断1的向量入口
    __interrupt void Int1_Sevice()
    {
      LED1 = ~LED1;
    /*先清除引脚标志位,再清除端口组标志位,否则会一直进入中断*/
      P1IFG &= ~ 0x04;        //清除P1_2引脚的标志位
      P1IF = 0;               //清除P1端口组的标志位
    }
    /*====================主函数==========================*/
    void main()
    {
      Init_Port();          //初始化通用I/O端口
      Init_INTP();          //初始化外部中断
    }
  • 相关阅读:
    大网管 www.bigit.com
    WinAPI: midiOutUnprepareHeader 清除由 midiOutPrepareHeader 完成的准备
    WinAPI: midiInGetNumDevs 获取 MIDI 输入设备的数目
    WinAPI: midiInUnprepareHeader 清除由 midiInPrepareHeader 完成的准备
    WinAPI: midiInPrepareHeader 为 MIDI 输入准备一个缓冲区
    转贴一组 Delphi 官方网站介绍 IDE 功能的动画
    WinAPI: midiOutPrepareHeader 为 MIDI输出准备一个缓冲区
    WinAPI: midiOutGetNumDevs 获取 MIDI 输出设备的数目
    WinAPI: midiInGetID 获取输入设备 ID
    动画演示 Delphi 2007 IDE 功能[4] 自定义界面
  • 原文地址:https://www.cnblogs.com/xixixing/p/10281634.html
Copyright © 2011-2022 走看看