|
我初学msp的c,写了个小程序,程序如下:
/********************************************************************************************\
文件名:chushi.c
描述:MSP430框架程序。程序为MSP430F149编写,此处为简单的MSP程序,为初始学习实验例子。
版本:1.0.0.20070824
\********************************************************************************************/
lianxi.h
//在练习中自己定义的头文件
#ifndef _lianxi
#define _lianxi
//常量定义声明
#define AB0 BIT0
#define AB1 BIT1
#define AB2 BIT2
#define AB3 BIT3
#define AB4 BIT4
#define AB5 BIT5
#define AB6 BIT6
#define AB7 BIT7
//函数声明
void ClockInitSys(); //时钟模块初始化
void Port_Init(); //I/O模块初始化
void DelayOutput(); //I/O口延时输出,测试延时程序
void Ta_Init(); //TA初始化
void ClockChange(); //时钟切换至LFXT1
void Delay_100ms(); //延时100ms
#endif
/***************************************************************/
//头文件
#include <MSP430x16x.h>
#include "lianxi.h"
//主程序
int main( void )
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
ClockInitSys(); //时钟初始化
//start:
Port_Init(); //用户程序
DelayOutput(); //用户程序
ClockChange();
Delay_100ms();
// DelayOutput();
Ta_Init();
_EINT(); //打开全局中断
LPM1; //进入低功耗模式1
// goto start;
}
/*******************************************************************************************
时钟系统初始化
*******************************************************************************************/
void ClockInitSys()
{
unsigned int iq0;
//使用XT2振荡器
BCSCTL1 &= ~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; //清除振荡器失效标志
for(iq0=0xFF;iq0>0;iq0--); //延时,等待XT2起振
}
while ((IFG1 & OFIFG)!=0); //判断XT2是否起振
BCSCTL2=SELM_2+DIVM_2+SELS+DIVS_2; //选择MCLK、**CLK为XT2,且MCLK、**CLK为4分频
//对各个模块初始化
}
/********************************************************************************************
I/O模块初始化
********************************************************************************************/
void Port_Init()
{
//P1、P3、P4口全设置为输出
P1DIR = 0xFF;
P3DIR = 0xFF;
P4DIR = 0xFF;
//P2.3设为输入,其他为输出
P2DIR = 0xF7;
//P1.1设为外设功能,即TA的OUT0输出
P1SEL |= AB2;
//P2.3使能中断并清标志,下降沿触发
P2IFG = 0;
P2IE |= AB3;
P2IES |= AB3;
//全输出为高电平
P1OUT = 0x30;
P2OUT = 0;
P3OUT = 0;
P4OUT = 0;
}
/********************************************************************************************
I/O延时输出
********************************************************************************************/
void DelayOutput()
{
unsigned int i,j;
// P1OUT |= AB1; //P1.1输出高电平
P1OUT |= AB1; //P1.1输出高电平
//延时1s
for(i=0;i<5155;i++)
for(j=0;j<17;j++);
P1OUT &= ~AB1;
}
/*******************************************************************************************
时钟切换
*******************************************************************************************/
void ClockChange()
{
BCSCTL1 = XT2OFF; //选择低频模式
BCSCTL2 = SELM_3; //
}
/*******************************************************************************************
Time_A初始化设置
*******************************************************************************************/
void Ta_Init()
{
TACTL=TASSEL_1+TACLR;
CCR0 = 20000;
CCR1 = 10000;
TACCTL1=OUTMOD_2; //PWM翻转
TACTL |= MC_1;
}
/********************************************************************************************
延时100ms
********************************************************************************************/
void Delay_100ms()
{
unsigned int i;
for(i=0;i<1309;i++);
}
/********************************************************************************************
P2口中断函数
********************************************************************************************/
#pragma vector=PORT2_VECTOR
__interrupt void Port2()
{
//判断是否为正确中断
if((P2IFG&AB3)==AB3)
{
_DINT();
// P2IE = 0;
P2IFG = 0;
unsigned int i,j;
//多次重复检测,进行软件消除干扰
for(i=0;i<100;i++)
{
if((P2IN&AB3)==0)
_NOP();
else
break;
}
//进行指示灯指示
if(i==100)
{ P1OUT &= ~AB4; //绿色指示灯,表示正确中断
for(j=0;j<6553;j++);
P1OUT |= AB4;
}
else
{ P1OUT &= ~AB5; //红色指示灯,表示正确中断
for(j=0;j<6553;j++);
P1OUT |= AB5;
}
_EINT();
// P2IE |= AB3;
}
//非正确中断,清标志,退出循环
else
P2IFG = 0;
}
现在问题是P2.3我采用按键中断,但几乎是每次按键后都会出现2次中断,找不到什么原因,请高手指点!!!!或者邮箱:qzliuhaiyun@163.com联系,谢谢
|
|