TI中文支持网
TI专业的中文技术问题搜集分享网站

msp430g2553里的P1口中断问题

我设置P1.3按键中断,在调试的时候,发觉P1IN默认是0x0020,这个不是我的问题。

我的问题是,当按下按键,松开后判断(P1IN & BIT3)这语句为什么是真。我的理解是松开后P1IN=0x0020,与BIT3按位与应该为0。

我是在LaunchPad板子上采用CCS_V5.1调试的。

程序是想实现按键时间长一点来置换P1.0口,按键时间短就不动作。

如果屏蔽蓝色     P1IFG = 0;  这句,

我按下按键之后,程序虽然一直在红色循环里面,但是P1.0照样能置换。如果P1.0能置换,那么中断标志位也应该能清除啊,可是程序没有清除。

程序完全不按语法规则跑,我很无语。请问为什么啊!

#include<msp430g2553.h>

typedef unsigned int  uint;
#define keyin    (P1IN & BIT3)
uint num=0,i;
void delay()                          //延时函数
{
    uint j;
    for(j=0;j<5000;j++);
}

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  P1IES |= BIT3;                            // P1.3 high-to-low transition
  P1IE |= BIT3;
  P1DIR &= ~BIT3;
  P1OUT |= ~BIT3;
  P1IFG &= ~BIT3;
   P1DIR |= BIT0;
  P1OUT |= BIT0;

  P1REN |= BIT3;

      _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/ interrupt
}
#pragma vector=PORT1_VECTOR                        //p1按键中断
__interrupt void P1_ISR(void)
{
    if(P1IFG & BIT3)
    {
        if(keyin == BIT3)   //如果是第一个按键被按下
        {
            if(keyin == BIT3)
            {
                              while(P1IN & BIT3)       //等待按键放开
                {
                    num++;
                    delay();
                }

                if(num>20000)
                {
                    num=0;

                    P1OUT ^= 0X01;

                    P1IFG = 0;
                }             }         }    }
      P1IFG = 0;      num=0;
    return;
}

Bill Kent:

请问大家,有木有更好的检测按键时间长短的算法

Peter_Zheng:

回复 Bill Kent:

不用中断,用端口扫描的方式,来判断电平的变化进行按键时间长短的判断。

Hardy Hu:

去抖时间太长了,5000*20000再乘上循环所需时间,估计得100M个cycle,默认配置MCU才1Mhz的主频,也就是得按100S左右才有翻转的响应

Hardy Hu:

需要计算按键的时间还是去抖动?

1.计算按键时间:定时器+按键中断的方式,注意抖动的影响;

2.去抖动:进中断后简单延时在查询IO的电平即可判断

赞(0)
未经允许不得转载:TI中文支持网 » msp430g2553里的P1口中断问题
分享到: 更多 (0)