|
本帖最后由 yyjjwan1627 于 2014-9-2 16:13 編輯
1,首先上程序,因?yàn)檫@個(gè)程序百度上都有,但是一些細(xì)節(jié)自己始終弄不懂,閑下來的時(shí)候查一查,說實(shí)話,沒學(xué)過C呀,也費(fèi)了點(diǎn)勁,下面是我自己分析的,不知道對不對,呵呵,
************************************************/
#include <msp430x14x.h>
typedef unsigned int uint;
uint i = 0,j = 0,dir = 0;
uint flag = 0,speed = 0; //flag--燈光流動(dòng)方式,speed--燈光流動(dòng)速度
***********************************************************************************
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //關(guān)閉看門狗
P6DIR |= BIT2;P6OUT |= BIT2; //關(guān)閉電平轉(zhuǎn)換
P5OUT &= ~BIT7;
CCTL0 = CCIE; //使能CCR0中斷
CCR0 = 50000;
TACTL = TASSEL_2 + ID_3 + MC_1; //定時(shí)器A的時(shí)鐘源選擇SMCLK,8分頻增計(jì)數(shù)模式
P2DIR = 0xff; //設(shè)置P2口方向?yàn)檩敵?nbsp;
P2OUT = 0xff;
_EINT(); //使能全局中斷
LPM0; //CPU進(jìn)入LPM0模式各時(shí)鐘全部工作
}
我從進(jìn)入中斷程序開始分析吧,
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
if(flag == 0) ********************************************************************************************************************
//首先flag被賦值為0了,所以IF表達(dá)式中(0==0),所以表達(dá)式成立了,這flag是無符號的整數(shù),不是位,所以它要執(zhí)行下面的語句
********************************************************************************************************************
{
P2OUT = ~(0x80>>(i++)); //燈的點(diǎn)亮順序D8 -> D1 ********************************************************************************************************************
//此語句,拆開分析 :0x80>>(i++), “i++”這是先拿來運(yùn)用再計(jì)算,“i”開始被賦值為0,“>>”表示把“0X80右移多少位,第一次執(zhí)行把”0x80==10000000“往右移動(dòng)0 位 “~”此表示取反,則把“100000000”取反得"01111111"表示最高位輸出低電平,下一 周期if表達(dá)式還是成立的,則把“10000000”右移動(dòng)1位,這一周期i==1了,這時(shí)再取 反得到“10111111”第6位輸出低電平,低次輸出低電平,這時(shí)下面的i累加到7位 j++;也是每一周期加1,當(dāng)if(flag==0)時(shí),不執(zhí)行,“else if”和“else”的語句
********************************************************************************************************************
}
else if(flag == 1)
{
P2OUT = ~(0x01<<(i++)); //燈的點(diǎn)亮順序D1 -> D8
********************************************************************************************************************
此語句表達(dá)式是flag==1時(shí),才會(huì)執(zhí)行,當(dāng)下面的“j++;“j等于10的 時(shí)候,if表達(dá)式條件滿足,則要執(zhí)行下面的語句,i,j 被賦值為0,而 flag加 1 以后等于1了,上面定義初始值賦為0,當(dāng)flag==1時(shí),滿足表達(dá)式,與 上面不同的是,低電平的輸出是從第0位到第8位輸出
********************************************************************************************************************
}
else
********************************************************************************************************************
//當(dāng)“if”,"else if"表達(dá)式都不成立時(shí),則要執(zhí)行else下面的語句,下面使用的是“if else”套用。
********************************************************************************************************************
{
if(dir) //燈的點(diǎn)亮順序 D8 -> D1,D1 -> D8,循環(huán)繞圈
******************************************************************************************************************** //當(dāng)if(dir)中,dir為非0時(shí),執(zhí)行下面的語句,如果為0時(shí),則要執(zhí)行"else"的語句, dir初始值被賦值為0了,當(dāng) D8->D1時(shí),i==8時(shí),i被賦值為0,還有DIR被 取反 ,就是dir開始是0,現(xiàn)在是1,當(dāng)D1 ->D8時(shí),i==8時(shí),i再次被賦值為0,dir取反以后是0了, dir的來回取反,決定了 D8 -> D1,D1 -> D8,循環(huán)繞圈。個(gè) 人感覺應(yīng)該是從D1 到D8,D8再到D1,不知對否?
********************************************************************************************************************
{
P2OUT = ~(0x80>>(i++));
}
else
{
P2OUT = ~(0x01<<(i++));
}
}
if(i == 8)
********************************************************************************************************************
//這是當(dāng)i==8時(shí),則要執(zhí)行,i被賦值為0,dir 的取反,
********************************************************************************************************************
{
i = 0;
dir = ~dir;
}
j++; ********************************************************************************************************************
//初始值被賦值為0,每次周期運(yùn)算完以后+1,直到J==10時(shí),
********************************************************************************************************************
if(j == 10)
********************************************************************************************************************
//當(dāng)J==10時(shí),執(zhí)行 "i" "j" 被賦值為0,flag等于1,
********************************************************************************************************************
{
i = 0;
j = 0;
flag++;
if(flag == 4) flag = 0;
******************************************************************************************************************** //到這if表達(dá)式當(dāng)中又套用“switch case (break)”,先看表達(dá)式,當(dāng) flag == 4 時(shí),flag被賦 為0了,在這之前,“switch case ”并不工作,因?yàn)镮f表達(dá)式?jīng)]有成立,時(shí)鐘是用的上面的主 程序SMCLK,并沒有分頻時(shí)的時(shí)鐘源。
********************************************************************************************************************
switch(speed)//根據(jù)speed的值來選擇相應(yīng)的速度,速度的選擇主要通過改變分頻來實(shí)現(xiàn)
{
case 0:
TACTL &=~ (ID0 + ID1);//這個(gè)地方其實(shí)沒必要,意思是清零TACTL的78兩位
//ID1的值是0x0080 ID2的值是0x0040通過計(jì)算就可以得出
TACTL |= ID_3;//改為八分頻
break;
case 1:
TACTL &=~ (ID0 + ID1);
TACTL |= ID_2;
break;
case 2:
TACTL &=~ (ID0 + ID1);
TACTL |= ID_1;
break;
case 3:
TACTL &=~ (ID0 + ID1);
TACTL |= ID_0;
break;
default:
break;
}
if(flag != 3) speed++;
********************************************************************************************************************//每三種方式都走完時(shí),才會(huì)到下面的IF程序這兒。當(dāng) flag==0時(shí),不等于3,所以發(fā)speed加1等于1,從第一種Case 1:開始分頻作為流 動(dòng)速。 break,跳出SWITCH
********************************************************************************************************************
if(speed == 4) speed = 0;
********************************************************************************************************************
//當(dāng)speed ==4時(shí), speed被賦值為了,這時(shí)從第Case 0:開始分頻作為流動(dòng)速度。 break,跳出SWITCH
}
}
總結(jié):要想學(xué)好單片機(jī),還是要熟悉C語言呀,里面全是一些命令語句,控制語句,嵌套語句,哎,頭痛呀,再有一個(gè),我感覺這個(gè)程序理解上不易,是 不是可以把程序簡化,作延時(shí)函數(shù)還好理解一點(diǎn)。水平有限,都是自己摸索的,不知道對不對,不對的給指證一下。
|
評分
-
查看全部評分
|