A. 單片機匯編語言流水燈程序延時0.5秒 一共四個燈循環
四個燈假設接在P1.0~P1.3上。晶振採用12M,這里用定時器中斷方式實現4個燈的流水燈效果,程序如下:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-50000) //定時50毫秒初值
MOV TL0,#LOW(65536-50000)
SETB TR0
SETB ET0
SETB EA
MOV R2,#0
MOV A,#0FEH
MOV P1,A
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
INC R2
CJNE R2,#10,T0E //10次定時0.5秒
MOV R2,#0
RL A
JNB ACC.4,T01
MOV P1,A
RETI
T01:
MOV A,#0FEH
T0E:
RETI
END
B. 匯編語言 51單片機,外部中斷控制流水燈
ORG 0000H ; 試試這個 流水燈的編碼隨便改
LJMP MAIN
ORG 0003H
LJMP LINT0
ORG 000BH
LJMP LT0ZD
ORG 0030H
MAIN: MOV SP, #60H
MOV TMOD, #00H
MOV IE, #81H
MOV TL0, #(8192-2500)MOD 32
MOV TH0, #(8192-2500)/32
SETB TR0
MOV R5, #20
LOOP: MOV R3, #48
CJNE R3, #0, $
LJMP LOOP
LINT0: CPL ET0
RETI
LT0ZD: PUSH PSW ; T0 中斷
PUSH ACC
MOV TL0, #(8192-2500)MOD 32
MOV TH0, #(8192-2500)/32
DJNZ R5, LT0Z2
MOV R5, #30 ; 可以調整速度
MOV A, R3
LCALL LSDIN
MOV P1, A
DEC R3
LT0Z2: POP ACC
POP PSW
RETI
LSDIN: MOVC A,@A+PC
RET
LSDBM: DB 11111110B,11111101B,11111011B,11110111B ; 流水燈的編碼1
DB 11101111B,11011111B,10111111B,01111111B
DB 01111111B,10111111B,11011111B,11101111B
DB 11110111B,11111011B,11111101B,11111110B
DB 11111100B,11111001B,11110011B,11100111B ; 流水燈的編碼2
DB 11001111B,10011111B,00111111B,01111110B
DB 01111110B,00111111B,10011111B,11001111B
DB 11100111B,11110011B,11111001B,11111100B
DB 11111000B,11110001B,11100011B,11000111B ; 流水燈的編碼3
DB 10001111B,00011111B,00111110B,01111100B
DB 01111100B,00111110B,00011111B,10001111B
DB 11000111B,11100011B,11110001B,11111000B
END
C. 流水燈匯編語言程序
ORG 0000H ;程序開始
SJMP START ;跳轉到START
ORG 0050H ;START從ROM的0050H開始存儲
START: MOVE P1.0,#00000001B ;把二進制數00000001B送到P1口
LCALL DELAY ;調用延時子程序
MOVE P1.0,#00000010B ;把二進制數00000010B送到P1口
LCALL DELAY
MOVE P1.0,#00000100B
LCALL DELAY
MOVE P1.0,#00001000B
LCALL DELAY
MOVE P1.0,#00010000B
LCALL DELAY
MOVE P1.0,#00100000B
LCALL DELAY
MOVE P1.0,#01000000B
LCALL DELAY
MOVE P1.0,#10000000B
LCALL DELAY
LJMP START ;跳轉到START
;延時子程序DELAY,改變R5、R6、R7中的值(0到255),可以改變延時時間
DELAY: MOV R5,#20 ;把20放到寄存器R5中,
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$ ;把寄存器R7中的內容減1,如果結果不定於0,則跳轉到本身,如果等於0,執行下一條程序
DJNZ R6,D2 ;把寄存器R6中的內容減1,如果結果不定於0,則跳轉到本身,如果等於0,跳轉到D2
DJNZ R5,D1
RET
END
D. 用匯編語言編流水燈,有8個LED燈,LED1~LED8 燈按順序點亮,每個等亮一秒轉到下個燈,一直循環亮
這個流水燈是很普通的一種花樣,假設LED接P1口,程序如下:
ORG 0000H
LJMP MAIN
0RG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-50000) ;50毫秒定時
MOV TL0,#LOW(65536-50000)
SETB TR0
SETB ET0
SETB EA
MOV A,#0FEH
MOV P1,A
MOV R2,#20
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
DJNZ R2,T0E ;1秒未到直接退出
MOV R2,#20
RL A
MOV P1,A ;1秒一變的花樣流水燈。
T0E:
RETI
END
E. 單片機匯編語言按鍵控制流水燈,兩個開關k1,k2。實現功能按下k1,流水燈左移動,按下k2,流水燈右移動。
K1EQUP1.0
K2EQUP1.1
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVA,#0FEH
CLR00H
CLR01H
LOOP:
JBK1,LOOP1
SETB00H
CLR01H
SJMPLOOP
LOOP1:
JBK2,LOOP2
SETB01H
CLR00H
LOOP2:
JB01H,LOOP3
JB00H,LOOP4
SJMPMAIN
LOOP3:
MOVP0,A
RRA
LCALLDELAY
SJMPLOOP
LOOP4:
MOVP0,A
RLA
LCALLDELAY
SJMPLOOP
DELAY:
MOVR2,#200
DLY:
MOVR3,#250
DJNZR3,$
DJNZR2,DLY
RET
END