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