2546|1

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

MSP430按键控制LED闪烁频率 [复制链接]

MCU为430F149,编译环境为IAR,主时钟使用频率的800KHz,内部DCO。LED->P2.0, KEY1->P1.0, KEY2->P1.1。亲测可用。

/**********************************************
*程序描述:单片机的P1.0,P1.1连接两个独立按键,P1.0->KEY1,P1.1->kEY2,由外部中断下触发。P2.0->LED,MCLK = DCO 800KKHz
*          按键1按下每秒闪一下,按键2按下闪烁频率降低一半

***********************************************/
#include<msp430x14x.h>
#define keyin (P1IN & 0X0F) //用于读取按键接口的电平,延时消抖和松手检测
unsigned int KeyVal = 0;   // 键值位全局变量,0表示异常,1,2分别为两个按键按下
 
void DelayXms(unsigned int i);
void keyInit(void);   //键盘设置的初始化
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  keyInit();         //键盘初始化
  P2DIR |= BIT0;     //led口方向为输出
  while(1){
     P2OUT |= BIT0;  //LED高电平
     if(KeyVal==1)DelayXms(1000);   //按键1按下延时1s
     if(KeyVal==2)DelayXms(2000);   //按键2按下延时2s
     P2OUT &= ~BIT0;               //LED低电平
     if(KeyVal==1)DelayXms(1000);  //按键1按下延时1s
     if(KeyVal==2)DelayXms(2000);  //按键1按下延时2s
  }
  return 0;
}
/****************************************************************************
*函数名: PORT1_ISR()                                                         /
*作用  :外部中断服务函数                                                   /
*返回值:无                                                                  /
                                                         /
*****************************************************************************/
#pragma vector = PORT1_VECTOR
__interrupt void PORT1_ISR(void){
  if(P1IFG&0x0f){
  switch(P1IFG){
      case 0x01:
         if(keyin==0x0e)
         {
            DelayXms(5);            //延时消抖
            while(keyin==0x0e);     //松手检测
            KeyVal = 1;             //键值为1
            P1IFG = 0;              //中断标志清零
            return;
          }
      case 0x02:
         if(keyin==0x0d)
         {
            DelayXms(5);          //延时消抖
            while(keyin==0x0d);   //松手检测
            KeyVal = 2;           //键值为2     
            P1IFG = 0;            //中断标志清零
            return;
         }
    
      default:
       {
            KeyVal = 0;
            LPM0_EXIT;
            P1IFG = 0;
         
       }
    }
  }
}
/****************************************************************************
*函数名: DelayXms()                                                           /
*作用  :800KHz的MCLK下,延时大约1s                                           /
*返回值:无                                                                  /
                                                /               
*****************************************************************************/
void DelayXms(unsigned int i){
    unsigned int j;
    for( ; i>0; i--){
      for(j=0;j<200;j++);
    }
 
}
/****************************************************************************
*函数名: keyInit()                                                           /
*作用  :设置与四个独立按键相关的IO的配置,包括输入输出方向,中断触发方式    /
*返回值:无                                                                  /
                                              /               
*****************************************************************************/
void keyInit(void){
  P1DIR &= ~(BIT0+BIT1+BIT2+BIT3);//设置四个按键的接受口为输入,注意,使用外部中断并不属于第二功能
  P1IES |= BIT0+BIT1+BIT2+BIT3;  //设置四个按键的中断触发方式为下降沿触发
  P1IE  |= BIT0+BIT1+BIT2+BIT3;  //打开四个按键的外部中断
   _EINT();                      //打开总中断
}

 

最新回复

不错,好基础的资料。   详情 回复 发表于 2020-9-7 21:16
 
点赞 关注

回复
举报

2618

帖子

0

TA的资源

纯净的硅(高级)

沙发
 

不错,好基础的资料。

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表