MSP430F149按键检测程序

该程序由IAR编译运行,使用单片机的P1.0~P1.3口作为四个独立按键。由外部中断的下降沿触发。

/**********************************************
*程序描述:单片机的P1.0~P1.3连接四个独立按键,外部中断下触发
*作者    :huasir
*时间    :2017.10.28   22:10
***********************************************/
#include<msp430x14x.h>
#define keyin (P1IN & 0X0F)
unsigned int KeyVal = 0;   // 键值,0表示异常,1,2,3,4分别为四个按键按下

void DelayXms(unsigned int i);
void keyInit(void);   //键盘设置的初始化
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  keyInit();         //键盘初始化
  LPM0;              //进入低功耗模式 
  return 0;
}
/****************************************************************************
*函数名: PORT1_ISR()                                                         /
*作用  :外部中断服务函数                                                   /
*返回值:无                                                                  /
*参数  :无                                                                  /
*作者  :huasir                                                              / 
*时间  :2017.10.28                                                          / 
*****************************************************************************/
#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;
            LPM0_EXIT;
            P1IFG = 0;
            return;
          } 
      case 0x02:
         if(keyin==0x0d)
         {
            DelayXms(5);          //延时消抖
            while(keyin==0x0d);   //松手检测
            KeyVal = 2;
            LPM0_EXIT;
            P1IFG = 0;
            return;
         } 
      case 0x04:
         if(keyin==0x0b)
         {
            DelayXms(5);        //延时消抖
            while(keyin==0x0b); //松手检测
            KeyVal = 3;
            LPM0_EXIT;
            P1IFG = 0;
            return;
         } 
      case 0x08:
      if(keyin==0x07)
      {
            DelayXms(5);        //延时消抖
            while(keyin==0x07); //分手检测
            KeyVal = 4;
            LPM0_EXIT;
            P1IFG = 0;
            return;
      } 
      default:
       {
            KeyVal = 0;
            LPM0_EXIT;
            P1IFG = 0;
         
       }
    }
  } 
}
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();
}


  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nwsuaf_huasir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值