為了寫一篇文章做鋪墊--提醒著自己,,,,,,
這兩天一直在尋找
#pragmavector=PORT1_VECTOR__interruptvoidP1_Interrupt()//P1口中斷函數{}
對于這兩句話的解釋,最起碼讓自己感覺能說服自己
看了好多后自己的理解
#pragmavector=PORT1_VECTOR
通俗來講這句話是告訴C編譯器,你下面的函數是P1口的中斷函數,P1口有中斷發(fā)生時就進入下面這個函數
__interruptvoidP1_Interrupt()//P1口中斷函數{}
那期間到底發(fā)生了什么其實MSP430內部有一個中斷向量表----中斷向量表實際就是保存中斷函數入口地址的存儲單元空間假如說,下面是表的一段,,,,假如說,,,,,[object Object]
那么
#pragmavector=PORT1_VECTOR就應該這樣理解告訴編譯器下面有一個P1口的中斷服務函數,你應該把這個中斷函數的地址放在
__interrupt //告訴編譯器這是個中斷服務函數
再舉一個例子,假設寫一個串口接收中斷函數
#pragmavector=UART0RX_VECTOR__interruptvoidUart_Receive(){ }
其實
#pragmavector=UART0RX_VECTOR后面的
UART0RX_VECTOR就是在告訴編譯器,下面的中斷函數是串口接收中斷服務函數,你要把它的服務函數地址放到保存串口接收中斷服務函數的地址里
對了后面
PORT1_VECTORP1口中斷
PORT2_VECTORP2口中斷
UART0RX_VECTOR串口接收中斷
UART0TX_VECTOR串口發(fā)送中斷TIMER0_A0_VECTOR定時器A中斷
干脆盜一張圖
,,,,,,,,,
正事,
對于引腳中斷,學過51的都知道無非就是打開中斷,,然后選擇觸發(fā)方式,然后寫中斷函數,然后再中斷函數里清除中斷標志(假如說.它不自動清除中斷標志的話)
P1.2口有一的下降沿P1.0口的引腳反轉
#include"io430.h"voidmain(void){//StopwatchdogtimertopreventtimeoutresetWDTCTL=WDTPW+WDTHOLD;P1DIR"=BIT0;//p1.0輸出模式P1IE|=BIT2;//使能p1.2中斷P1IES|=BIT2;//下降沿觸發(fā)P1IFG&=~BIT2;//清除p1.2中斷,,感覺可有可無,加上更顯得代碼很完善__enable_interrupt();while(1){}}#pragmavector=PORT1_VECTOR__interruptvoidP1_Interrupt()//P1口中斷函數{if(P1IFG&BIT2)//P1.2口來中斷啦{P1IFG&=~BIT2;//清除P1.2引腳中斷標志位P1OUT^=BIT0;//P1.0引腳取反}}
假如說我P1.2和P1.3都想用中斷呢
P1.2口有一的下降沿P1.0口的引腳反轉
P1.3口有一的下降沿P1.1口的引腳反轉
#include"io430.h"voidmain(void){//StopwatchdogtimertopreventtimeoutresetWDTCTL=WDTPW+WDTHOLD;P1DIR"=BIT0;//p1.0輸出模式P1DIR|=BIT1;//p1.1輸出模式P1IE|=BIT2;//使能p1.2中斷P1IES|=BIT2;//下降沿觸發(fā)P1IFG&=~BIT2;//清除p1.2中斷P1IE|=BIT3;//使能p1.3中斷P1IES|=BIT3;//下降沿觸發(fā)P1IFG&=~BIT3;//清除p1.3中斷__enable_interrupt();while(1){}}#pragmavector=PORT1_VECTOR__interruptvoidP1_Interrupt()//P1口中斷函數{if(P1IFG&BIT2)//如果P1.2有中斷{P1IFG&=~BIT2;//清除P1.2引腳中斷標志位P1OUT^=BIT0;//P1.0引腳取反}if(P1IFG&BIT3)//如果P1.3有中斷{P1IFG&=~BIT3;//清除P1.3引腳中斷標志位P1OUT^=BIT1;//P1.1引腳取反}}
其實自己有點疑惑,,,為什么燈同時亮滅呢!同時觸發(fā),同時檢測嗎?,難道P1口是一個整體,那就太好了,同時用中斷檢測多路,不怕信號同時到來,,,,,,