MSP430关于按键中断的代码;;

#include<msp430f247.h>
void delay();
void lamp1();
void lamp2();
int main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P2DIR=0x00;
P2IE=0XFF;
P2IES=0XFF;
P2IFG=0X00;
_EINT();
}

void delay()
{
unsigned int i;
for(i=0;i<30000;i++);
}

void lamp1()
{
unsigned int i,lcd;
P1DIR=0XFF;
lcd=0xfe;
P1OUT=lcd;
while(1)
{
lcd<<=1;
lcd|=1;
P1OUT=lcd;
if(P1OUT==0xff)
{
lcd=0xfe;
P1OUT=lcd;
}
for(i=0;i<20000;i++);
}
}

void lamp2()
{
P1DIR=0XFF;
while(1)
{
P1OUT=0x55;
delay();
P1OUT=0xAA;
delay();
}
}

#pragma vector=PORT1_VECTOR
__interrupt void Port1()
{
unsigned temp1;
delay();
if((P2IN&0xff)!=0xff)
{
temp1 = P2IFG;
if(temp1==0x01)
{
lamp1();
}
}
P2IFG = 0X00;
}

#pragma vector=PORT2_VECTOR
__interrupt void Port2()
{
unsigned temp2;
delay();
if((P2IN&0xff)!=0xff)
{
temp2 = P2IFG;
if(temp2==0x02)
{
lamp2();
}
if(temp2==0x01)//..
{
lamp1();
}
}
P2IFG = 0X00;
}
#pragma vector=PORT1_VECTOR这个中断完全没有用啊。按键 按了都不响应。 还有第二个中断能响应,但是按了第一个键 再按第二个 就不会变了,一直执行第一个运行的流水灯的代码

第1个回答  推荐于2017-09-23
整个实验,是不是P2口为独立按键,,P1口外接8个LED灯,当按P2.0所对应按键实现流水灯,当按P2.1所对应按键实现交叉闪烁。#pragma vector=PORT1_VECTOR这个在程序中确实没用,可以删掉。为什么按了第一个键 再按第二个 就不会变了,这个我也没看出来,但是主程序里边最好不要让程序结束,增加一个循环,进入低功耗模式。

int main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P2DIR=0x00;
P2IE=0XFF;
P2IES=0XFF;
P2IFG=0X00;
_EINT();
while(1)
{LPM3();}
}

我看出问题了,问题出在你把调用lamp2();和lamp1();放在中断里的原因,因为这两个程序是循环程序,又在中断里边,MSP430是不能嵌套中断的,就是说,当一个中断程序在执行时,别的中断是不能执行的,直到执行中断结束,你可以设置一个全局变量LED_state,为1就执行lamp1();为2就执行lamp2();程序我做了一下调整,因为我的按键和LED连接和你的相反,而且键盘是4*4矩阵,的,所以设置有些不同。
#include<msp430x14x.h>
void delay();
void lamp1();
void lamp2();
unsigned char LED_State = 0;
unsigned int i,lcd;
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P1DIR = 0xf0;
P1IE = 0X0f;
P1IES = 0X0f;
P1IFG = 0X00;
P1OUT &= ~0Xf0;
P2DIR=0XFF;
P2OUT=0x00;
lcd=0xfe;
_EINT();
while(1)
{
if(LED_State == 1)
lamp1();
else if (LED_State == 2)
lamp2();
else
{
P2OUT=0x00;
_NOP();
}

}
}

void delay()
{
unsigned int i;
for(i=0;i<30000;i++);
}

void lamp1()
{
lcd<<=1;
lcd|=1;
P2OUT=lcd;
if(P2OUT==0xff)
{
lcd=0xfe;
P2OUT=lcd;
}
for(i=0;i<20000;i++);

}

void lamp2()
{

P2OUT=0x55;
delay();
P2OUT=0xAA;
delay();

}

#pragma vector=PORT1_VECTOR
__interrupt void Port1()
{
unsigned temp1;
delay();
if((P1IN&0x0f)!=0x0f)
{
temp1 = P1IFG;
if(temp1==0x02)
{
LED_State = 2;
}
else if(temp1==0x01)//..
{
LED_State = 1;
}
else
{
LED_State = 0;
}
}
P1IFG = 0x00;
}本回答被提问者采纳

msp430g2553怎么中断中带中断
P1DIR|=BIT0+BIT6;P1DIR&=~BIT3;P1REN|=BIT3;P1IES|=BIT3;\/\/选择下降沿触发 P1IE|=BIT3;P1OUT&=~BIT0;P1OUT|=BIT6;} void main(){ WDTCTL = WDTPW + WDTHOLD;Init_Port();_EINT();while(1);} pragma vector=PORT1_VECTOR \/\/按键响应处理函数 __interrupt void Port1(void...

msp430f149按键程序
void key_init( void ){ P1DIR=0x00; \/\/输入 P1IES=0xff; \/\/ 选择下降沿中断 P1IE=0x01; \/\/ 打开中断使能 P1IFG=0x00; \/\/中断标志位清零 } void main(void){ \/*下面六行程序关闭所有的IO口*\/ P1DIR = 0XFF;P1OUT = 0X00;P2DIR = 0XFF;P2OUT = 0X00;P3DIR =...

MSP430单片机无法进入外部中断!紧急求助!
放个断点在进中断第一句话,如果能进,说明初始化没问题,如果不能进,说明初始化有问题(大概看了下你程序,初始化加一句P1IFG &= ~BIT0;吧,也不一定是这个问题)。上一步没问题了,再放个断点在标志位判断那个括弧里,就是if(P1IFG & BIT0)这句后边。如果进不了,那就是这里的问题,我一...

msp430 中看门狗问题?
这个简单三,看门狗定时器必须在溢出前喂狗才不会导致看门狗复位,如果想要它复位的话,只需要写个死循环就可以了,比如:while(1);中断在有事情需要中断的时候用,比如按键中断,按键以后我们希望程序暂停MAIN主循环,转去执行按键中断处理程序,这个时候就叫做中断。复位是中断的一种,只是复位中断是不可...

msp430中关于按键下面*号语句有什么用
逻辑上重复了。我觉得可以考虑按键是否需要持续时间,50us内按键是否改变,人为操作一般不会小于50us,可以排除一些干扰错误什么的,看具体使用的情况了。

MSP430单片机I\\O端口的上升沿中断和下降沿中断有什么区别
上升沿中断就是检测到外部IO电平由低到高则产生中断,下降沿则是由高到低则产生中断。实际应用时结合具体电路来使用。比如外部器件某端口正常时是高电平,出问题了变为低电平,msp430要检测到这样的信号,就要设置成下降沿中断。

msp430 中看门狗问题?
中断机制在微控制器系统中扮演着重要角色。中断允许系统在特定事件发生时暂停当前执行的程序,从而转去执行与该事件相关的中断服务程序。例如,按键中断可以在用户按下按键时触发,使得系统能够暂停主循环(通常称为 MAIN 主循环)并执行按键中断处理程序。这样的设计能够实现对系统状态的实时监控和响应,提高...

MSP430 主函数中有两个参数,想通过独立按键来实现几组参数的改变,怎么...
方法很多。端口设为输入,电路可以设计成用按键拉低,然后用if判断按键,然后修改变量,前提是主程序比较简单,能扫描到if。复杂的话可以用中断,按键产生中断进入中断程序,中断程序中修改变量,这还得看是哪个型号的芯片。

如何配置 msp430g2553 io口的 其他功能
IO口中断相关寄存器:PXIV、PXIFGX、PXIE、PXIES;由于IO中断仅存在于P1口和P2口,因此X只能为1或2,而且不可以为A。3、msp430f5529.h中定义了BIT0~BITF,方便用户进行位操作。例如要设置P1.7和P2.2为输入,代码可如下:PADIR &= ~(BITA + BIT7)。二 IO口常用寄存器配置 1、PxDIR,Px口...

IAR调试时如何设置中断到了
可以设置一个断点在中断服务程序中,然后单步执行并且触发中断,如按键触发外部中断,就进到服务程序中了。一般来说断点总数不能超过3个,3个是可以的。另外如果代码中已设的断点实际上不可能到达的断点也会有提示。而且那个代表断点,在源码左边的红点会变成白圈。

相似回答