搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

发表于 2012-7-19 02:39:01 | 显示全部楼层 |阅读模式
如题,小弟在玩开发板时发现了一个问题,我的芯片是msp430f169.
在使用IO中断,P1口作为独立按键使用时发现无法实现中断触发。按键的图如下:


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

#define  EA_L  P5OUT &=~BIT0
#define  EA_H  P5OUT |=BIT0
#define  EB_L  P5OUT &=~BIT1
#define  EB_H  P5OUT |=BIT1

#define  EB_GND_Key  do{P5OUT |=BIT2;P5OUT |=BIT3;} while(0)
#define  EB_VCC_Key  do{P5OUT &=~BIT2;P5OUT &=~BIT3;} while(0)  

#define  EA_AC_Key  do{P5OUT |=BIT4;P5OUT |=BIT5;} while(0)  
#define  EA_DC_Key  do{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默认是什么电平?是否会自动置位?
有人建议我用查询,我觉得查询也不行,也是无法读取有按键按下的标志位。
其实加上上拉电阻可以使用中断和扫描的。我想知道如果没有上拉电阻能否就我的板子实现独立按键?
谢谢大家啦!希望大家能提出自己的见解

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981

出0入0汤圆

 楼主| 发表于 2012-7-19 09:14:50 | 显示全部楼层
怎么木有人看呀。自己顶顶

出0入0汤圆

 楼主| 发表于 2012-7-19 10:48:16 | 显示全部楼层
深夜发帖伤不起啊!一定要吸取教训啊。顶起啊

出0入0汤圆

发表于 2012-7-19 11:03:11 | 显示全部楼层
上拉电阻呢?

出0入0汤圆

 楼主| 发表于 2012-7-19 14:02:43 | 显示全部楼层
lcofjp 发表于 2012-7-19 11:03
上拉电阻呢?

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

出0入0汤圆

发表于 2012-7-19 17:50:22 | 显示全部楼层
没上拉怎么能输入高呢,只有个低状态啥也干不了,自己外接个上拉吧。

出0入0汤圆

 楼主| 发表于 2012-7-20 00:34:27 | 显示全部楼层
lcofjp 发表于 2012-7-19 17:50
没上拉怎么能输入高呢,只有个低状态啥也干不了,自己外接个上拉吧。

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

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

出0入0汤圆

发表于 2012-7-20 08:35:53 | 显示全部楼层
abcfanyuan 发表于 2012-7-20 00:34
问题解决了,还是要谢谢你啦。可以实现了,
不用上拉电阻也可以的,149,169没有内部上拉,
可以在每次按 ...

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

出0入0汤圆

发表于 2012-7-20 16:13:44 | 显示全部楼层
有一些芯片是内部不带上拉电阻的

出0入0汤圆

 楼主| 发表于 2012-7-21 00:45:01 | 显示全部楼层
lcofjp 发表于 2012-7-20 08:35
不知道谁想出来的办法,我觉得“不太安全”
你看看IO内部结构就知道了,输出的时候同时也输入了。
你扫描 ...

51貌似也是这么用的。

出0入0汤圆

发表于 2012-7-21 22:20:18 | 显示全部楼层
稀饭,我今天看书的时候发现这个问题怎么解决了,当你设置为输出方向时,并且输出为高电平时,是将这个端口的信号锁存后输出,当你再设置为输入方向的时候,不按键的时候检测到高电平,当你按下键的时候会检测到低电平,之后你是可以不用再次设置P1DIR=0XFF,P1OUT=0XFF的,因为输入端的管脚有之前的锁存了的高电平信号,给你看个图你就知道了。这种情况下,高阻态也不用考虑了,因为信号锁存了。在一个实验室还要在论坛上发帖讨论,我想可能是论坛上好玩些,而且可以互相学习。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-1 23:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表