對於剛接觸MSP430的人, 最簡單的操作就是控制IO, 所以這篇就來介紹如何利用利用MSP430的IO來控制LaunchPad上面的LED.

範例程式如下:


首先, 我們看到的是WDTCTL的暫存器, 這是用來控制Watchdog的功能. Watchdog的功能可以看成一個計時器(timer), 當今天計時器倒數完後, 系統就會重新啟動(reboot), 所以在嵌入式系統中, 必須在Watchdog倒數結束前, 恢復倒數的時間, 否則系統將會重新啟動. 這個功能主要是用來避免系統因當機而停擺. 當系統當機時, Watchdog將不會被恢復倒數時間, 所以系統會重新啟動. 然而在我們範例中並不需要使用到這個功能, 所以我們把Watchdog的功能給關閉.

WDTCTL = WDTPW + WDTHOLD; 


接著我們要設定Port1的每個腳位是輸出還是輸入, 這時候我們必須透過P1DIR這個暫存器來做設定(1則是輸出, 如果是0則是輸入). 0x41換成2進位則是 0100 0001, 表示P1.0跟P1.6為MSP430的輸出. 這樣我們就可以透過這兩個腳位來控制LED.

P1DIR |= 0x41;


再來則是輸出P1.0和P1.6的訊號, 利用P1OUT這個暫存器來做設定. 這邊利用XOR的特性, 讓每次程式跑到這行, P1.0和P1.6的輸出值會與上次相反, 達成燈亮或燈暗的情況.

P1OUT ^= 0x41; 


最後, 因為程式執行的速度很快, 我們將無法分辨出燈的亮暗變化, 所以我們加入了一個do while迴圈來造成時間上的延遲. 當設定完輸出時, 必須要等待變數i從5000遞減到0, 因此達成延遲的效果.

i = 50000;
do {
i--;
} while (i != 0);

這邊有個特別要注意的關鍵字"volatile", 我們把變數宣告成 volatile, 讓編譯器知道這個變數是易變的, 不能對這個變數做最佳化處理, 以避免不可預期的問題產生. (簡單的說就是每次遇到這個值時, 必須重新去讀取, 而不能使用原本暫存器儲存的值)

volatile unsigned int i;


按照上面這些步驟, 如果你看到LaunchPad上面的兩顆LED燈在不斷的閃爍, 恭喜你! 已經成功完成學習LaunchPad的第一步了!

創作者介紹
創作者 學無止境 的頭像
kuojed

學無止境

kuojed 發表在 痞客邦 留言(0) 人氣( 2067 )