P1、P2口作中断功能寄存器配置(涉及的x只能为1或者2)
1、PxIV,Px 口中断向量寄存器(仅低5位到低1位为有效位)
中断向量值 中断源 中断标志 中断优先级
00h 无中断
02h Px.0口中断 PxIFG.0 最高
04h Px.1口中断 PxIFG.1
06h Px.2口中断 PxIFG.2
08h Px.3口中断 PxIFG.3
0Ah Px.4口中断 PxIFG.4
0Ch Px.5口中断 PxIFG.5
0Eh Px.6口中断 PxIFG.6
10h Px.7口中断 PxIFG.7 最低
2、PxIES,Px口中断触发沿选择寄存器
0 上升沿PxIFGx标志位置位
1 下降沿PxIFGx标志位置位
3、PxIFG,Px口中断标志寄存器
0 无中断
1 有中断
4、PxIE,Px 口中断使能寄存器
0 关闭相应端口中断
1 使能相应端口中断
这里顺便提一下IO中断函数的写法:
#pragma vector=PORTx_VECTOR
__interrupt void 自定义中断函数名(void)
{
//中断服务函数
}
P1、P2口作中断功能使用举例
说明:在此例程中,先打开LED1,关闭LED2,每当检测到按键的下降沿便会进入中断,中断的服务程序是将LED1和LED2状态取反。其实,次程序存在误触发,如果知道要进行哪个IO口中断的话,在执行中断服务程序之前可以进行误触发检测(即延时并检测按键是否按下,不过,这个好像只适合下降触发触发)。
#include
void main()
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P8DIR |= BIT2 + BIT1;//设置P8.1、P8.2为输出
P8OUT |= BIT2;//P8.2为输出为1
P8OUT &= ~BIT1;//P8.1为输出为0
_EINT(); //开启总中断
P1DIR &=~BIT7; //设置P1.7为输入
P1OUT |= BIT7; //上拉,有时候不上拉可以,有时候不可以,所以最好上拉
P1REN |= BIT7; //设为输入时必须加上此寄存器配置
P1IE |= BIT7; //打开P1.7口中断
P1IES &=~BIT7; //触发方式为下降沿
P1IFG &=~BIT7; //清中断标志位
LPM3;//进入低功耗3
}
#pragma vector = PORT1_VECTOR
__interrupt void Port1(void)
{
P8OUT ^= BIT2 + BIT1;//P8.1、P8.2为输出取反
P1IFG &=~BIT7; //清中断标志位
}