新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)的“語(yǔ)言”規(guī)范

單片機(jī)的“語(yǔ)言”規(guī)范

作者: 時(shí)間:2013-01-26 來(lái)源:網(wǎng)絡(luò) 收藏
"說(shuō)話"也有

  上面的程序,我們經(jīng)過(guò)編譯,下載,運(yùn)行,完全能實(shí)現(xiàn)預(yù)計(jì)的功能。但是我們要說(shuō)這種程序就是沒(méi)有的程序?qū)懛ā?P>  這就像我們寫(xiě)文章,這只能算是一份草稿,雖然意思講清楚了,但是有些句法還不符合,結(jié)構(gòu)層次也不清楚,所以還不能算是一篇合格的文章。那么,規(guī)范的寫(xiě)法又有怎樣的要求呢?下面我們對(duì)照著規(guī)范寫(xiě)法的三部分內(nèi)容來(lái)看一下。

  規(guī)范寫(xiě)法的第一部分是"預(yù)定義",預(yù)定義部分就是要求我們?cè)谑褂?a class="contentlabel" href="http://www.2s4d.com/news/listbylabel/label/單片機(jī)">單片機(jī)管腳接口的時(shí)候先要給接口定義一個(gè)名稱,而不要直接使用接口名。如我們?cè)诔绦蛑胁灰苯邮褂胮0.0之類的。另外,我們?cè)谑褂肦AM中的存儲(chǔ)單元的時(shí)候,也不要直接使用單元地址,也要在預(yù)定義部分給它定義一個(gè)單元名稱。如我們要把一個(gè)計(jì)數(shù)值存儲(chǔ)在30h存儲(chǔ)單元里,我們就可以在預(yù)定義部分寫(xiě)上"counter equ 30h"語(yǔ)句,以后在程序中,我們直接使用"counter"這個(gè)名字就可以了。這樣寫(xiě)的好處就是以后如果電路中的管腳接口有所變動(dòng),或是存儲(chǔ)單元需要修改,我們只需在預(yù)定義部分改動(dòng)一下,而程序部分則一點(diǎn)也不需要?jiǎng)印_@就是預(yù)定義的方便之處。

  "主程序"與"子程序"的區(qū)分則更加重要??梢赃@樣說(shuō)吧,在編寫(xiě)程序時(shí),能夠?qū)崿F(xiàn)某些具體功能的程序段,我們最好不要把它放在主程序里面,而要把它寫(xiě)成子程序。如上面的程序示例中,延時(shí)1s程序?qū)懗勺映绦?,這樣很好,但是讓LED燈亮滅的這些功能程序段也應(yīng)當(dāng)寫(xiě)成子程序,這樣就會(huì)更好。那有朋友問(wèn)了,你都寫(xiě)成了子程序,那主程序部分干什么?問(wèn)得好,其實(shí)編寫(xiě)程序,主程序部分我們盡量讓它不去做具體的事情,因?yàn)樗€有更重要的事情去做。我們把具體的事情放給子程序去做,而主程序,我們是讓它扮演指揮,協(xié)調(diào),檢查子程序的工作??吹搅藛?,主程序和子程序就是這樣的關(guān)系,主程序是我們的大腦,而子程序則是我們的手和腳,它們是指揮和被指揮的關(guān)系。那么,主程序如何"指揮"子程序呢,具體的說(shuō),就是"調(diào)用".

  從開(kāi)始寫(xiě)程序,我們的腦海里就應(yīng)該建立起"預(yù)定義""主程序""子程序"這三個(gè)模塊,在具體寫(xiě)程序的時(shí)候,我們就是向這三個(gè)模塊里填充內(nèi)容,而這就是我們所說(shuō)的規(guī)范寫(xiě)法。

  基于這樣的思想,上面示例一的程序,要怎樣寫(xiě)才是符合規(guī)范的呢,請(qǐng)看下面的程序示例二。

  //程序功能:三個(gè)LED燈依次各亮滅1s,(用規(guī)范的寫(xiě)法改寫(xiě))

  //第一部分:預(yù)定義

  led_light1 bit p0.0 //定義管腳

  led_light2 bit p0.1

  led_light3 bit p0.2

  org 0000h //程序開(kāi)始

  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)亮第一個(gè)LED燈

  acall delay1s

  setb led_light1 //熄滅第一個(gè)LED燈

  acall delay1s

  ret

  led2: //led2子程序

  clr led_light2 //點(diǎn)亮第二個(gè)LED燈

  acall delay1s

  setb led_light2 //熄滅第二個(gè)LED燈

  acall delay1s

  ret

  led3: //led3子程序

  clr led_light3 //點(diǎn)亮第三個(gè)LED燈

  acall delay1s

  setb led_light3 //熄滅第三個(gè)LED燈

  acall delay1s

  ret

  delay1s: //延時(shí)1s子程序

 ?。ㄖ虚g內(nèi)容略)

  ret

  end //程序結(jié)束

  請(qǐng)注意預(yù)定義部分除了"定義管腳",我們使用了偽指令"org"定義了"程序開(kāi)始",這樣是為了避開(kāi)5個(gè)中斷服務(wù)子程序的入口地址部分,使程序從0030h開(kāi)始。而"main"程序里只有三條調(diào)用指令,就完成了指揮的功能。只有這樣寫(xiě)程序,主程序部分才能夠發(fā)揮它應(yīng)有的作用。而所有的具體功能的實(shí)現(xiàn),我們都放到了子程序里,這樣的程序結(jié)構(gòu)看起來(lái)就清楚多了。

  當(dāng)然,這個(gè)程序因?yàn)楹?jiǎn)單,我們沒(méi)有感覺(jué)到這種規(guī)范的寫(xiě)法有什么好處,反而覺(jué)得它比第一種方法還要復(fù)雜。實(shí)際上,隨著電路的功能越來(lái)越多,程序的內(nèi)容也會(huì)跟著越來(lái)越多,那個(gè)時(shí)候,你就會(huì)越來(lái)越發(fā)現(xiàn)我們這種規(guī)范寫(xiě)法的優(yōu)越性來(lái)了。

  因?yàn)殡娐返闹饕δ埽覀兛梢缘街鞒绦虿糠秩ゲ檎?,而具體的實(shí)現(xiàn)功能的方法,我們則可以到子程序部分去查找,這樣的程序結(jié)構(gòu)讓寫(xiě)程序的人覺(jué)得有章可循,循序漸進(jìn);讓看程序的人也覺(jué)得層次清晰,一目了然。

  果真是這樣嗎?下面我們改變一下這個(gè)電路的功能,讓這三個(gè)燈的亮滅循環(huán)進(jìn)行下去,那么這個(gè)程序應(yīng)當(dāng)怎樣寫(xiě)呢?其實(shí)很簡(jiǎn)單,我們只要在示例程序二的主程序(main)里稍微改動(dòng)一下就可以。請(qǐng)看改動(dòng)過(guò)的main程序:

  main:

  loop: acall led1

  acall led2

  acall led3

  ajmp loop //循環(huán)

  當(dāng)然,這種改動(dòng)過(guò)于簡(jiǎn)單,在這里只是想讓大家看看,main程序其實(shí)只有兩種工作狀態(tài),一種是待機(jī)狀態(tài),一種就是循環(huán)狀態(tài)。



評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉