單片機的“語言”規(guī)范
//程序功能:三個LED燈依次各亮滅1s,用定時器延時
//第一部分:預(yù)定義
led_light1 bit p0.0 //定義管腳
led_ light2 bit p0.1
led_ light3 bit p0.2
counter equ 30h //定義計數(shù)寄存器
org 0000h //程序開始
ljmp main
org 000bh
ljmp int_t0 //定時器T0中斷入口地址
org 0030h
//第二部分:主程序
main:
acall init_t0
ajmp $ //等待中斷
//第三部分:子程序
init_t0: ;初始化定時器T0子程序
mov tmod,#01h
mov tl0,#low(65536-50000) //50ms初值
mov th0,#high(65536-50000)
setb ea
setb et0
setb tr0
mov counter,#0
mov r2,#0
ret
int_t0;定時器T0中斷子程序
mov tl0,#low(65536-50000)
mov th0,#high(65536-50000)
inc counter
mov r0,counter
cjne r0,#20,lp1
mov counter,#00h //12MHz晶振,定時1s
acall led_flash
lp1: reti
led_flash; LED燈閃子程序
mov dptr,#table //散轉(zhuǎn)程序
mov a,r2
add a,r2
jmp @a+dptr
table: ajmp led1
ajmp led2
ajmp led3
ajmp led4
ajmp led5
ajmp led6
led1: clr led_ light1 //led狀態(tài)1
mov r2,#1
ajmp lp2
led2: setb led_ light1 //led狀態(tài)2
mov r2,#2
ajmp lp2
led3: clr led_ light2 //led狀態(tài)3
mov r2,#3
ajmp lp2
led4: setb led_ light2 //led狀態(tài)4
mov r2,#4
ajmp lp2
led5 clr led_ light3 //led狀態(tài)5
mov r2,#5
ajmp lp2
led6: setb led_ light3 //led狀態(tài)6
mov r2,#0
clr tr0 //定時器停止計數(shù)
lp2: ret
end //程序結(jié)束
在這個程序里,大家需要注意這樣幾個問題:
1.在主程序部分main里,除了初始化T0之外,主程序什么也沒有做,這就對了。因為我們總是強調(diào)主程序還要有更重要的事情去處理,所以它要把一些小事情,具體的事情放手給子程序去處理。這就好像我們吃飯時用筷子夾菜,我們不要時時用腦子想"要把夾的菜放進嘴里",我們的手就會自動把菜放進我們的嘴里。因為這樣的小事情就不要再麻煩我們的大腦了,只有這樣把大腦解放出來,我們在吃飯時大腦才可以思考其他的事情,才可以跟其他人交談而又不耽誤吃飯。單片機只有能處理許多復(fù)雜的事情,才能夠顯示出它的強大功能來,所以我們在編程時一定注意讓主程序部分少做具體的事,多做指揮的事。
2.一個完整的程序絕對不是從第一行到最后一行這樣依次寫下來的。我們說規(guī)范的程序由三部分組成,有的語句是在寫程序的時候邊寫邊補充進去的。例如我們在寫定時器定時1s的部分時,需要一個計數(shù)存儲單元,于是我們便在"第一部分預(yù)定義"里加進了"counter equ 30h "這條語句。如果程序中要使用堆棧,我們還要先給堆棧指針SP賦值,以規(guī)定堆棧棧頂?shù)奈恢谩嶋H的程序編寫就是如此。
3.在本程序中,我們使用了散轉(zhuǎn)語句,其實這樣真有點殺雞用牛刀了。還可以有更簡單的寫法。我們這樣寫,一方面是想讓大家試一試散轉(zhuǎn)語句的用法,而另一方面是想向大家表明我們只注重方法(程序的規(guī)范寫法)而不強調(diào)技巧。
說到學(xué)習(xí)單片機,使用C語言編程是大勢所趨。但是話又說回來,單片機的學(xué)習(xí)畢竟與硬件電路有很多的聯(lián)系,而學(xué)習(xí)匯編語言則會對單片機的硬件結(jié)構(gòu)有更多的了解。所以學(xué)習(xí)匯編語言與學(xué)習(xí)C語言并不矛盾。使用C語言編程的,可以了解一下匯編語言,以便更深理解單片機的結(jié)構(gòu);使用匯編語言編程的,如果想盡快進入應(yīng)用領(lǐng)域,則應(yīng)該再學(xué)習(xí)C語言。而我們這種匯編程序的規(guī)范寫法是與C語言的編程思想完全一致的。
也就是說有了這種規(guī)范寫法的訓(xùn)練,再學(xué)習(xí)C語言,那真是易如反掌。就像你學(xué)習(xí)開車,學(xué)會了開手動檔的汽車,讓你開自動檔的汽車,你會有什么感覺?一定是不在話下吧。但是反過來會怎樣呢?所以從匯編語言學(xué)習(xí)單片機的朋友不會吃虧,如果再學(xué)會了C語言,那真是如虎添翼呢。
希望我們這種程序的規(guī)范寫法能對正在學(xué)習(xí)匯編語言的朋友有所幫助。當然,看一兩篇文章并不能夠?qū)W會匯編語言,重要的還是多寫多練,才能真正進入單片機編程的殿堂。
評論