使用MSP430F149的開發板,首先對LED閃爍燈的例程進行講解,然后下邊是自己寫的,將部分代碼寫入了新建的led.c程序中
#include <msp430x14x.h> // 這是程序都要包含的頭文件,里邊包含的很多寄存器和接口函數 void main(void) { /*下面六行程序關閉所有的IO口*/ P1DIR = 0XFF;P1OUT = 0XFF; // P1DIR是P1端口的方向寄存器,DIR:direction register 當他為0的時候表示輸入模式 P2DIR = 0XFF;P2OUT = 0XFF; // 0xff表示二進制的1111 1111,正好對應八個I/O口 P3DIR = 0XFF;P3OUT = 0XFF; // P1OUT是輸出寄存器,OUT:output register 當他為0的時候表示輸出低電平,1的時候為輸出高電平 P4DIR = 0XFF;P4OUT = 0XFF; P5DIR = 0XFF;P5OUT = 0XFF; P6DIR = 0XFF;P6OUT = 0XFF; // 以上是對板子的初始化,沒有具體功能,在32中我們沒有都進行配置是因為32最開始就是默認輸出高電平 WDTCTL = WDTPW + WDTHOLD; //關閉看門狗 // MSP430板子是默認開啟看門狗的,那為什么要關掉它呢? // 因為開啟看門狗后,你要不定時的喂狗(計數清零),如果不喂狗,程序就會間隔着復位。 // WDTCTL是看門狗定時器寄存器,watch dog timer control register // WDTHOLD 是看門狗停止位,當為0的時候是激活的,為1的時候是關閉的 // WDTHOLD在頭文件中是0x0080,低八位是1000 0000,所以就關閉了看門狗 P6DIR |= BIT2;P6OUT |= BIT2; //關閉電平轉換 CCTL0 = CCIE; //使能CCR0中斷 // CCTL0是比較/捕獲寄存器的控制器(capture control register),當是0禁止中斷,1開啟中斷, CCR0 = 2047; //設定周期0.5S // 這個是設置中斷時長的,因為下邊這個語句用的ACLK(輔助時鍾且經過了八分頻) // 本來是32768HZ,經過八分頻,就是4096HZ // 4096HZ的意思就是計數器每加1所需要的時間就是1/4096秒,如果CCR0等於4096,那么就是1s產生一個中斷 TACTL = TASSEL_1 + ID_3 + MC_1; // 定時器A的時鍾源選擇ACLK,增計數模式 // TACTL指的是timer a這個計數器寄存器的控制器,timer A control register 然后有多種模式可以選擇。 // TASSEL:timer A source select 時鍾源的選擇,這里選擇的是ACLK(輔助時鍾源:Auxillary Cloclk) // ID: input divider 分頻器,,可以是1,2,4,8分頻,這里選擇的八分頻 // MC:mode control 模式選擇,這里選擇的模式是從0開始計數,計到CCR0就會產生一次中斷,然后繼續從零開始 P2DIR = 0xff; //設置P2口方向為輸出 P2OUT = 0xff; _EINT(); //使能全局中斷 // EINT : enable interrupt 使能中斷,與他對應的是_DINT: disable interrupt LPM3; //CPU進入LPM3模式 // LPM: low power mode 進入低功耗模式,現在只有ACLK時鍾可以用 } /******************************************* 函數名稱:Timer_A 功 能:定時器A的中斷服務函數 參 數:無 返回值 :無 ********************************************/ #pragma vector = TIMERA0_VECTOR __interrupt void Timer_A (void) { P2OUT ^= 0xff; //P2口輸出取反 // ^表示異或,這里0 xor 1=1; 1 xor 1=0;可以起到取反。 }
****************下邊是我自己寫的,其實都差不多,不過我喜歡32那種,把初始化都獨立起來******************
main函數
#include <MSP430x14x.h> #include "led.h" void main( void ) { LED_Init(); CCTL0=CCIE;//turn on the interrupt CCR0=4096;// 1s TACTL=TASSEL_1+ID_3+MC_1;//TASSEL: timer A source select //ID: input divider //MC: mode control _EINT(); LPM3; } /**@brief timer A CCR0 interrupt *@param no *@retval no */ #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A_CCR0 (void) { P2OUT ^= 0xff; //XOR }
led.c
#include "led.h" #include <MSP430x14x.h> void LED_Init() { //make fority eight general-purpose i/o output high level P1DIR=0xff; P1OUT=0xff;//DIR:direction register -- 0:input mode --1:output mode P2DIR=0xff; P2OUT=0xff;//OUT:low or high output level --0:low --1:high P3DIR=0xff; P3OUT=0xff;//eight bits represent eight pin P4DIR=0xff; P4OUT=0xff; P5DIR=0xff; P5OUT=0xff; P6DIR=0xff; P6OUT=0xff; // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;//WDTCTL:watch dog timer register --16 bits //the 8th bit: --0: proper function --1:stop work P6DIR |= BIT2;P6OUT |= BIT2; }
led.h
#ifndef _LED_H #define _LED_H void LED_Init(void); #endif
本人愚昧,上邊如果有錯誤,還希望各位指正。