因为MSP430的操作是在寄存器上进行直接操作的,所以学习起来有一点繁琐,不像32,他有自己分装好的库可以提供大家使用,介绍中断,那就要了解下中断有关的寄存器:
这里写按键中断作为测试程序:
#ifndef __CLOCK_H#define __CLOCK_H#define uchar unsigned char #define uint unsigned intvoidInt_Clk(void); #endif
#include<msp430f149.h>#include "clock.h"/****************************************************************************初始化时钟******************************************************************************/voidInt_Clk(void) { uchari; BCSCTL1&=~XT2OFF; //开启XT2振荡器BCSCTL2|=SELM_2+SELS; //选择MCLK时钟源为XT2CLK;选择SMCLK时钟源为XT2CLKdo { 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)ucharKeyVal=0; //按键的键值uchari=0; voiddelay(void); intmain( void ) { //StopwatchdogtimertopreventtimeoutresetWDTCTL=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) //转换键值 { case1:P2OUT&=~BIT0;KeyVal=0;break; case2:P2OUT&=~BIT1;KeyVal=0;break; case3:P2OUT&=~BIT2;KeyVal=0;break; default:break; } delay(); delay(); delay(); delay(); delay(); delay(); P2OUT=0xff; } return0; } /*******************************************函数名称:delay功能:用于消抖的延时参数:无返回值:无********************************************/voiddelay(void) { uinttmp; for(tmp=12000;tmp>0;tmp--); } /*******************************************函数名称:PORT1_ISR功能:P1端口的中断服务函数参数:无返回值:无********************************************/#pragma vector=PORT1_VECTOR__interruptvoidPORT1_ISR(void) { switch(P1IFG) { case0x01: if(keyin==0x02) //è?1?ê?μúò???°′?ü±?°′?? { delay(); if(keyin==0x02) { while(keyin!=0x03); //μè′y°′?ü·??aKeyVal=1; P1IFG=0; break; } } case0x02: if(keyin==0x01) //è?1?ê?μú?t??°′?ü±?°′?? { delay(); if(keyin==0x01) { while(keyin!=0x03); //μè′y°′?ü·??aKeyVal=2; P1IFG=0; break; } } default:P1IFG=0;break; } }