MSP430单片机中断嵌套跳出中断的方法:
如果是要求中断A->中断B这样的序列才会从中断B直接返回主程序的话,那必须要在中断A那里做个标志位表明发生了中断A,由中断B判断。中断B执行完,修改堆栈指针,指向中断A的堆栈地址(压栈后的),直接指令退出中断即可。
但要注意,若在中断A中开了总中断,则可以响应后来的中断B,B执行完再继续执行A。注意:进入中断B后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动打开。
扩展资料:
MSP430单片机的相关要求规定:
1、MSP430单片机称之为混合信号处理器,是由于其针对实际应用需求,将多个不同功能的模拟电路、数字电路模块和微处理器集成在一个芯片上,以提供“单片机”解决方案。该系列单片机多应用于需要电池供电的便携式仪器仪表中。
2、MSP430系列的部分产品具有Flash存储器,在系统设计、开发调试及实际应用上都表现出较明显的优点。TI公司推出具有Flash 型存储器及JTAG 边界扫描技术的廉价开发工具MSP-FET430X110,将国际上先进的JTAG技术和Flash在线编程技术引入MSP430。
3、MSP430系列单片机是一个16位的单片机,采用了精简指令集(RISC)结构,具有丰富的寻址方式、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令。这些特点保证了可编制出高效率的源程序。
参考资料来源:百度百科-MSP430单片机
不管你使能与否,中断标志位在接收到中断信号的时候都会置位,只是如果没有使能的话,是不会进入到对应中断向量的中断处理函数的。换句话说就是,你在P1.4的中断函数里处理了P1其他端口的中断。传一个例程给你看看/***************************************************
程序功能:用中断方式读取四个独立式按键的键值,同时将
按键的键值在数码管上显示出来
----------------------------------------------------
测试说明:按动K1~k4四个按键,观察数码管显示
***************************************************/
#include <msp430x14x.h>
#include "BoardConfig.h"
#define keyin(P1IN &0x0f)
//数码管7位段码:0--f
uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}
uchar KeyVal = 0 // 按键的键值
void delay(void)
/********************主函数********************/
void main( void )
{
WDTCTL = WDTPW + WDTHOLD //关闭看门狗
BoardConfig(0x88) //打开数码管,关闭流水灯和电平转换
P1IES = 0x0f // P1.0~P1.3选择下降沿中断,按键按下时为低电平
P1IE = 0x0f // 打开中断使能
P1DIR = BIT7 //设置P1.0~P.3为输入状态,P.7为输出
P1OUT = 0
P4DIR = 0xff
P5DIR = 0xff
P4OUT = 0x3f
P5OUT = 0xf7
_EINT() //打开全局中断控制位
while(1)
{
LPM1
P4OUT = scandata[KeyVal]
}
}
/*******************************************
函数名称:delay
功能:用于消抖的延时
参数:无
返回值 :无
********************************************/
void delay(void)
{
uint tmp
for(tmp = 12000tmp >0tmp--)
}
/*******************************************
函数名称:PORT1_ISR
功能:P1端口的中断服务函数
参数:无
返回值 :无
********************************************/
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
if(P1IFG &0x0f)
{
switch(P1IFG)
{
case 0x01:
if(keyin == 0x0e) //如果是第一个按键被按下
{
delay()
if(keyin == 0x0e)
{
while(keyin != 0x0f) //等待按键放开
KeyVal = 1
LPM1_EXIT
P1IFG = 0
return
}
}
case 0x02:
if(keyin == 0x0d) //如果是第二个按键被按下
{
delay()
if(keyin == 0x0d)
{
while(keyin != 0x0f) //等待按键放开
KeyVal = 2
LPM1_EXIT
P1IFG = 0
return
}
}
case 0x04:
if(keyin == 0x0b) //如果是第三个按键被按下
{
delay()
if(keyin == 0x0b)
{
while(keyin != 0x0f) //等待按键放开
KeyVal = 3
LPM1_EXIT
P1IFG = 0
return
}
}
case 0x08:
if(keyin == 0x07) //如果是第四个按键被按下
{
delay()
if(keyin == 0x07)
{
while(keyin != 0x0f) //等待按键放开
KeyVal = 4
LPM1_EXIT
P1IFG = 0
return
}
}
default:
while(keyin != 0x0f) //等待按键放开
//KeyVal = 0
//LPM1_EXIT
P1IFG = 0
return
}
}
}
//例程来自LT-1B的程序例子
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)