[求助]
G2553关于IO口中断高低点平触发的问题
用G2553做IO口中断,P1.0控制LED,另外选一个IO口做中断处理。发现,寄存器P1IES的值对于是高电平还是低电平触发完全没有影响。
分别试了P1.1~P1.7口,发现它们的触发方式都是确定了的:
低电平触发:P1.1 P1.2 P1.3 P1.5
高电平触发:P1.4 P1.6 P1.7
不论P1IES怎么设置,以上结论都成立,每个IO都试过了,那这样的话,P1IES还有什么意义?
代码如下(用P1.7中断):
#include
#define KEY BIT7
void button_init()
{
P1DIR |= BIT0; // set P1.0 to output direction
P1IE |= KEY; // P1.3 interrupt enabled
P1IES = 0x00;
P1IFG &= ~KEY; // P1.3 IFG cleared
P1REN |= KEY;
}
void main()
{
button_init();
_EINT(); //换成_BIS_SR(LPM4 + GIE)就会自动跳出while(1)...????
while(1)
_NOP();
}
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
if (P1IFG & KEY)
{
P1OUT ^= BIT0; // P1.0 = toggle
P1IFG &= ~KEY; // P1.3 IFG cleared
}
}
另外还有个问题:main函数中的_EINT(); 换成_BIS_SR(LPM4 + GIE); 后就老是跳出while循环,不知道为什么?这两句有什么区别?
谢谢各位!
楼主 那个电平触发我没试过 不知道是怎么回事
那个_EINT(); 和_BIS_SR(LPM4 + GIE); 是有很明显的区别的
前者只是打开总中断 而后者是打开总中断还要进入低功耗模式 进入低功耗模式后 由于你在P1口的中断中没有退出低功耗模式 所以单片机处理完中断后东西后会继续进入低功耗模式 直到下一次中断的来临
回复 板凳 onlyyou1-1 的帖子
那么_EINT( ); 和_BIS_SR(GIE); 是不是同一个意思呢?
回复 4楼 yujinjing13 的帖子
你可以直接查看头文件里面的定义哈
稍微调整了一下,是下降沿触发的
#include "msp430g2553.h"
#define KEY BIT3
void button_init()
{
P1DIR |= BIT0; // set P1.0 to output direction
P1IE |= KEY; // P1.3 interrupt enabled
P1IES = KEY;
P1IFG &= ~KEY; // P1.3 IFG cleared
}
void main()
{
button_init();
while(1)
{
__bis_SR_register(LPM4_bits + GIE);
}
}
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
if (P1IFG & KEY)
{
P1OUT ^= BIT0; // P1.0 = toggle
P1IFG &= ~KEY; // P1.3 IFG cleared
}
__bis_SR_register_on_exit(LPM4_bits + GIE);
}
回复 楼主 yujinjing13 的帖子
设置有问题吧! P1DIR |= BIT0; // set P1.0 to output direction
你设置P1.0有什么意义吗?你现在是要通过P1.3的输入状态来引发中断的,所以你应该把P1.3设为输入状态:P1DIR&=~BIT3;
回复 6楼 suhang 的帖子
呃……为什么你不加上拉电阻就可以用高电平触发P1.3了……
回复 7楼 siyuelipeng 的帖子
P1.0控制LED,每次触发中断后LED会取反一次来标志中断发生,所以要把P1.0用作输出
回复 6楼 suhang 的帖子
而且把你的代码中BIT3改为BIT2,其他不变,就是低电平触发……
回复 4楼 yujinjing13 的帖子
是同一个意思,_EINT( ); 和_BIS_SR(GIE都是开总中断的意思
一定要把他们的状态设置成一样,而且在过程中不要改变