4734|4

3

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

msp430g2553里的P1口中断问题 [复制链接]

我设置P1.3按键中断,在调试的时候,发觉P1IN默认是0x0020,这个不是我的问题。
我的问题是,当按下按键,松开后判断(P1IN & BIT3)这语句为什么是真。我的理解是松开后P1IN=0x0020,与BIT3按位与应该为0。
我是在LaunchPad板子上采用CCS_V5.1调试的。
程序是想实现按键时间长一点来置换P1.0口,按键时间短就不动作。
如果屏蔽蓝色     P1IFG = 0;  这句之后,程序完全不按语法规则跑,我很无语。
但是我按下之后,程序虽然一直在红色循环里面,但是P1.0照样能置换。

#include

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;
}

最新回复

你把P1.3写成低电平 了   详情 回复 发表于 2012-9-6 17:03

点评

你把P1.3写成低电平 了   详情 回复 发表于 2012-9-6 17:03
 
点赞 关注

回复
举报

5015

帖子

12

TA的资源

裸片初长成(初级)

沙发
 
P1口是一个多源中断,需要对8个IO中断分别手动清中断而不能自动清零。
由于按键存在抖动,中断发生后可能没能进入中断服务函数的if语句,那么你的 蓝色P1IFG = 0;  没执行就会导致中断标志为没有清除,这样就会不断的进入中断服务函数,就是你说的“程序完全不按语法规则跑”

点评

【在屏蔽掉蓝色那句后】如果P1.0被置换,那么中断标志位,也应该被清除的啊。 请问你有没有更好的算法? 谢谢你的回答!  详情 回复 发表于 2012-7-27 10:34
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 wstt 的帖子

【在屏蔽掉蓝色那句后】如果P1.0被置换,那么中断标志位,也应该被清除的啊。
请问你有没有更好的算法?
谢谢你的回答!
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

4
 

——!

#include  

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;               
  P1DIR = 0x01;                             
  P1OUT =  0x08;                           
  
  P1REN |= 0x08;                           
  P1IE |= 0x08;                             
  P1IES |= 0x08;                           
  P1IFG &= ~0x08;                           
  _BIS_SR(LPM4_bits + GIE);               
}

// Port 1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
  P1OUT ^= 0x01;                           
  P1IFG &= ~0x08;                        
}
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 楼主 xfzl 的帖子

你把P1.3写成低电平 了 
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表