;---------------------------------------------------------------- ; ;; ;;;单片机的P1口的LED实现渐明渐暗的效果 ;;;P1口接8个LED,灌电流 ;;;改变占空比来调整亮度 ;; ; ;---------------------------------------------------------------- LED EQU P1;定义IO口,为了方便改动而设计
ORG 00H JMP MAIN ORG 30H
;---------------------------------------------------------------- MAIN:;主程序循环 CALL DL;初始化一段长时间的延时,也可不加,灯全灭。 MOV A,#0 CALL LOOP;调用渐暗的子程序,通过改变规定时间内LED的占空比来改变亮度。 MOV LED,#0FFH;达到最暗时则关全部灯,占空比为0,灯最灭。 MOV A,#0;将A值清0 CALL LOOP2;调用渐亮的子程序,使占空比慢慢变为1 MOV LED,#0;最亮时,开全部灯。 JMP MAIN
;----------------------------------------------------------------- LOOP:;渐暗程序循环 MOV LED,#0;灯全亮 INC A;A中值加1 CJNE A,#0FFH,E2;看A中值是否到了最大值? E1:JMP OVER;到了最大值则退出。 E2:MOV R7,A;不到时则将R7延时程序给于初值。 D1:MOV R6,#30;延时程序的上限值由R6可调,但不能调的过大不然灯会闪动。 DJNZ R6,$ DJNZ R7,D1 MOV LED,#0FFH;占空比的“占”时间到,灯全灭准备开始“空”时间的延时。
CPL A;A取反的目的是取得整个时间内(FFH)“空”的时间长度。 MOV R7,A;将“空”的时间长度送入延时程序。 D2:MOV R6,#30 DJNZ R6,$ DJNZ R7,D2 CPL A;将A的值正过来,准备下一次循环“占”的决定时间。 JMP LOOP OVER:RET;A的值到了最大值则退出。(渐暗完成)
;------------------------------------------------------------------- LOOP2: ;渐亮程序循环 MOV LED,#0FFH;灯全灭 INC A;A中值加1,慢慢加大“占”的时间。 CJNE A,#0FFH,W2 W1:JMP OVER2 W2: MOV R7,A D11:MOV R6,#30 DJNZ R6,$ DJNZ R7,D11 MOV LED,#0 ;与渐暗的程序大体相同,不多解释。
CPL A MOV R7,A D22:MOV R6,#30 DJNZ R6,$ DJNZ R7,D22 CPL A JMP LOOP2 OVER2:RET
;--------------------------------------------------------------------- DL: ;长时间开机初始化延时程序 MOV LED,#0FFH; MOV R5,#10; DD0:MOV R7,#250; DD1:MOV R6,#250; DD2:DJNZ R6,DD2 DJNZ R7,DD1 DJNZ R5,DD0 RET
;---------------------------------------------------------------------- END
|