
MSP430关于按键中断的代码;;
#include<msp430f247.h>voiddelay();voidlamp1();voidlamp2();intmain(void){WDTCTL=WDTPW+...
#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这个中断完全没有用啊。按键 按了都不响应。 还有第二个中断能响应,但是按了第一个键 再按第二个 就不会变了,一直执行第一个运行的流水灯的代码 展开
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个回答
展开全部
整个实验,是不是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;
}
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;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询