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;
                 
        }

    }

猜你喜欢

转载自blog.csdn.net/weixin_41445387/article/details/89785967