MSP430-中断的使用
因为MSP430的操作是在寄存器上进行直接操作的,所以学习起来有一点繁琐,不像32,他有自己分装好的库可以提供大家使用,介绍中断,那就要了解下中断有关的寄存器:
这里写按键中断作为测试程序:
#ifndef __CLOCK_H
#define __CLOCK_H
#define uchar unsigned char
#define uint unsigned int
void Int_Clk(void);
#endif
#include<msp430f149.h>
#include "clock.h"
/****************************************************************************
初始化时钟
******************************************************************************/
void Int_Clk(void)
{
uchar i;
BCSCTL1&=~XT2OFF; //开启XT2振荡器
BCSCTL2|=SELM_2+SELS; //选择MCLK时钟源为XT2CLK;选择SMCLK时钟源为XT2CLK
do
{
IFG1&=~OFIFG;
for(i=0;i<100;i++)
_NOP();
}
while((IFG1&OFIFG)!=0);
IFG1&=~OFIFG;
}
#include <msp430x14x.h>
#include "clock.h"
#define keyin (P1IN & 0x03)
uchar KeyVal = 0; // 按键的键值
uchar i=0;
void delay(void);
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
Int_Clk();
P1IES = 0x03; // P1.0~P1.3选择下降沿中断
P1IE = 0x03; // 打开中断使能
P1DIR &=~ (BIT0+BIT1); //设置P1.0~P1.3为输入状态
P2DIR = 0xff;
P2OUT = 0xff;
_EINT(); //打开全局中断控制位
while(1)
{
switch(KeyVal) //转换键值
{
case 1:P2OUT&=~BIT0;KeyVal=0;break;
case 2:P2OUT&=~BIT1;KeyVal=0;break;
case 3:P2OUT&=~BIT2;KeyVal=0;break;
default:break;
}
delay();
delay();
delay();
delay();
delay();
delay();
P2OUT = 0xff;
}
return 0;
}
/*******************************************
函数名称:delay
功 能:用于消抖的延时
参 数:无
返回值 :无
********************************************/
void delay(void)
{
uint tmp;
for(tmp = 12000;tmp > 0;tmp--);
}
/*******************************************
函数名称:PORT1_ISR
功 能:P1端口的中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
switch(P1IFG)
{
case 0x01:
if(keyin == 0x02) //è?1?ê?μúò???°′?ü±?°′??
{
delay();
if(keyin == 0x02)
{
while(keyin != 0x03); //μè′y°′?ü·??a
KeyVal = 1;
P1IFG = 0;
break;
}
}
case 0x02:
if(keyin == 0x01) //è?1?ê?μú?t??°′?ü±?°′??
{
delay();
if(keyin == 0x01)
{
while(keyin != 0x03); //μè′y°′?ü·??a
KeyVal = 2;
P1IFG = 0;
break;
}
}
default:P1IFG = 0;break;
}
}