欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 自學(xué)分析MSP430流水燈程序,不知對(duì)錯(cuò),歡迎拍磚! [打印本頁(yè)]

作者: yyjjwan1627    時(shí)間: 2014-9-2 15:54
標(biāo)題: 自學(xué)分析MSP430流水燈程序,不知對(duì)錯(cuò),歡迎拍磚!
本帖最后由 yyjjwan1627 于 2014-9-2 16:13 編輯

1,首先上程序,因?yàn)檫@個(gè)程序百度上都有,但是一些細(xì)節(jié)自己始終弄不懂,閑下來(lái)的時(shí)候查一查,說(shuō)實(shí)話(huà),沒(méi)學(xué)過(guò)C呀,也費(fèi)了點(diǎn)勁,下面是我自己分析的,不知道對(duì)不對(duì),呵呵,
************************************************/  
#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)閉看門(mé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)入中斷程序開(kāi)始分析吧,

#pragma vector = TIMERA0_VECTOR        
__interrupt void Timer_A (void)   
{   
    if(flag == 0)    ********************************************************************************************************************
//首先f(wàn)lag被賦值為0了,所以IF表達(dá)式中(0==0),所以表達(dá)式成立了,這flag是無(wú)符號(hào)的整數(shù),不是位,所以它要執(zhí)行下面的語(yǔ)句
********************************************************************************************************************
    {  
        P2OUT = ~(0x80>>(i++));    //燈的點(diǎn)亮順序D8 -> D1   ********************************************************************************************************************
//此語(yǔ)句,拆開(kāi)分析 :0x80>>(i++), “i++”這是先拿來(lái)運(yùn)用再計(jì)算,“i”開(kā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”的語(yǔ)句
********************************************************************************************************************                                                                                    
   }  
    else if(flag == 1)  
    {  
        P2OUT = ~(0x01<<(i++));    //燈的點(diǎn)亮順序D1 -> D8                                 
********************************************************************************************************************
此語(yǔ)句表達(dá)式是flag==1時(shí),才會(huì)執(zhí)行,當(dāng)下面的“j++;“j等于10的  時(shí)候,if表達(dá)式條件滿(mǎn)足,則要執(zhí)行下面的語(yǔ)句,i,j 被賦值為0,而 flag加               1 以后等于1了,上面定義初始值賦為0,當(dāng)flag==1時(shí),滿(mǎn)足表達(dá)式,與  上面不同的是,低電平的輸出是從第0位到第8位輸出
********************************************************************************************************************
    }  
    else                                                                                                
********************************************************************************************************************
//當(dāng)“if”,"else if"表達(dá)式都不成立時(shí),則要執(zhí)行else下面的語(yǔ)句,下面使用的是“if    else”套用。
********************************************************************************************************************
    {  
        if(dir)                  //燈的點(diǎn)亮順序  D8 -> D1,D1 -> D8,循環(huán)繞圈  
********************************************************************************************************************  //當(dāng)if(dir)中,dir為非0時(shí),執(zhí)行下面的語(yǔ)句,如果為0時(shí),則要執(zhí)行"else"的語(yǔ)句, dir初始值被賦值為0了,當(dāng) D8->D1時(shí),i==8時(shí),i被賦值為0,還有DIR被  取反 ,就是dir開(kāi)始是0,現(xiàn)在是1,當(dāng)D1 ->D8時(shí),i==8時(shí),i再次被賦值為0,dir取反以后是0了, dir的來(lái)回取反,決定了  D8 -> D1,D1 -> D8,循環(huán)繞圈。個(gè)  人感覺(jué)應(yīng)該是從D1 到D8,D8再到D1,不知對(duì)否?      
********************************************************************************************************************   
        {  
            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,并沒(méi)有分頻時(shí)的時(shí)鐘源。
********************************************************************************************************************
        switch(speed)//根據(jù)speed的值來(lái)選擇相應(yīng)的速度,速度的選擇主要通過(guò)改變分頻來(lái)實(shí)現(xiàn)   
        {  
        case 0:  
            TACTL &=~ (ID0 + ID1);//這個(gè)地方其實(shí)沒(méi)必要,意思是清零TACTL的78兩位   
            //ID1的值是0x0080   ID2的值是0x0040通過(guò)計(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:開(kāi)始分頻作為流 動(dòng)速。  break,跳出SWITCH
********************************************************************************************************************
        if(speed == 4) speed = 0;                                                      
********************************************************************************************************************
//當(dāng)speed ==4時(shí), speed被賦值為了,這時(shí)從第Case  0:開(kāi)始分頻作為流動(dòng)速度。 break,跳出SWITCH
    }                                                                                                  
}  


總結(jié):要想學(xué)好單片機(jī),還是要熟悉C語(yǔ)言呀,里面全是一些命令語(yǔ)句,控制語(yǔ)句,嵌套語(yǔ)句,哎,頭痛呀,再有一個(gè),我感覺(jué)這個(gè)程序理解上不易,是           不是可以把程序簡(jiǎn)化,作延時(shí)函數(shù)還好理解一點(diǎn)。水平有限,都是自己摸索的,不知道對(duì)不對(duì),不對(duì)的給指證一下。





作者: daliu    時(shí)間: 2014-9-2 16:01
樓主發(fā)的程序?qū)ξ业萴sp430的初學(xué)者很有用 先收藏 理解一下
作者: piqiu    時(shí)間: 2014-9-2 16:03
樓主的分析完全正確 給詳細(xì)  太給力了  先謝樓主
作者: yyjjwan1627    時(shí)間: 2014-9-2 16:05
謝謝,初次寫(xiě)看了單片機(jī)有8天左右了,有不對(duì)的歡迎指正!
作者: admin    時(shí)間: 2014-9-2 18:38
我剛才詳細(xì)看了一下,你的分析基本上是正確的,還沒(méi)有找到有錯(cuò)誤的地方,謝謝分享這對(duì)初學(xué)者很有用
作者: admin    時(shí)間: 2014-9-2 18:41
不過(guò),在一般的情況下,不建議寫(xiě)這么長(zhǎng)的中斷函數(shù),中斷函數(shù)應(yīng)該盡量減短,改變一些標(biāo)志位就可以了,然后在主程序里面判斷
作者: yyjjwan1627    時(shí)間: 2014-9-2 20:31
admin 發(fā)表于 2014-9-2 18:41
不過(guò),在一般的情況下,不建議寫(xiě)這么長(zhǎng)的中斷函數(shù),中斷函數(shù)應(yīng)該盡量減短,改變一些標(biāo)志位就可以了,然后在 ...

好的,以后要注意。這是一個(gè)官方的程序,我對(duì)著這個(gè)官方的程序一點(diǎn)點(diǎn)的查資料弄清楚是怎么回事,還沒(méi)有編寫(xiě)的經(jīng)驗(yàn),以后會(huì)多學(xué)習(xí)的,
作者: mqwu    時(shí)間: 2014-9-11 14:05
你用的是一個(gè)I/O Port, 為什么不用數(shù)組,根據(jù)數(shù)組編排這樣可以組合幾十種流水燈,在中斷內(nèi)執(zhí)行冗長(zhǎng)的函數(shù)是不可取的
作者: zzyhyx    時(shí)間: 2015-6-4 09:54
不過(guò),在一般的情況下,不建議寫(xiě)這么長(zhǎng)的中斷函數(shù),中斷函數(shù)應(yīng)該盡量減短,改變一些標(biāo)志位就可以了,然后在主程序里面判斷
作者: fuliang    時(shí)間: 2015-10-18 00:58
謝謝樓主的程序了
作者: hs3690    時(shí)間: 2015-11-7 06:27
謝謝樓主分享  先收藏了
作者: 51aaaa    時(shí)間: 2022-3-31 16:48
趕緊學(xué)習(xí)一波




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1