abcfanyuan 发表于 2012-7-19 02:39:01

msp430 P1独立按键中断,扫描都无法解决

如题,小弟在玩开发板时发现了一个问题,我的芯片是msp430f169.
在使用IO中断,P1口作为独立按键使用时发现无法实现中断触发。按键的图如下:


我写了如下的程序:
#include <msp430x16x.h>
#include <datatype.h>

#defineEA_LP5OUT &=~BIT0
#defineEA_HP5OUT |=BIT0
#defineEB_LP5OUT &=~BIT1
#defineEB_HP5OUT |=BIT1

#defineEB_GND_Keydo{P5OUT |=BIT2;P5OUT |=BIT3;} while(0)
#defineEB_VCC_Keydo{P5OUT &=~BIT2;P5OUT &=~BIT3;} while(0)

#defineEA_AC_Keydo{P5OUT |=BIT4;P5OUT |=BIT5;} while(0)
#defineEA_DC_Keydo{P5OUT &=~BIT4;P5OUT &=~BIT5;} while(0)

int A=0;
void Init_CLK(void)
{
   unsigned int iq0;
   BCSCTL1&=~0X00;      //打开XT2振荡器
   do
   {
      IFG1 &= ~OFIFG;   // 清除振荡器失效标志
      for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
    }
    while ((IFG1 & OFIFG) != 0);    // 判断XT2是否起振
    BCSCTL2 =SELM_2+SELS;   //选择MCLK、SMCLK为XT2
}



//Timer_A初始化--------------------
void Init_TimerA()
{
   TACTL = TASSEL_1+MC_1+TACLR;         //timerA CLK="ACLK",增计数模式   
   CCR0 =327;
   CCTL0 = CCIE;
}

void Init_Key_IO()
{
    //控制模拟开关
    P5DIR=0xff;
    P5SEL=0;
   
    //按键设置
    P1DIR &=~(BIT0+BIT1+BIT2+BIT3);//按键控制,IO中断方式
    P1SEL=0;
   // P1REN |=BIT0+BIT1+BIT2+BIT3;
    P1IE=0;
    P1IES=0;
   
    P1IES |=BIT0+BIT1+BIT2+BIT3;
    P1IFG=0;
    P1IE |=BIT0+BIT1+BIT2+BIT3;
}
void AC_Chose()
{
EA_L;
EB_H;
EA_AC_Key;
}

void DC_Chose()
{
EA_L;
EB_L;
EA_DC_Key;
}


void Delay()
{
uchar i;
for(i=100;i>0;i--);
}

void OFF_Set()
{
EA_H;
EB_H;
}

int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
Init_CLK();
Init_TimerA();
Init_Key_IO();
_EINT();
P1DIR=BIT7;

for(;;)
{
   switch(A)
       {
          case 0:DC_Chose(); break;
         
          case 1:AC_Chose(); break;
         
          case 2:OFF_Set(); break;
         
          case 3:   break;
       }   
}


}


#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{

if(P1OUT&BIT7)
{
    P1OUT &=~(BIT7);
    EB_GND_Key;
}
else
{
    P1OUT |=BIT7;
    EB_VCC_Key;
}

}

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
    if(P1IFG&BIT0)
    {
      P1IFG &=~(BIT0);
      Delay();
      if(!(P1IN&BIT0))
      A=0;//默认为交变电场。
    }
   
   if(P1IFG&BIT1)
    {
      P1IFG &=~(BIT1);
      Delay();
      if(!(P1IN&BIT1))
      A=1;//选择为静电场。
    }
   
   if(P1IFG&BIT2)
    {
      P1IFG &=~(BIT2);
      Delay();
      if(!(P1IN&BIT2))
      A=2; //选择关闭模拟开关
    }
   
   if(P1IFG&BIT3)
    {
      P1IFG &=~(BIT3);
      Delay();
      if(!(P1IN&BIT3))
      A=3;
    }
}

在网上查了下,貌似有的430有P1REN上拉下拉电阻使能寄存器,但是msp430f169没有。硬件已经是这样了,试了试使用
中断触发,但是无法触发中断,不知道PIN&BIT0默认是什么电平?是否会自动置位?
有人建议我用查询,我觉得查询也不行,也是无法读取有按键按下的标志位。
其实加上上拉电阻可以使用中断和扫描的。我想知道如果没有上拉电阻能否就我的板子实现独立按键?
谢谢大家啦!希望大家能提出自己的见解

abcfanyuan 发表于 2012-7-19 09:14:50

怎么木有人看呀。自己顶顶

abcfanyuan 发表于 2012-7-19 10:48:16

深夜发帖伤不起啊!一定要吸取教训啊。顶起啊

lcofjp 发表于 2012-7-19 11:03:11

上拉电阻呢?

abcfanyuan 发表于 2012-7-19 14:02:43

lcofjp 发表于 2012-7-19 11:03 static/image/common/back.gif
上拉电阻呢?

你是指图上面么?核心板上面的四个独立按键就是这么接着的啦。
我觉得像这样按键完全没有作用呀。不管查询还是中断貌似都不行呀。

lcofjp 发表于 2012-7-19 17:50:22

没上拉怎么能输入高呢,只有个低状态啥也干不了,自己外接个上拉吧。

abcfanyuan 发表于 2012-7-20 00:34:27

lcofjp 发表于 2012-7-19 17:50 static/image/common/back.gif
没上拉怎么能输入高呢,只有个低状态啥也干不了,自己外接个上拉吧。

问题解决了,还是要谢谢你啦。可以实现了,
不用上拉电阻也可以的,149,169没有内部上拉,
可以在每次按键按下之前给PxOUT高电平,
这样PxIN对应的 位也是高电平,当按下后有
一个条边沿就可以检测了,然后还是把OUT拉高就行

但是我不知道为什么对PxOUT赋值为高后,为什么会对PxIN相应的位拉高。

lcofjp 发表于 2012-7-20 08:35:53

abcfanyuan 发表于 2012-7-20 00:34 static/image/common/back.gif
问题解决了,还是要谢谢你啦。可以实现了,
不用上拉电阻也可以的,149,169没有内部上拉,
可以在每次按 ...

不知道谁想出来的办法,我觉得“不太安全”
你看看IO内部结构就知道了,输出的时候同时也输入了。
你扫描按键的时候,万一按键是按着的,你输出个高,IO就挂了。

a353183177 发表于 2012-7-20 16:13:44

有一些芯片是内部不带上拉电阻的

abcfanyuan 发表于 2012-7-21 00:45:01

lcofjp 发表于 2012-7-20 08:35 static/image/common/back.gif
不知道谁想出来的办法,我觉得“不太安全”
你看看IO内部结构就知道了,输出的时候同时也输入了。
你扫描 ...

51貌似也是这么用的。

jackson0585 发表于 2012-7-21 22:20:18

稀饭,我今天看书的时候发现这个问题怎么解决了,当你设置为输出方向时,并且输出为高电平时,是将这个端口的信号锁存后输出,当你再设置为输入方向的时候,不按键的时候检测到高电平,当你按下键的时候会检测到低电平,之后你是可以不用再次设置P1DIR=0XFF,P1OUT=0XFF的,因为输入端的管脚有之前的锁存了的高电平信号,给你看个图你就知道了。这种情况下,高阻态也不用考虑了,因为信号锁存了。在一个实验室还要在论坛上发帖讨论,我想可能是论坛上好玩些,而且可以互相学习。
页: [1]
查看完整版本: msp430 P1独立按键中断,扫描都无法解决