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按下闪烁频率降低一半
*作者    :Zhenhua Liu
*时间    :2017.10.29  20:00
***********************************************/
#include
#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()                                                         /
*作用  :外部中断服务函数                                                   /
*返回值:无                                                                  /
*参数  :无                                                                  /
*作者  :Zhenhua Liu                                                              / 
*时间  :2017.10.29                                                          / 
*****************************************************************************/
#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                                           /
*返回值:无                                                                  /
*参数  :无                                                                 /
*作者  :Zhenhua Liu                                                         / 
*时间  :2017.10.29                                                          /               
*****************************************************************************/
void DelayXms(unsigned int i){
    unsigned int j;
    for( ; i>0; i--){
      for(j=0;j<200;j++); 
    }
  
}
/****************************************************************************
*函数名: keyInit()                                                           /
*作用  :设置与四个独立按键相关的IO的配置,包括输入输出方向,中断触发方式    /
*返回值:无                                                                  /
*参数  :无                                                                  /
*作者  :huasir                                                              / 
*时间  :2017.10.28                                                          /               
*****************************************************************************/
void keyInit(void){
  P1DIR &= ~(BIT0+BIT1+BIT2+BIT3);//设置四个按键的接受口为输入,注意,使用外部中断并不属于第二功能
  P1IES |= BIT0+BIT1+BIT2+BIT3;  //设置四个按键的中断触发方式为下降沿触发
  P1IE  |= BIT0+BIT1+BIT2+BIT3;  //打开四个按键的外部中断
   _EINT();                      //打开总中断
}


你可能感兴趣的:(嵌入式软硬件开发)