A. 用51單片機(匯編語言寫)寫一個跑馬燈程序知道的幫個忙寫寫。
急用!請教!!!
用匯編語言程序,程序功能:實現方向可控的跑馬燈
編程要求:用八個LED發光二極體實現跑馬燈(即:8個燈依次輪流發光,每次只亮一個燈),系統啟動後,跑馬燈右向流轉,按下K1鍵,則反向流轉,再按則再反向……。接線方法:流水燈接P0口,按鍵K1可自選P1~P3任一引腳。
B. 51單片機匯編語言編寫一個跑馬燈的程序,初學者做實驗用,具體要求如下,好了可以加分
程序1:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV SP,#5FH
LOOP:
MOV A,P2
MOV B,A
MOV P0,A
MOV P1,#0FFH
LOOP1:
LCALL DELAY
MOV C,P1.7
MOV A,P0
RLC A
MOV P0,A
MOV A,P1
RLC A
MOV P1,A
MOV A,P2
CJNE A,B,LOOP
SJMP LOOP1
DELAY:
MOV R2,#60
DELAY1:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DELAY1
RET
END
程序2:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV SP,#5FH
JNB P2.0,LOOP1 ;
JNB P2.1,LOOP2 ;
SJMP MAIN
LOOP1:
MOV P0,#0FEH
MOV P1,#0FFH
LOOP11:
MOV C,P1.7
MOV A,P0
RLC A
MOV P0,A
MOV A,P1
RLC A
MOV P1,A
JNB P2.1,LOOP2
SJMP LOOP11
LOOP2:
MOV P0,#0FCH
MOV P1,#0FFH
LOOP21:
MOV C,P1.7
MOV A,P0
RLC A
MOV P0,A
MOV A,P1
RLC A
MOV P1,A
JNB P2.0,LOOP1
SJMP LOOP21
DELAY:
MOV R2,#60
DELAY1:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DELAY1
RET
END
C. 單片機跑馬燈程序
org 0000h
ajmp start
org 0030h
start:
mov a,#0ffh ;
clr c ;
mov r2,#08h ;循環八次。
loop: rlc a ;帶進位左移。
mov p1,a ;輸出到P1口。
call delay ;延時一段時間
djnz r2,loop ;反復循環
mov r2,#07h ;再往回循環。
loop1: rrc a ;帶進位右移
mov p1,a ;輸出到P1口。
call delay ;延時一段時間
djnz r2,loop1 ;反復循環
jmp start ;重新開始
delay: mov r3,#20 ;延時子程序
d1: mov r4,#20
d2: mov r5,#248
djnz r5,$
djnz r4,d2
djnz r3,d1
ret
end
D. 51單片機跑馬燈程序
不好意思,延時用了樓上的。keil下編譯OK。假設P1接燈。
ORG00H
SJMPSTART
ORG30H
START:
MOVA,#00
SETBC
MOVR0,#9
;從左到右
LOOP1:
RLCA
MOVP1,A
ACALLDELAY
DJNZR0,LOOP1
;從右到左
MOVR0,#9
LOOP2:
RRCA
MOVP1,A
ACALLDELAY
DJNZR0,LOOP2
SJMPSTART
DELAY:
MOVR6,#20
DELAY_0:MOVR5,#255
DJNZR5,$
DJNZR6,DELAY_0
RET
這個程序比較簡單了。再精簡,只能精簡一句,將MOVP1,A放在DELAY函數里。這樣減少一行。
簡單介紹一下:
首先就是你要輪流點亮,就是將1循環一圈,因為你要全滅一次,所以用到CY。
RG00H
SJMPSTART
ORG30H
START:
MOVA,#00;//清空A寄存器
SETBC;//將CY置1,然後帶進位左移就會進入將A的b0
MAINLOOP:;//大循環起始
MOVR0,#9;設置移位次數,要滅一次,所以設置為9
;從左到右
LOOP1:
RLCA;帶進位左移一次;第一次移位結果為01
MOVP1,A;將A中值放入P1點亮對應LED;該句可放在DELAY里,然後從右到左也去掉該句
ACALLDELAY;延時,保持燈亮一段時間,自己根據實際情況調整一下。
DJNZR0,LOOP1;循環,點亮下一個燈,最後一次,A為0,將全滅一次,CY為1
;從右到左
MOVR0,#9;設置循環次數
LOOP2:;循環起始表示
RRCA;帶進位右移,第一次結果為80H
MOVP1,A;更新P1點亮對應LED
ACALLDELAY;延時,保持燈亮一段時間
DJNZR0,LOOP2;循環,點亮下一個燈
SJMPMAINLOOP;循環,重新開始下一輪
如果你是管腳輸出低LED才亮,只需將MOVA,#00和SETBC改為MOVA,#0FFH和CLRC即可。
方案2:位定址區00做標志,為0從左到右,該標志為1從右到左
ORG00H
SJMPSTART
ORG30H
START:
MOVA,#00
SETBC
MOVR0,#9
CLR00H
LOOP1:
RLLED:
JB00H,RRLED
RLCA
AJMPDISP
RRLED:
RRCA
DISP:
MOVP1,A
ACALLDELAY
DJNZR0,LOOP1
CPL00H
AJMPSTART
DELAY:
MOVR6,#20
DELAY_0:MOVR5,#255
DJNZR5,$
DJNZR6,DELAY_0
RET
下面是方案1的流程圖,這種流程圖不知怎麼寫好,而且寫出來基本是對每行的代碼的解釋。