MSP430G2553(一)IO外部中斷說明與實例
這一篇文章將說明MSP430G2553的IO中斷配置,整個P1的IO都可以配置IO中斷,但中斷處理函數(shù)只有一個,MSP430和大多數(shù)MCU一樣提供上升沿、下降沿選擇。
在Launchpad上有按鍵S2,接在P1.3口,當按下后P1.3將接入高電平,從而觸發(fā)中斷。
所有寄存器的具體名稱和地址,可以查看M430G2553 datasheet 第 21頁中對于P1的寄存器定義
在實例代碼中,配置了P1.3和P1.6的LED燈,當按下P1.3的按鍵產(chǎn)生中斷,LED燈將切換點亮
1.按鍵的中斷配置
要配置按鍵中斷,需要先設(shè)置P1.3口為輸入,并且設(shè)置上拉電阻以保障穩(wěn)定性,
P1DIR &= ~BIT3;//設(shè)置P1.3為輸入
P1REN |= BIT3;//啟用P1.3電阻
在啟用電阻后,由P1OUT來配置下拉還是上拉
P1OUT |= BIT3;//設(shè)置上拉電阻
通過P1IES寄存器設(shè)置上升沿,0為下降沿
P1IES |= BIT3;//P1.3中斷邊緣選擇
需要對P1的中斷進行使能,除了這里還有總中斷需要使能(在main函數(shù)中)
P1IE |= BIT3;//P1.3中斷使能
=====================================================================
2.中斷處理函數(shù)
在中斷處理函數(shù)中處理LED程序
編譯器指示
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
delay(100);//約100ms
P1OUT ^= (1<<6);//反向P1.0和P1.6
P1OUT ^= (1<<0);
P1IFG = 0;//清除中斷標識
}
=====================================================================
源代碼:
//P1.0---------Red Led
//P1.3---------Button
//P1.6---------Green Led
#include "msp430g2553.h"
//名稱:delay(int time)
//功能:延時程序
void delay(int time)
{
static int i,j;
for(i=0;i
for(j=0;j<100;j++)
{
}
}
//名稱:InitLed()
//功能:初始化LED
void InitLed()
{
P1DIR |= BIT0+BIT6;//設(shè)置BIT0和BIT6為輸出
P1OUT &= ~0x01; //設(shè)置BIT0和BIT6低電平
P1OUT |= 0x40; //設(shè)置BIT0和BIT6低電平
}
//名稱:InitIOInterrupt()
//功能:初始化P1的按鍵中斷配置
void InitIOInterrupt()
{
P1DIR &= ~BIT3;//設(shè)置P1.3為輸入
P1REN |= BIT3;//啟用P1.3電阻
P1OUT |= BIT3;//設(shè)置上拉電阻
P1IES |= BIT3;//P1.3中斷邊緣選擇
P1IE |= BIT3;//P1.3中斷使能
P1IFG = 0x00;//清除中斷標識
}
//名稱:PORT1_ISR(void)
//功能:按鍵中斷的處理函數(shù)
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
delay(100);//約100ms
P1OUT ^= (1<<6);
P1OUT ^= (1<<0);
P1IFG = 0;//清除中斷標識
}
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
InitLed();//初始化LED端口
InitIOInterrupt();//初始化IO中斷
_EINT();//開總中斷
while(1);
return 0;
}