久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14852|回復: 11
收起左側

自學分析MSP430流水燈程序,不知對錯,歡迎拍磚!

[復制鏈接]
ID:65446 發表于 2014-9-2 15:54 | 顯示全部樓層 |閱讀模式
本帖最后由 yyjjwan1627 于 2014-9-2 16:13 編輯

1,首先上程序,因為這個程序百度上都有,但是一些細節自己始終弄不懂,閑下來的時候查一查,說實話,沒學過C呀,也費了點勁,下面是我自己分析的,不知道對不對,呵呵,
************************************************/  
#include  <msp430x14x.h>   
typedef unsigned int  uint;  
uint i = 0,j = 0,dir = 0;  
uint flag = 0,speed = 0;  //flag--燈光流動方式,speed--燈光流動速度   



***********************************************************************************
void main(void)  
{  

WDTCTL = WDTPW + WDTHOLD;       //關閉看門狗   
    P6DIR |= BIT2;P6OUT |= BIT2;    //關閉電平轉換   
    P5OUT &= ~BIT7;  

    CCTL0 = CCIE;                   //使能CCR0中斷   
    CCR0 = 50000;  
    TACTL = TASSEL_2 + ID_3 + MC_1; //定時器A的時鐘源選擇SMCLK,8分頻增計數模式   
    P2DIR = 0xff;                   //設置P2口方向為輸出   
    P2OUT = 0xff;  

    _EINT();                        //使能全局中斷   
    LPM0;                           //CPU進入LPM0模式各時鐘全部工作   
}  

我從進入中斷程序開始分析吧,

#pragma vector = TIMERA0_VECTOR        
__interrupt void Timer_A (void)   
{   
    if(flag == 0)    ********************************************************************************************************************
//首先flag被賦值為0了,所以IF表達式中(0==0),所以表達式成立了,這flag是無符號的整數,不是位,所以它要執行下面的語句
********************************************************************************************************************
    {  
        P2OUT = ~(0x80>>(i++));    //燈的點亮順序D8 -> D1   ********************************************************************************************************************
//此語句,拆開分析 :0x80>>(i++), “i++”這是先拿來運用再計算,“i”開始被賦值為0,“>>”表示把“0X80右移多少位,第一次執行把”0x80==10000000“往右移動0 位    “~”此表示取反,則把“100000000”取反得"01111111"表示最高位輸出低電平,下一 周期if表達式還是成立的,則把“10000000”右移動1位,這一周期i==1了,這時再取 反得到“10111111”第6位輸出低電平,低次輸出低電平,這時下面的i累加到7位  j++;也是每一周期加1,當if(flag==0)時,不執行,“else if”和“else”的語句
********************************************************************************************************************                                                                                    
   }  
    else if(flag == 1)  
    {  
        P2OUT = ~(0x01<<(i++));    //燈的點亮順序D1 -> D8                                 
********************************************************************************************************************
此語句表達式是flag==1時,才會執行,當下面的“j++;“j等于10的  時候,if表達式條件滿足,則要執行下面的語句,i,j 被賦值為0,而 flag加               1 以后等于1了,上面定義初始值賦為0,當flag==1時,滿足表達式,與  上面不同的是,低電平的輸出是從第0位到第8位輸出
********************************************************************************************************************
    }  
    else                                                                                                
********************************************************************************************************************
//當“if”,"else if"表達式都不成立時,則要執行else下面的語句,下面使用的是“if    else”套用。
********************************************************************************************************************
    {  
        if(dir)                  //燈的點亮順序  D8 -> D1,D1 -> D8,循環繞圈  
********************************************************************************************************************  //當if(dir)中,dir為非0時,執行下面的語句,如果為0時,則要執行"else"的語句, dir初始值被賦值為0了,當 D8->D1時,i==8時,i被賦值為0,還有DIR被  取反 ,就是dir開始是0,現在是1,當D1 ->D8時,i==8時,i再次被賦值為0,dir取反以后是0了, dir的來回取反,決定了  D8 -> D1,D1 -> D8,循環繞圈。個  人感覺應該是從D1 到D8,D8再到D1,不知對否?      
********************************************************************************************************************   
        {  
            P2OUT = ~(0x80>>(i++));                                             
        }  
        else  
        {  
            P2OUT = ~(0x01<<(i++));  
        }  
    }  

    if(i == 8)                                                                              
********************************************************************************************************************
//這是當i==8時,則要執行,i被賦值為0,dir 的取反,              
********************************************************************************************************************
    {  
        i = 0;  
        dir = ~dir;  
    }  

    j++;                                                                                ********************************************************************************************************************
//初始值被賦值為0,每次周期運算完以后+1,直到J==10時,
********************************************************************************************************************
    if(j == 10)           
********************************************************************************************************************
  //當J==10時,執行   "i"   "j" 被賦值為0,flag等于1,
********************************************************************************************************************
    {  
        i = 0;  
        j = 0;  
        flag++;  
        if(flag == 4) flag = 0;         
********************************************************************************************************************  //到這if表達式當中又套用“switch   case  (break)”,先看表達式,當 flag == 4 時,flag被賦   為0了,在這之前,“switch  case ”并不工作,因為If表達式沒有成立,時鐘是用的上面的主  程序SMCLK,并沒有分頻時的時鐘源。
********************************************************************************************************************
        switch(speed)//根據speed的值來選擇相應的速度,速度的選擇主要通過改變分頻來實現   
        {  
        case 0:  
            TACTL &=~ (ID0 + ID1);//這個地方其實沒必要,意思是清零TACTL的78兩位   
            //ID1的值是0x0080   ID2的值是0x0040通過計算就可以得出   
            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++;           
********************************************************************************************************************//每三種方式都走完時,才會到下面的IF程序這兒。當 flag==0時,不等于3,所以發speed加1等于1,從第一種Case 1:開始分頻作為流 動速。  break,跳出SWITCH
********************************************************************************************************************
        if(speed == 4) speed = 0;                                                      
********************************************************************************************************************
//當speed ==4時, speed被賦值為了,這時從第Case  0:開始分頻作為流動速度。 break,跳出SWITCH
    }                                                                                                  
}  


總結:要想學好單片機,還是要熟悉C語言呀,里面全是一些命令語句,控制語句,嵌套語句,哎,頭痛呀,再有一個,我感覺這個程序理解上不易,是           不是可以把程序簡化,作延時函數還好理解一點。水平有限,都是自己摸索的,不知道對不對,不對的給指證一下。




評分

參與人數 2威望 +12 黑幣 +12 收起 理由
piqiu + 5 + 5 贊一個!
daliu + 7 + 7 很給力!

查看全部評分

回復

使用道具 舉報

ID:65608 發表于 2014-9-2 16:01 | 顯示全部樓層
樓主發的程序對我等msp430的初學者很有用 先收藏 理解一下
回復

使用道具 舉報

ID:51089 發表于 2014-9-2 16:03 | 顯示全部樓層
樓主的分析完全正確 給詳細  太給力了  先謝樓主
回復

使用道具 舉報

ID:65446 發表于 2014-9-2 16:05 | 顯示全部樓層
謝謝,初次寫看了單片機有8天左右了,有不對的歡迎指正!
回復

使用道具 舉報

ID:1 發表于 2014-9-2 18:38 來自觸屏版 | 顯示全部樓層
我剛才詳細看了一下,你的分析基本上是正確的,還沒有找到有錯誤的地方,謝謝分享這對初學者很有用
回復

使用道具 舉報

ID:1 發表于 2014-9-2 18:41 來自觸屏版 | 顯示全部樓層
不過,在一般的情況下,不建議寫這么長的中斷函數,中斷函數應該盡量減短,改變一些標志位就可以了,然后在主程序里面判斷
回復

使用道具 舉報

ID:65446 發表于 2014-9-2 20:31 | 顯示全部樓層
admin 發表于 2014-9-2 18:41
不過,在一般的情況下,不建議寫這么長的中斷函數,中斷函數應該盡量減短,改變一些標志位就可以了,然后在 ...

好的,以后要注意。這是一個官方的程序,我對著這個官方的程序一點點的查資料弄清楚是怎么回事,還沒有編寫的經驗,以后會多學習的,
回復

使用道具 舉報

ID:66032 發表于 2014-9-11 14:05 | 顯示全部樓層
你用的是一個I/O Port, 為什么不用數組,根據數組編排這樣可以組合幾十種流水燈,在中斷內執行冗長的函數是不可取的
回復

使用道具 舉報

ID:81990 發表于 2015-6-4 09:54 | 顯示全部樓層
不過,在一般的情況下,不建議寫這么長的中斷函數,中斷函數應該盡量減短,改變一些標志位就可以了,然后在主程序里面判斷
回復

使用道具 舉報

ID:92785 發表于 2015-10-18 00:58 | 顯示全部樓層
謝謝樓主的程序了
回復

使用道具 舉報

ID:65226 發表于 2015-11-7 06:27 來自觸屏版 | 顯示全部樓層
謝謝樓主分享  先收藏了
回復

使用道具 舉報

ID:1014643 發表于 2022-3-31 16:48 | 顯示全部樓層
趕緊學習一波
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区 | 日本午夜精品一区二区三区 | 日本一二区视频 | 日本黄色的视频 | 九九热九九 | 毛片一级片 | 欧美日韩高清一区二区三区 | 国产精品国产成人国产三级 | 欧美啪啪网站 | 一区二区三区国产 | 国产成人精品一区二区三 | 在线视频日韩精品 | 欧美日韩网站 | 99久久婷婷国产综合精品 | 欧美a在线 | 亚洲男人天堂 | 久久久人| 特级特黄特色的免费大片 | 午夜精品一区二区三区在线播放 | 日韩精品国产精品 | 一区二区中文字幕 | 日本精品视频一区二区 | 伊人狠狠 | 精品国产精品三级精品av网址 | 在线午夜电影 | 亚洲一区二区三区免费视频 | 亚洲欧美日韩一区二区 | 日韩视频 中文字幕 | 一区二区三区中文字幕 | 特级毛片爽www免费版 | 欧美九九| 中文字幕一区二区三区精彩视频 | 亚洲一区久久 | 精品欧美乱码久久久久久1区2区 | 97超碰成人| 日韩欧美在线视频播放 | 亚洲一区 中文字幕 | 国产成人99久久亚洲综合精品 | 黄色免费av | 国产黄色网址在线观看 | 欧美精品一区二区免费 |