写了个MSP430g2553的io中断程序,初始化为P1.0P1.6为输出,P1.345为上拉输入,在按键按下之后,硬件仿真读取P1IFG寄存器值,发现PIIFG的第6位莫名置一,我想问为什么会这样,这种情况怎么解决;谢谢各位了
#include "io430.h"
#define CPU_F ((double)1000000)//设置时钟频率改变延时,为mcl时钟频率
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))//微秒级
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))//毫秒级
#define Led_Green P1DIR |=BIT6;P1OUT ^=BIT6;
void KeyGpio_Init()
{
P1DIR|=BIT0; //P1.0为输出
P1OUT &=~BIT0;
P1DIR &= ~(BIT3+BIT4+BIT5);//设置P1.345为输入
P1REN |=BIT3+BIT4+BIT5;//启动内部上下拉电阻
P1OUT |=BIT3+BIT4+BIT5;//设置为上拉电阻
P1IFG =0;
//P1IFG &=~(BIT3+BIT4+BIT5);
P1IE |=BIT3+BIT4+BIT5;//设置中断使能(位 = 1:中断被启用。)
P1IES |= BIT3+BIT4+BIT5;//位 = 1:用一个高电平到低电平转换来设定 PxIFGx 标志
__enable_interrupt(); //使能中断,这是一个C编译器支持的内部过程。
}
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
DCOCTL=CALDCO_1MHZ;
BCSCTL1=CALBC1_1MHZ;
KeyGpio_Init();
while(1)
{
Led_Green;
delay_ms(500);
}
}
#pragma vector = PORT1_VECTOR//TIMER0_A0_VECTOR
__interrupt void Port_1( void )//目标1s进一次中断
{
//__enable_interrupt(); //使能中断,这是一个C编译器支持的内部过程。
// unsigned int Bool = 0;
// Bool = P1IFG & (~P1DIR);//通过中断标志读出触发中断的键值
// delay_ms(1);//延时消除抖动
// if((P1IN&Bool)==0)//判断中断键值与当前按键按下的键值是否对应(由于IO默认设置为高电平,按下为低)
// {
// switch(Bool)
// {
// case BIT3:
// P1OUT ^= BIT0;
// break;
// case BIT4:
// P1OUT ^= BIT0;
// break;
// case BIT5:
// P1OUT ^= BIT0;
// default: break;
// }
//
// }
switch(P1IFG)//
{
case 0X08:
P1OUT ^= BIT0;
break;
case 0X10:
// P1OUT ^= BIT0;
break;
case 0X20:
// P1OUT ^= BIT0;
default: break;
}
// P1OUT ^= BIT0;
P1IFG =0;
// P1IFG &=~(BIT3+BIT4+BIT5);
} |