3-MSP430引脚中断

简介: 为了写一篇文章做铺垫--提醒着自己,,,,,,这两天一直在寻找#pragma vector = PORT1_VECTOR__interrupt void P1_Interrupt()//P1口中断函数{ }对于这两句话的解释,最起码让自己感觉能说服自己看了好多后自己的理解#p...

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

这两天一直在寻找

#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口是一个整体,那就太好了,同时用中断检测多路,不怕信号同时到来,,,,,,

 

目录
相关文章
|
算法 Unix 数据库
Python编程入门:从基础到实战
本篇文章将带你进入Python编程的奇妙世界。我们将从最基础的概念开始,逐步深入,最后通过一个实际的项目案例,让你真正体验到Python编程的乐趣和实用性。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你提供有价值的信息和知识。让我们一起探索Python的世界吧!
|
弹性计算 安全 Linux
操作系统智能助手OS Copilot体验评测
从了解到部署实践全方位带你体验操作系统智能助手OS Copilot的优与劣。
16985 8
操作系统智能助手OS Copilot体验评测
|
Linux 数据库
linux 全局搜索文件
在 Linux 系统中,全局搜索文件常用 `find`、`locate` 和 `grep` 命令。`find` 根据文件名、类型、大小、时间戳等条件搜索;`locate` 通过预构建的数据库快速查找文件;`grep` 在文件中搜索特定文本,常与 `find` 结合使用。选择合适的命令取决于具体需求。
1864 2
|
设计模式 分布式计算 算法
Python后端技术栈(三)--设计模式
Python后端技术栈(三)--设计模式
|
缓存 算法 Java
探索现代操作系统中的内存管理优化策略
【7月更文挑战第24天】本文深入探讨了现代操作系统中内存管理的高级技术与优化策略。通过分析内存分配、虚拟内存机制以及缓存策略,文章揭示了如何提升系统性能和资源利用率。针对操作系统开发者和高级用户,本文提供了实用的调优技巧和未来的发展方向。
|
算法
技术好文共享:算法之树表的查找
技术好文共享:算法之树表的查找
101 0
|
Java 应用服务中间件 Spring
javax.management.InstanceAlreadyExistsException:com.zaxxer.hikari:name=mallDataSource
javax.management.InstanceAlreadyExistsException:com.zaxxer.hikari:name=mallDataSource
373 0
javax.management.InstanceAlreadyExistsException:com.zaxxer.hikari:name=mallDataSource
|
Java 容器
ImageIcon和JLabel
ImageIcon和JLabel
|
开发工具 git
实际工作项目中搭配git托管代码的流程
实际工作项目中搭配git托管代码的流程
实际工作项目中搭配git托管代码的流程