这几天看了一下169的按键和中断应用。

一直很纠结PxDIR。下面就用例子记录

比如用流水灯来作为中断:



#include <msp430f169.h>

/**
* main.c
*/
void delay_ms(int ms) //延时函数
{
for(;ms>0;ms--) __delay_cycles(1000);
}
void main()
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
int i=0,j=0;
P6DIR = 0xff; //将引脚端口设为输出模式(必须的)
P6OUT = 0xff; //将六个LED灯全置低电平

P1DIR &= ~BIT0; //将引脚设为输入模式
P1OUT = BIT0; //P1.0的按键S1打开

P1DIR &= ~BIT1; //将引脚设为输入模式
P1OUT |= BIT1; //P1.1的按键S2打开

P1IE |= BIT0; //P1.0按键S1允许中断
P1IES |= BIT0; //P1.0下降沿使相应中断标志置位

P1IE |= BIT1; //P1.1按键S2允许中断
P1IES |= BIT1; //P1.1下降沿使相应中断标志置位

_EINT(); //开启全局中断

}
//中断子函数
#pragma vector=PORT1_VECTOR //设置中断向量(必有)
__interrupt void PORT1_key()
{
_DINT(); //先关闭全局中断,防止重复中断
int i=0,j=0;
if(P1IFG & BIT0) //判断是否是按键S1按下
{
while(1)
{
for(i=0;i<8;i++)
{
P6OUT &= ~((0x01)<<i); //一个一个连着亮,从左到右点亮到第八个
delay_ms(100);
}

P6OUT = 0xff;

for(j=0;j<8;j++)
{
P6OUT &= ~((0x80)>>j); //一个一个点亮,从右到左点亮到第一个
delay_ms(100);
}
P6OUT = 0xff;
}
}
else if(P1IFG & BIT1) //判断是否是按键S2按下
{
while(1)
{
for(i=0;i<8;i++)
{
P6OUT &= ~((0x01)<<i); //LED灯的从做到右的流动(一个一个)
delay_ms(100);
P6OUT = 0xff;
}


for(j=0;j<8;j++)
{
P6OUT &= ~((0x80)>>j); //LED灯从右到左流动(一个一个)
delay_ms(100);
P6OUT = 0xff;
}

}
}
P1IFG = 0x00; //清除中断标志位(必须)
}


还要抓紧学呜呜呜。加油