單片機C語(yǔ)言編程心得
寫(xiě)這個(gè)8*8按鍵程序的過(guò)程中,不管是在自己寫(xiě)還是參考別人程序的過(guò)程中,發(fā)現自己對C語(yǔ)言有些基本知識點(diǎn)和編程規范有很多不懂的地方,有些是自己以前的編程習慣不好,有些就是基礎知識不扎實(shí)的表現,所以總結出來(lái)。
一、.H文件與.C文件的關(guān)系:
迄今為止,寫(xiě)過(guò)的程序都是一些很簡(jiǎn)單的程序,從來(lái)沒(méi)有想到要自己寫(xiě).H文件,也不知道.H文件到底什么用,與.C文件什么關(guān)系。只是最近寫(xiě)鍵盤(pán)程序,參考別人的程序時(shí),發(fā)現別人寫(xiě)的嚴格的程序都帶有一個(gè)“KEY.H”,里面定義了.C文件里用到的自己寫(xiě)的函數,如Keyhit()、Keyscan()等。
經(jīng)過(guò)查找資料得知,.H文件就是頭文件,估計就是Head的意思吧,這是規范程序結構化設計的需要,既可以實(shí)現大型程序的模塊化,又可以實(shí)現根各模塊的連接調試。
1、.H文件介紹:
在單片機C程序設計中,項目一般按功能模塊化進(jìn)行結構化設計。將一個(gè)項目劃分為多個(gè)功能,每個(gè)功能的相關(guān)程序放在一個(gè)C程序文檔中,稱(chēng)之為一個(gè)模塊,對應的文件名即為模塊名。一個(gè)模塊通常由兩個(gè)文檔組成,一個(gè)為頭文件*.h,對模塊中的數據結構和函數原型進(jìn)行描述;另一個(gè)則為C文件*.c ,對數據實(shí)例或對象定義,以及函數算法具體實(shí)現。
2、.H文件的作用
作為項目設計,除了對項目總體功能進(jìn)行詳細描述外,就是對每個(gè)模塊進(jìn)行詳細定義,也就是給出所有模塊的頭文件。通常H頭文件要定義模塊中各函數的功能,以及輸入和輸出參數的要求。模塊的具體實(shí)現,由項目組成根據H文件進(jìn)行設計、編程、調試完成。為了保密和安全,模塊實(shí)現后以可連接文件OBJ、或庫文件LIB的方式提供給項目其他成員使用。由于不用提供源程序文檔,一方面可以公開(kāi)發(fā)行,保證開(kāi)發(fā)人員的所有權;另一方面可以防止別人有意或無(wú)意修改產(chǎn)生非一致性,造成版本混亂。所以H頭文件是項目的詳細設計和團隊工作劃分的依據,也是對模塊進(jìn)行測試的功能說(shuō)明。要引用模塊內的數據或算法,只要用包含include指定模塊H頭文件即可。
3、.H文件的基本組成
/*如下為鍵盤(pán)驅動(dòng)的頭文檔*/
#ifndef _KEY_H_ //防重復引用,如果沒(méi)有定義過(guò)_KEY_H_,則編譯下句
#define _KEY_H_ //此符號唯一, 表示只要引用過(guò)一次,即#i nclude
/////////////////////////////////////////////////////////////////
char keyhit( void ); //擊鍵否
unsigned char Keyscan( void ); //取鍵值
/////////////////////////////////////////////////////////////////
#endif
二、盡量使用宏定義#define
開(kāi)始看別人的程序時(shí),發(fā)現程序開(kāi)頭,在文件包含后面有很多#define語(yǔ)句,當時(shí)就想,搞這么多標示符替換來(lái)替換去的,麻不麻煩啊,完全沒(méi)有理解這種寫(xiě)法的好處。原來(lái),用一個(gè)標示符表示常數,有利于以后的修改和維護,修改時(shí)只要在程序開(kāi)頭改一下,程序中所有用到的地方就全部修改,節省時(shí)間。
#define KEYNUM 65//按鍵數量,用于Keycode[KEYNUM]
#define LINENUM 8//鍵盤(pán)行數
#define ROWNUM 8//鍵盤(pán)列數
注意的地方:
1、宏名一般用大寫(xiě)
2、宏定義不是C語(yǔ)句,結尾不加分號
三、不要亂定義變量類(lèi)型
以前寫(xiě)程序,當需要一個(gè)新的變量時(shí),不管函數內還是函數外的,直接在程序開(kāi)頭定義,雖然不是原則上的錯誤,但是很不可取的作法。
下面說(shuō)一下,C語(yǔ)言中變量類(lèi)型的有關(guān)概念:
從變量的作用范圍來(lái)分,分為局部變量和全局變量:
1、全局變量:是在函數外定義的變量,像我以前定義在程序開(kāi)頭的變量都是全局變量,這里我就犯了一個(gè)大忌,使用了過(guò)多的全局變量。
帶來(lái)的問(wèn)題有兩個(gè):一是,全局變量在程序全部執行過(guò)程中都占用資源;二是,全局變量過(guò)多使程序的通用性變差,因為全局變量是模塊間耦合的原因之一。
2、局部變量:在函數內部定義的變量,只在函數內部有效。
從變量的變量值存在的時(shí)間分為兩種:
1、靜態(tài)存儲變量:程序運行期間分配固定的存儲空間。
2、動(dòng)態(tài)存儲變量:程序運行期間根據需要動(dòng)態(tài)地分配存儲空間。
具體又包括四種存儲方式:auto static register extern
1、局部變量,不加說(shuō)明默認為auto型,即動(dòng)態(tài)存儲,如果不賦初值,將是一個(gè)不確定的值。而將局部變量定義為static型的話(huà),則它的值在函數內是不變的,且初值默認為0。
c語(yǔ)言相關(guān)文章:c語(yǔ)言教程
評論