彙編的51單片機的跑馬燈
話不多說,先上程序
ORG 0000H
MAIN:MOV P1,#0O
LCALL DELAY
MOV A,#0FEH
SETB C
TO: MOV P1,A
LCALL DELAY
LCALL DELAY
RLC A
JC TO
MOV P1,A
LCALL DELAY
LCALL DELAY
TO1: RRC A
MOV P1,A
LCALL DELAY
LCALL DELAY
JC TO1
AJMP TO
DELAY:MOV R2,#0FEH
TC1:MOV R3,#0FEH
TC2:DJNZ R3,TC2
DJNZ R2,TC1
RET
END
這個程序的目的是使8個LED循環點亮,還有一個狀態是都不亮,我的LED是搭在P1口上,給低電平就亮。總的現象就是先全部亮一次,然後從左到右依次亮,然後全部滅掉,然後從右到左依次亮一遍,然後滅掉,然後就這樣循環下去。
現在來對代碼一步一步進行分析 我在前面講過的知識點我就不重複了,會寫的簡略點,不懂的往前看。
ORG 0000H ;這個就不說了
MAIN:MOV P1,#00 ;讓燈全部都亮
LCALL DELAY ;延時
MOV A,#0FEH ;11111110 賦給累加器A,累加器A就相當於c語言中的一個臨時變數,臨時的寄存器。
SETB C ;把進位標誌位C置為1,它就相當於給八位加上了一位,這個可以讓燈有個全滅的狀態,等你理解完下面的全部東西再來看這個語句的作用,這樣理解起來比較好。
TO: MOV P1,A ;這個語句標號為 TO,執行後是使最左邊的燈亮起來
LCALL DELAY
LCALL DELAY
RLC A ;這個是新的語句,對A進行循環左移進位,RLC,我的理解就是recircle left carry ,轉化為中文就是循環左移進位,意思就是把累積器A加上進位標誌位C一起進行循環左移
相當於就是9個數在循環往複的移動,裡面還有一個0,這個0移到哪裡,哪個燈就亮了,移到進位標誌位的時候就每個燈都不亮,因為進位標誌位不控制燈的亮滅。
JC TO ;JC是意思是根據進位標誌位C是否為1來判斷是否轉移,jump carry,如果C等於1,就跳到TO裡面繼續執行左移,否則就就執行後面的程序,而由於8個1和一個0在這九個位置移動,所以只有當0移動到進位標誌位C這裡它才會執行下面的程序,所以在它沒有循環到全部熄滅的狀態時,就會繼續執行左移
MOV P1,A ;把進位標誌位C為0的這個狀態也賦給P1口,讓燈全部熄滅。
LCALL DELAY
LCALL DELAY
TO1: RRC A ;RRC,recircle right carry,循環右移帶進位 和RLC循環的方向相反,本質沒有什麼不同 ,從這個時候開始右邊的第一個燈亮,一直亮到最左邊
MOV P1,A
LCALL DELAY
LCALL DELAY
JC TO1 ;循環右移
AJMP TO ;移到最右邊就又跳回到前面開始循環左移
DELAY:MOV R2,#0FEH ;下面就是延時函數
TC1:MOV R3,#0FEH
TC2:DJNZ R3,TC2
DJNZ R2,TC1
RET
END
你們可以試試RL和RC,這個不帶進位標誌位的,所以就不會有全部熄滅的狀態了。如果有哪裡講的不對或者不到位的地方,還請大家多多指教,大家最好買個51或者52單片機玩著來學,不然就很沒效果,自己去試試少了那些語句會怎麼樣,然後按自己的目標改變程序。
推薦閱讀:
※如何區分LED燈 白熾燈 日光燈 汞燈 鹵素燈?
※國內LED燈具有什麼好的品牌推薦嗎?
※傢具照明,LED與節能燈如何選擇?
※這裡有一盞充滿設計感的 LED 燭光燈
※有哪些著名的國際照明品牌?