www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導讀]在一個程序的編寫過程中,隨著代碼量的增加,如果把所有的語句都寫到 main 函數中,一方面程序會顯得的比較亂,另外一個方面,當同一個功能需要在不同地方執(zhí)行時,我們就得再重復寫一遍相同的語句。此時,如果把一些

在一個程序的編寫過程中,隨著代碼量的增加,如果把所有的語句都寫到 main 函數中,一方面程序會顯得的比較亂,另外一個方面,當同一個功能需要在不同地方執(zhí)行時,我們就得再重復寫一遍相同的語句。此時,如果把一些零碎的功能單獨寫成一個函數,在需要它們時只需進行一些簡單的函數調用,這樣既有助于程序結構的清晰條理,又可以避免大塊的代碼重復。

在實際工程項目中,一個程序通常都是由很多個子程序模塊組成的,一個模塊實現一個特定的功能,在 C 語言中,這個模塊就用函數來表示。一個 C 程序一般由一個主函數和若干個其他函數構成。主函數可以調用其它函數,其它函數也可以相互調用,但其它函數不能調用主函數。在我們的 51 單片機程序中,還有中斷服務函數,是當相應的中斷到來后自動調用的,不需要也不能由其它函數來調用。

函數調用的一般形式是:
函數名 (實參列表);
函數名就是需要調用的函數的名稱,實參列表就是根據實際需求調用函數要傳遞給被調用函數的參數列表,不需要傳遞參數時只保留括號就可以了,傳遞多個參數時參數之間要用逗號隔開。

那么我先舉例看一下函數調用使程序結構更加條理清晰方面的作用?;仡櫼幌聢D 6-1 所示的程序流程圖和為實現它而編寫的程序代碼,相對來說這個主函數的結構就比較復雜了,

很難一眼看清楚它的執(zhí)行流程。那么如果我們把其中最重要的兩件事——秒計數和數碼管動態(tài)掃描功能都用單獨的函數來實現會怎樣呢?來看程序。


#include

sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;

unsigned char code LedChar[] = { //數碼管顯示字符轉換表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};

unsigned char LedBuff[6] = { //數碼管顯示緩沖區(qū),初值 0xFF 確保啟動時都不亮

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

};

void SecondCount();

void LedRefresh();

void main(){

ENLED = 0; //使能 U3,選擇控制數碼管

ADDR3 = 1; //因為需要動態(tài)改變 ADDR0-2 的值,所以不需要再初始化了

TMOD = 0x01; //設置 T0 為模式 1

TH0 = 0xFC; //為 T0 賦初值 0xFC67,定時 1ms

TL0 = 0x67;

TR0 = 1; //啟動 T0

while (1){

if (TF0 == 1){ //判斷 T0 是否溢出

TF0 = 0; //T0 溢出后,清零中斷標志

TH0 = 0xFC; //并重新賦初值

TL0 = 0x67;

SecondCount(); //調用秒計數函數

LedRefresh(); //調用顯示刷新函數

}

}

}

/* 秒計數函數,每秒進行一次秒數+1,并轉換為數碼管顯示字符 */

void SecondCount(){

static unsigned int cnt = 0; //記錄 T0 中斷次數

static unsigned long sec = 0; //記錄經過的秒數

cnt++; //計數值自加 1

if (cnt >= 1000){ //判斷 T0 溢出是否達到 1000 次

cnt = 0; //達到 1000 次后計數值清零

sec++; //秒計數自加 1

LedBuff[0] = LedChar[sec%10];

LedBuff[1] = LedChar[sec/10%10];

LedBuff[2] = LedChar[sec/100%10];

LedBuff[3] = LedChar[sec/1000%10];

LedBuff[4] = LedChar[sec/10000%10];

LedBuff[5] = LedChar[sec/100000%10];

}

}

/* 數碼管動態(tài)掃描刷新函數 */

void LedRefresh(){

static unsigned char i = 0; //動態(tài)掃描的索引

switch (i){

case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;

case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;

case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;

case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break;

case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break;

case 5: ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5]; break;

default: break;

}

}

看一下,主函數的結構是不是清晰的多了——每隔 1ms 就去干兩件事,至于這兩件事是什么交由各自的函數去實現。還請大家注意一點:原來程序中的 i、cnt、sec 這三個變量在放到單獨的函數中后,都加了 static 關鍵字而變成了靜態(tài)變量。因為原來的 main()永遠不會結束所以它們的值也總是得到保持的,但現在它們在各自的功能函數內,如不加 static 修飾那么每次函數被調用時它們的值就都成了初值了,借此也把靜態(tài)變量再加深一下理解吧。


當然,這是我們刻意把程序功能做了這樣的劃分,主要目的還是來講解函數的調用,對于這個程序即使你不劃分函數也復雜不到哪里去,但繼續(xù)學下去你就能領會到劃分功能函數的必要了?,F在我們還是把注意力放在學習函數調用上,有以下幾點需要大家注意:

1) 函數調用的時候,不需要加函數類型。我們在主函數內調用 SecondCount()和LedRefresh()時都沒有加 void。


2) 調用函數與被調用函數的位置關系,C 語言規(guī)定:函數在被調用之前,必須先被定義或聲明。意思就是說:在一個文件中,一個函數應該先定義,然后才能被調用,也就是調用函數應位于被調用函數的下方。但是作為一種通常的編程規(guī)范,我們推薦 main 函數寫在最前面(因為它起到提綱挈領的作用),其后再定義各個功能函數,而中斷函數則寫在文件的最后。那么主函數要調用定義在它之后的函數怎么辦呢?我們就在文件開頭,所有函數定義之前,開辟一塊區(qū)域,叫做函數聲明區(qū),用來把被調用的函數聲明一下,如此,該函數就可以被隨意調用了。如上述例程所示。


3) 函數聲明的時候必須加函數類型,函數的形式參數,最后加上一個分號表示結束。函數聲明行與函數定義行的唯一區(qū)別就是最后的分號,其它的都必須保持一致。這點請尤其注意,初學者很容易因粗心大意而搞錯分號或是修改了定義行中的形參卻忘了修改聲明行中的形參,導致程序編譯不過。



本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉