📄 渐明渐暗彩灯程序.asm
字号:
;----------------------------------------------------------------
;
;;
;;;单片机的P1口的LED实现渐明渐暗的效果
;;; 杜洋 2005.6.20
;;;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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -