MSP430-中断的使用

2020-01-13来源: eefocus关键字:MSP430  中断

因为MSP430的操作是在寄存器上进行直接操作的,所以学习起来有一点繁琐,不像32,他有自己分装好的库可以提供大家使用,介绍中断,那就要了解下中断有关的寄存器:

这里写按键中断作为测试程序:


#ifndef  __CLOCK_H

#define  __CLOCK_H

#define uchar unsigned char 

#define uint unsigned int

void Int_Clk(void);

#endif

 


#include

#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

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

                 

        }

 

    }

关键字:MSP430  中断 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic485464.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430-流水灯和key
下一篇:MSP430-定时器的寄存器介绍以及测试应用

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

如何提高MSP430 C语言代码的执行效率
关于代码效率———————MSP430系列的程序设计准则,有利于提高代码效率。应该指出,这些准则基本上是基于MSP430系列的硬件结构特点而提出的。1.位域类型的执行时很慢的,所以应当在仅仅为了节省数据存储空间时才使用位域方式。如果用户必须使用位域存储,可以用char或unsigned int的位屏蔽操作来代替位域操作。2.在模块之外不使用的变量应当声明为static,这样在编译时有可能使这些变量分配在寄存器中暂存,从而提高了代码效率。3.尽可能使用unsigned数据类型。许多情况下,对unsigned数据类型的操作,比对signed数据类型的操作效率更高,尤其对于除法和求模运算更是如此。4.程序设计中应该使用ANSI-C原型
发表于 2020-01-19
MSP430 Flash信息区
430单片机,一般具有内部的信息区,以便保存一些需要EEPROM才可保存的数据。 在论坛没有收到相关信息,就借用网上的,抛砖引玉,如果有什么问题,多多指正,一起掌握! MSP430 FLASH型单片机的FLASH存储器模块根据不同的容量分为若干段,其中信息存储器SegmengA及SegmentB各有128字节,其他段有512字节。SegmentB的地址是:0x1000到0x107F,SegmentA的地址是:0x1080到0x10FF。其他段的地址根据容量不同,从0xFFFF开始,每512字节为一段进行分配。 FLASH存储器写入数据时,每一位只能由“1”变成“0”,不能由“0”变成“1“,因此,当我
发表于 2020-01-19
关于MSP430-Flash超过64K的读写操作方法
下面例子是Qiaohaikun先生几年前一直用在MSP430FG4618...使用过的,一直都挺好使。希望在此分享出来能帮助到有需要的网友们。同样,希望各网友们如有精品程序例子的话同样可以发贴到微控论坛来。人人为我,我为人人! 运行代码  #include "msp430xG46x.h"  void WriteFlashErrorNum(void);  //----------------------------------------------------------------------  //功能:从flash中
发表于 2020-01-19
MSP430 开发注意事项要求
以下是在使用MSP430中的一些总结: 1.系统时钟问题: 系统默认使用DCO,使用外部高速晶振XT2时必须自己开启XT2,并延时50us等待XT2起振,然后手工清除IFG1中的OFIFG位 !!!!一定要注意操作顺序:打开XT2->等待XT2稳定->切换系统时钟为XT2 若后面两步操作反了,在通常情况下不会出现问题,但是在电压不稳MCU频繁复位的情况下,非常容易造成MCU死掉,只能掉电后重新上电才能可靠复位。2.早期版本的IAR开发环境 必须在Project->Option->C-Spy中选择对应器件的DDF文件,否则调试时无SFR窗口。3.在写Flash
发表于 2020-01-19
MSP430实现简单的对临界资源的冲突访问
实现对临界资源的冲突访问__monitor int get_lock(void){if (the_lock == 0) {  /* Success, we managed to lock the lock. */  the_lock = 1;  return 1; }else {  /* Failure, someone else has locked the lock. */  return 0;  } }/* release_lock -- Unlock the lock. */ __monitor void relea
发表于 2020-01-19
msp430硬件II2C
msp430系列硬件I2C操作24LC128程序说明:24lc128为美信公司EEPROM存储器,存取空间为128kbit。具体的通信规则可以看其器件手册。 ***************************************************************************************/ 运行代码 /*******************************************************************************  包含头文件  
发表于 2020-01-19
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved