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默认是什么电平?是否会自动置位?
有人建议我用查询,我觉得查询也不行,也是无法读取有按键按下的标志位。
其实加上上拉电阻可以使用中断和扫描的。我想知道如果没有上拉电阻能否就我的板子实现独立按键?
谢谢大家啦!希望大家能提出自己的见解 怎么木有人看呀。自己顶顶 深夜发帖伤不起啊!一定要吸取教训啊。顶起啊 上拉电阻呢? lcofjp 发表于 2012-7-19 11:03 static/image/common/back.gif
上拉电阻呢?
你是指图上面么?核心板上面的四个独立按键就是这么接着的啦。
我觉得像这样按键完全没有作用呀。不管查询还是中断貌似都不行呀。 没上拉怎么能输入高呢,只有个低状态啥也干不了,自己外接个上拉吧。 lcofjp 发表于 2012-7-19 17:50 static/image/common/back.gif
没上拉怎么能输入高呢,只有个低状态啥也干不了,自己外接个上拉吧。
问题解决了,还是要谢谢你啦。可以实现了,
不用上拉电阻也可以的,149,169没有内部上拉,
可以在每次按键按下之前给PxOUT高电平,
这样PxIN对应的 位也是高电平,当按下后有
一个条边沿就可以检测了,然后还是把OUT拉高就行
但是我不知道为什么对PxOUT赋值为高后,为什么会对PxIN相应的位拉高。
abcfanyuan 发表于 2012-7-20 00:34 static/image/common/back.gif
问题解决了,还是要谢谢你啦。可以实现了,
不用上拉电阻也可以的,149,169没有内部上拉,
可以在每次按 ...
不知道谁想出来的办法,我觉得“不太安全”
你看看IO内部结构就知道了,输出的时候同时也输入了。
你扫描按键的时候,万一按键是按着的,你输出个高,IO就挂了。 有一些芯片是内部不带上拉电阻的 lcofjp 发表于 2012-7-20 08:35 static/image/common/back.gif
不知道谁想出来的办法,我觉得“不太安全”
你看看IO内部结构就知道了,输出的时候同时也输入了。
你扫描 ...
51貌似也是这么用的。 稀饭,我今天看书的时候发现这个问题怎么解决了,当你设置为输出方向时,并且输出为高电平时,是将这个端口的信号锁存后输出,当你再设置为输入方向的时候,不按键的时候检测到高电平,当你按下键的时候会检测到低电平,之后你是可以不用再次设置P1DIR=0XFF,P1OUT=0XFF的,因为输入端的管脚有之前的锁存了的高电平信号,给你看个图你就知道了。这种情况下,高阻态也不用考虑了,因为信号锁存了。在一个实验室还要在论坛上发帖讨论,我想可能是论坛上好玩些,而且可以互相学习。
页:
[1]