彙編的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 燭光燈
有哪些著名的國際照明品牌?

TAG:51单片机 | 汇编语言 | LED |