zoukankan      html  css  js  c++  java
  • 3-MSP430引脚中断

    为了写一篇文章做铺垫--提醒着自己,,,,,,

    这两天一直在寻找

    #pragma vector = PORT1_VECTOR
    __interrupt void P1_Interrupt()//P1口中断函数
    {
      
    }

    对于这两句话的解释,最起码让自己感觉能说服自己

    看了好多后自己的理解

    #pragma vector = PORT1_VECTOR
    通俗来讲这句话是告诉C编译器,你下面的函数是P1口的中断函数,P1口有中断发生时就进入下面这个函数
    __interrupt void P1_Interrupt()//P1口中断函数
    {
      
    }
    那期间到底发生了什么
    其实MSP430内部有一个中断向量表----中断向量表实际就是保存中断函数入口地址的存储单元空间
    假如说,下面是表的一段,,,,假如说,,,,,
    那么
    #pragma vector = PORT1_VECTOR
    就应该这样理解
    告诉编译器下面有一个P1口的中断服务函数,你应该把这个中断函数的地址放在

    __interrupt    //告诉编译器这是个中断服务函数


    再举一个例子,假设写一个串口接收中断函数

    #pragma vector=UART0RX_VECTOR

    __interrupt void Uart_Receive()
    {
      
    }
    其实
    #pragma vector=UART0RX_VECTOR
    后面的
    UART0RX_VECTOR就是在告诉编译器,下面的中断函数是串口接收中断服务函数,你要把它的服务函数地址放到保存串口接收中断服务函数的地址里

    对了后面
    PORT1_VECTOR  P1口中断
    PORT2_VECTOR  P2口中断

    UART0RX_VECTOR 串口接收中断
    UART0TX_VECTOR  串口发送中断
    TIMER0_A0_VECTOR 定时器A中断
    干脆盗一张图

    ,,,,,,,,,

    正事,

    对于引脚中断,学过51的都知道无非就是打开中断,,然后选择触发方式,然后写中断函数,然后再中断函数里清除中断标志(假如说.它不自动清除中断标志的话)

    P1.2口有一的下降沿P1.0口的引脚反转

    #include "io430.h"
    void main( void )
    {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;
      
      P1DIR |= BIT0;//p1.0输出模式
      
      P1IE |= BIT2;//使能p1.2中断
      P1IES |= BIT2;//下降沿触发
      P1IFG &= ~BIT2;//清除p1.2中断,,感觉可有可无,加上更显得代码很完善
      
      __enable_interrupt();
      while(1)
      {
        
      }
    }
    #pragma vector = PORT1_VECTOR
    __interrupt void P1_Interrupt()//P1口中断函数
    {
      if(P1IFG&BIT2) //P1.2口来中断啦
      {
        P1IFG &= ~BIT2;//清除P1.2引脚中断标志位
        P1OUT ^= BIT0;//P1.0引脚取反
      }
    }

    假如说我P1.2和P1.3都想用中断呢

    P1.2口有一的下降沿P1.0口的引脚反转

    P1.3口有一的下降沿P1.1口的引脚反转

    #include "io430.h"
    void main( void )
    {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;
      
      P1DIR |= BIT0;//p1.0输出模式
      P1DIR |= BIT1;//p1.1输出模式
      
      P1IE |= BIT2;//使能p1.2中断
      P1IES |= BIT2;//下降沿触发
      P1IFG &= ~BIT2;//清除p1.2中断
      
      P1IE |= BIT3;//使能p1.3中断
      P1IES |= BIT3;//下降沿触发
      P1IFG &= ~BIT3;//清除p1.3中断
      
      __enable_interrupt();
      while(1)
      {
        
      }
    }
    #pragma vector = PORT1_VECTOR
    __interrupt void P1_Interrupt()//P1口中断函数
    {
      if(P1IFG&BIT2)//如果P1.2有中断
      {
        P1IFG &= ~BIT2;//清除P1.2引脚中断标志位
        P1OUT ^= BIT0;//P1.0引脚取反
      }
      if(P1IFG&BIT3)//如果P1.3有中断
      {
        P1IFG &= ~BIT3;//清除P1.3引脚中断标志位
        P1OUT ^= BIT1;//P1.1引脚取反
      }
    }

     

    其实自己有点疑惑,,,为什么灯同时亮灭呢!同时触发,同时检测吗?,难道P1口是一个整体,那就太好了,同时用中断检测多路,不怕信号同时到来,,,,,,

  • 相关阅读:
    【原】更改ubuntu15.04的开机启动等待时间和启动项
    【转载】中文ubuntu里用户目录里的路径改成英文
    Ubuntu 14.04安装Chromium浏览器并添加Flash插件Pepper Flash Player
    如何直接从 Google Play 下载 APK 文件?
    Android Studio 1.1.0 最新版的安装和配置篇(Windows篇)【最新版】
    【更新到第10周】杭州电子科技大学计算机学院C#课程作业合集参考和下载
    华为P7拆机换屏图片教程
    网赚72变-桌面教程+引流技术分享
    Tomcat 8080爆破多线程
    微速摄影教学之系列视频+摄影技术
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/6064129.html
Copyright © 2011-2022 走看看