單片機的“語言”規(guī)范
上面的程序,我們經(jīng)過編譯,下載,運行,完全能實現(xiàn)預(yù)計的功能。但是我們要說這種程序就是沒有規(guī)范的程序?qū)懛ā?P> 這就像我們寫文章,這只能算是一份草稿,雖然意思講清楚了,但是有些句法還不符合規(guī)范,結(jié)構(gòu)層次也不清楚,所以還不能算是一篇合格的文章。那么,規(guī)范的寫法又有怎樣的要求呢?下面我們對照著規(guī)范寫法的三部分內(nèi)容來看一下。
規(guī)范寫法的第一部分是"預(yù)定義",預(yù)定義部分就是要求我們在使用單片機管腳接口的時候先要給接口定義一個名稱,而不要直接使用單片機接口名。如我們在程序中不要直接使用p0.0之類的。另外,我們在使用RAM中的存儲單元的時候,也不要直接使用單元地址,也要在預(yù)定義部分給它定義一個單元名稱。如我們要把一個計數(shù)值存儲在30h存儲單元里,我們就可以在預(yù)定義部分寫上"counter equ 30h"語句,以后在程序中,我們直接使用"counter"這個名字就可以了。這樣寫的好處就是以后如果電路中單片機的管腳接口有所變動,或是存儲單元需要修改,我們只需在預(yù)定義部分改動一下,而程序部分則一點也不需要動。這就是預(yù)定義的方便之處。
"主程序"與"子程序"的區(qū)分則更加重要??梢赃@樣說吧,在編寫程序時,能夠?qū)崿F(xiàn)某些具體功能的程序段,我們最好不要把它放在主程序里面,而要把它寫成子程序。如上面的程序示例中,延時1s程序?qū)懗勺映绦?,這樣很好,但是讓LED燈亮滅的這些功能程序段也應(yīng)當(dāng)寫成子程序,這樣就會更好。那有朋友問了,你都寫成了子程序,那主程序部分干什么?問得好,其實編寫程序,主程序部分我們盡量讓它不去做具體的事情,因為它還有更重要的事情去做。我們把具體的事情放給子程序去做,而主程序,我們是讓它扮演指揮,協(xié)調(diào),檢查子程序的工作??吹搅藛?,主程序和子程序就是這樣的關(guān)系,主程序是我們的大腦,而子程序則是我們的手和腳,它們是指揮和被指揮的關(guān)系。那么,主程序如何"指揮"子程序呢,具體的說,就是"調(diào)用".
從開始寫程序,我們的腦海里就應(yīng)該建立起"預(yù)定義""主程序""子程序"這三個模塊,在具體寫程序的時候,我們就是向這三個模塊里填充內(nèi)容,而這就是我們所說的規(guī)范寫法。
基于這樣的思想,上面示例一的程序,要怎樣寫才是符合規(guī)范的呢,請看下面的程序示例二。
//程序功能:三個LED燈依次各亮滅1s,(用規(guī)范的寫法改寫)
//第一部分:預(yù)定義
led_light1 bit p0.0 //定義管腳
led_light2 bit p0.1
led_light3 bit p0.2
org 0000h //程序開始
ljmp main
org 0030h
//第二部分:主程序
main:
acall led1 //調(diào)用led1子程序
acall led2 //調(diào)用led2子程序
acall led3 //調(diào)用led3子程序
ajmp $ //待機狀態(tài)
//第三部分:子程序
led1: //led1子程序
clr led_light1 //點亮第一個LED燈
acall delay1s
setb led_light1 //熄滅第一個LED燈
acall delay1s
ret
led2: //led2子程序
clr led_light2 //點亮第二個LED燈
acall delay1s
setb led_light2 //熄滅第二個LED燈
acall delay1s
ret
led3: //led3子程序
clr led_light3 //點亮第三個LED燈
acall delay1s
setb led_light3 //熄滅第三個LED燈
acall delay1s
ret
delay1s: //延時1s子程序
?。ㄖ虚g內(nèi)容略)
ret
end //程序結(jié)束
請注意預(yù)定義部分除了"定義管腳",我們使用了偽指令"org"定義了"程序開始",這樣是為了避開5個中斷服務(wù)子程序的入口地址部分,使程序從0030h開始。而"main"程序里只有三條調(diào)用指令,就完成了指揮的功能。只有這樣寫程序,主程序部分才能夠發(fā)揮它應(yīng)有的作用。而所有的具體功能的實現(xiàn),我們都放到了子程序里,這樣的程序結(jié)構(gòu)看起來就清楚多了。
當(dāng)然,這個程序因為簡單,我們沒有感覺到這種規(guī)范的寫法有什么好處,反而覺得它比第一種方法還要復(fù)雜。實際上,隨著電路的功能越來越多,程序的內(nèi)容也會跟著越來越多,那個時候,你就會越來越發(fā)現(xiàn)我們這種規(guī)范寫法的優(yōu)越性來了。
因為電路的主要功能,我們可以到主程序部分去查找,而具體的實現(xiàn)功能的方法,我們則可以到子程序部分去查找,這樣的程序結(jié)構(gòu)讓寫程序的人覺得有章可循,循序漸進;讓看程序的人也覺得層次清晰,一目了然。
果真是這樣嗎?下面我們改變一下這個電路的功能,讓這三個燈的亮滅循環(huán)進行下去,那么這個程序應(yīng)當(dāng)怎樣寫呢?其實很簡單,我們只要在示例程序二的主程序(main)里稍微改動一下就可以。請看改動過的main程序:
main:
loop: acall led1
acall led2
acall led3
ajmp loop //循環(huán)
當(dāng)然,這種改動過于簡單,在這里只是想讓大家看看,main程序其實只有兩種工作狀態(tài),一種是待機狀態(tài),一種就是循環(huán)狀態(tài)。
評論