; ; 本程式以P0到P2為輸出,P3為輸入, ; ; 應用指令: ; 旋轉指令RL ; 互斥或指令XRL ; 堆疊PUSH和POP ; ; 動作: 以P3.7為切換開關設定不同顯示方式, ; 當P3.7為0時LED全亮時則逐點暗掉,當LED全暗時則逐點亮起, ; P3.0~6為延遲時間長短控制 ; ; 說明: 暫存器R0用以控制P0到P3為全亮或全暗,R1用以控制目前掃描的位置 ; 暫存器R2用以儲存延遲時間之設定 ; ORG 00H JMP INIT ;規避00H至2FH間之中斷向量執行位址 ORG 30H INIT: MOV SP,#30H ;將堆疊指標重新指向 MOV R2,#25 ;暫存器R2設定初始延遲時間25*20mS MOV A,#00H ;將埠2至埠0設定為全滅 MOV R3,A MOV A,R3 MOV P2,A CALL DELAY MOV A,R3 MOV P1,A CALL DELAY MOV A,R3 MOV P0,A CALL DELAY START: MOV R2,#25 ;暫存器R5設定初始延遲時間25*20mS MOV A,R3 CPL A MOV R3,A MOV P2,A CALL DELAY MOV A,R3 MOV P1,A CALL DELAY MOV A,R3 MOV P0,A CALL DELAY LOOP: MOV A,P3 ;讀入埠3之設定資料 CPL A ;將資料作反相邏輯運算 PUSH A ;將累積器A資料存入堆疊中 ANL A,#7FH ;將累積器A資料與值7FH做邏輯AND運算 MOV R2,A ;將累積器A資料存入R5中做為延遲時間之設定值 MOV A,#01H RT0: MOV R1,A XRL A,P0 MOV P0,A CALL DELAY MOV A,R1 CLR C RLC A JNC RT0 MOV A,#01H RT1: MOV R1,A XRL A,P1 MOV P1,A CALL DELAY MOV A,R1 CLR C RLC A JNC RT1 MOV A,#01H RT2: MOV R1,A XRL A,P2 MOV P2,A MOV R3,A CALL DELAY MOV A,R1 CLR C RLC A JNC RT2 POP A ;將之前堆疊中資料取出 JB A.7,LOOP ;若累積器A為1則跳回到LOOP重新執行 JMP START ;若累積器A為0則跳回到START重新執行 DELAY: MOV A,R2 ;載入R2之延遲時間設定 MOV R5,A JNZ D1 ;若累積器A不為0則跳到D0執行 MOV R5,#25 ;當R5為0時則重設延遲時間為25*20mS D1: MOV R6,#40 D2: MOV R7,#249 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END