⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.dt

📁 实现彩色LED灯变换控制
💻 DT
字号:
;=====================================================
;Program Start
;=====================================================
	include	"include.dt"

	ORG	0x000
	jmp	Start
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	ORG	0x008
INT_Entry:						;100us TCC Interrupt
	mov	A_PUSH,A			   ;A==>A_PUSH
	swapa  STATUS				 ;
	mov	STATUS_PUSH,A		  ;STATUS==>STATUS_PUSH
	inc	TimeCnt
	bs	 Flag, TCC100US
	mov	A,@0x0A3
	mov	TCC,A
	bc	 RF,0
	swapa  STATUS_PUSH			;
	mov	STATUS,A			   ;STATUS_PUSH==>STATUS
	swap   A_PUSH
	swapa  A_PUSH				 ;A_PUSH==>A
	reti

	ORG	0x020
Red_Table:
	add	 PC, A
	retl	@DECR			;0
	retl	@EMPTY		   ;1
	retl	@INCR			;2
	retl	@DECR			;3
	retl	@INCR			;4
	retl	@FULL			;5
	retl	@DECR			;6
	retl	@INCR			;7
	retl	@DECR			;8
	retl	@EMPTY		   ;9
	retl	@INCR			;10
	
Green_Table:
	add	 PC, A
	retl	@INCR			;0
	retl	@DECR			;1
	retl	@EMPTY		   ;2
	retl	@INCR			;3
	retl	@FULL			;4
	retl	@DECR			;5
	retl	@INCR			;6
	retl	@DECR			;7
	retl	@EMPTY		   ;8
	retl	@INCR			;9
	retl	@DECR			;10

Blue_Table:
	add	 PC, A
	retl	@EMPTY		   ;0
	retl	@INCR			;1
	retl	@DECR			;2
	retl	@INCR			;3
	retl	@DECR			;4
	retl	@INCR			;5
	retl	@DECR			;6
	retl	@EMPTY		   ;7
	retl	@INCR			;8
	retl	@FULL			;9
	retl	@DECR			;10

DispMode_Table:
	add	 PC,A
	nop
	jmp	 DispMode_1	   ;R
	jmp	 DispMode_2	   ;G
	jmp	 DispMode_3	   ;B
	jmp	 DispMode_4	   ;R+G
	jmp	 DispMode_5	   ;R+B
	jmp	 DispMode_6	   ;G+B
	jmp	 DispMode_7	   ;R+G+B
	jmp	 DispMode_8	   ;OFF

	ORG	0x060
Start:
	disi
	mov	A,@00000000B
	contw
	mov	A,@00001111B
	iow	IOC5
	mov	A,@10000001B
	iow	IOC6
	mov	A,@01110111B
	iow	IOCB
	mov	A,@11110111B
	iow	IOCC
	mov	A,@00000000B
	iow	IOCD
	mov	A,@00000000B	;P60 As I/O
	iow	IOCE
	mov	A,@00000001B	;Bit2-EXIE , Bit1-ICIE , Bit0-TCIE
	iow	IOCF
	clr	RF
	mov	A,@11111111B
	mov	R5,A	
	mov	R6,A
	mov	A,@0x00
	mov	TCC,A
	clr	IR_Status
	clr	TimeCnt
	mov	A,@120
	mov	Duty_RED,A
	mov	A,@0
	mov	Duty_GREEN,A
	mov	A,@0
	mov	Duty_BLUE,A
	mov	A,@DECR
	mov	Red_Dirct,A
	mov	A,@INCR
	mov	Green_Dirct,A
	mov	A,@EMPTY
	mov	Blue_Dirct,A
	clr	Count
	clr	Mode
	clr	CntDirct_l
	clr	CntDirct_h
	clr	DispMode
	clr	Flag
	eni
MainLoop:
	call   IR_Service
Check_Power_IR:
	jbs	Flag, POWER_VALID
	jmp	Check_LED_Mode
	bc	 Flag, POWER_VALID
	jbs	Flag, POWEROFF
	jmp	$+5
	bc 	Flag, POWEROFF		;POWER ON
	mov	A,DispMode_Bak
	mov	DispMode,A
	jmp	To_New_Disp_Mode
	bs	 Flag, POWEROFF		;POWER OFF
	mov	A,DispMode
	mov	DispMode_Bak,A
	mov	A,@8
	mov	DispMode,A
	jmp	To_New_Disp_Mode
Check_LED_Mode:
	jbs	Flag, IR_VALID
	jmp	Check_Counter
	bc	 Flag, IR_VALID
;	jbc	Flag, POWEROFF
;	jmp	Check_Counter
	inc	DispMode
	mov	A,DispMode
	sub	A,@9-1
	jbs	STATUS, C
	clr	DispMode
To_New_Disp_Mode:
	mov	A,DispMode
	jbc	STATUS, Z
	jmp	Check_Counter
	mov	A,DispMode
	call   DispMode_Table
	jmp	MainLoop
Check_Counter:
	mov	A,DispMode
	jbs	STATUS, Z
	jmp	MainLoop
	call   Update_Counter
	jmp	MainLoop

;-----------------------------------------------------
;Subroutines
;-----------------------------------------------------
Update_Counter:
	jbs	Flag, TCC100US
	ret
	bc	 Flag, TCC100US
Detect_Mode_Cnt:
	inc	CntDirct_l
	mov	A,CntDirct_l
	sub	A,@180
	jbc	STATUS, C
	jmp	Detect_Red_Cnt
	clr	CntDirct_l
	call	Next_Dirct

Detect_Red_Cnt:
	djz	CntPWM_RED
	jmp	Detect_Green_Cnt
	LEFT_RED_ON_SKIP
	jmp	Turn_Left_Red_On
Turn_Left_Red_Off:
	mov	A,Duty_RED
	sub	A,@120-1
	jbs	STATUS, C
	jmp	Turn_Left_Red_On
	mov	CntPWM_RED,A
	inc	CntPWM_RED
	SET_LEFT_RED_OFF
	SET_RIGHT_RED_OFF
	jmp	Detect_Green_Cnt
Turn_Left_Red_On:
	mov	A,Duty_RED
	jbc	STATUS, Z
	jmp	Turn_Left_Red_Off
	mov	CntPWM_RED,A
	SET_LEFT_RED_ON
	SET_RIGHT_RED_ON

Detect_Green_Cnt:
	djz	CntPWM_GREEN
	jmp	Detect_Blue_Cnt
	LEFT_GREEN_ON_SKIP
	jmp	Turn_Left_Green_On
Turn_Left_Green_Off:
	mov	A,Duty_GREEN
	sub	A,@120-1
	jbs	STATUS, C
	jmp	Turn_Left_Green_On
	mov	CntPWM_GREEN,A
	inc	CntPWM_GREEN
	SET_LEFT_GREEN_OFF
	SET_RIGHT_GREEN_OFF
	jmp	Detect_Blue_Cnt
Turn_Left_Green_On:
	mov	A,Duty_GREEN
	jbc	STATUS, Z
	jmp	Turn_Left_Green_Off
	mov	CntPWM_GREEN,A
	SET_LEFT_GREEN_ON
	SET_RIGHT_GREEN_ON

Detect_Blue_Cnt:
	djz	CntPWM_BLUE
	ret
	LEFT_BLUE_ON_SKIP
	jmp	Turn_Left_Blue_On
Turn_Left_Blue_Off:
	mov	A,Duty_BLUE
	sub	A,@120-1
	jbs	STATUS, C
	jmp	Turn_Left_Blue_On
	mov	CntPWM_BLUE,A
	inc	CntPWM_BLUE
	SET_LEFT_BLUE_OFF
	SET_RIGHT_BLUE_OFF
	ret
Turn_Left_Blue_On:
	mov	A,Duty_BLUE
	jbc	STATUS, Z
	jmp	Turn_Left_Blue_Off
	mov	CntPWM_BLUE,A
	SET_LEFT_BLUE_ON
	SET_RIGHT_BLUE_ON
	ret
;-----------------------------------------------------
;-----------------------------------------------------
IR_Service:
	mov	A,IR_Status
	jbc	STATUS, Z
	jmp	IR_Wait_Now
	jbc    IR_Status, IR_HEAD_LOW
	jmp	IR_Head_Low_Now
	jbc    IR_Status, IR_HEAD_HIGH
	jmp	IR_Head_High_Now
	jbc    IR_Status, IR_DATA_LOW
	jmp	IR_Data_Low_Now
	jbc    IR_Status, IR_DATA_HIGH
	jmp	IR_Data_High_Now
IR_Wait_Now:
	IR_LOW_SKIP
	ret
	mov	A,R6
	bs	 IR_Status, IR_HEAD_LOW
    clr    TimeCnt
	ret
IR_Head_Low_Now:
	mov	A,TimeCnt
	sub	A,@IR_HEAD_LOWMAX
	jbs	STATUS, C
	jmp	Error_Data_Proc
	IR_HIGH_SKIP
	ret
	mov	A,TimeCnt
	sub	A,@IR_HEAD_LOWMIN
	jbc	STATUS, C
	jmp	Error_Data_Proc
	clr	IR_Status
	bs	 IR_Status, IR_HEAD_HIGH
	clr	TimeCnt
	ret
IR_Head_High_Now:
	mov	A,TimeCnt
	sub	A,@IR_HEAD_HIGHMAX
	jbs	STATUS, C
	jmp	Error_Data_Proc
	IR_LOW_SKIP
	ret
	mov	A,TimeCnt
	sub	A,@IR_HEAD_HIGHMIN
	jbc	STATUS, C
	jmp	Error_Data_Proc
	clr	IR_Status
	bs	 IR_Status, IR_DATA_LOW
	clr	TimeCnt
	mov	A,@32
	mov	IRNum,A
	clr	IRCode_E
	clr	IRCode_H
	clr	IRCode_M
	clr	IRCode_L
	ret
IR_Data_Low_Now:
	mov	A,TimeCnt
	sub	A,@IR_DATA_LOWMAX
	jbs	STATUS, C
	jmp	Error_Data_Proc
	IR_HIGH_SKIP
	ret
	mov	A,TimeCnt
	sub	A,@IR_DATA_LOWMIN
	jbc	STATUS, C
	jmp	Error_Data_Proc
	clr	IR_Status
	bs	 IR_Status, IR_DATA_HIGH
	clr	TimeCnt
	ret
IR_Data_High_Now:
	mov	A,TimeCnt
	sub	A,@IR_ONE_MAX
	jbs	STATUS, C
	jmp	Error_Data_Proc
	IR_LOW_SKIP
	ret
	mov	A,TimeCnt
	sub	A,@IR_ZERO_MIN
	jbc	STATUS, C
	jmp	Error_Data_Proc
	mov	A,TimeCnt
	sub	A,@IR_ZERO_MAX
	jbs	STATUS, C
	jmp	If_Data_Bit_High
	bc	 STATUS, C
	jmp	Store_1_Bit
If_Data_Bit_High:
	mov	A,TimeCnt
	sub	A,@IR_ONE_MIN
	jbc	STATUS, C
	jmp	Error_Data_Proc
	bs	 STATUS, C
Store_1_Bit:
	rlc	IRCode_L
	rlc	IRCode_M
	rlc	IRCode_H
	rlc	IRCode_E
	dec	IRNum
	jbc    STATUS, Z
	jmp	Get_Data_End
Get_Next_Data:
	clr	IR_Status
	bs	 IR_Status, IR_DATA_LOW
	clr	TimeCnt
	ret
Get_Data_End:
	mov	A,IRCode_E
	xor	A,@0x00
	jbs	STATUS, Z
	jmp	Error_Data_Proc
	mov	A,IRCode_H
	xor	A,@0x0FF
	jbs	STATUS, Z
	jmp	Error_Data_Proc
	mov	A,IRCode_M
	xor	A,@0x32	;@0x50			;@0x12
	jbs	STATUS, Z
	jmp	Detect_Power_IRKey
	mov	A,IRCode_L
	xor	A,@0x0CD	;@0x0AF		;@0x0ED
	jbs	STATUS, Z
	jmp	Error_Data_Proc
	clr	IR_Status
	clr	TimeCnt
	bs	 Flag, IR_VALID
	ret
Detect_Power_IRKey:
	mov	A,IRCode_M
	xor	A,@0xAA
	jbs	STATUS, Z
	jmp	Error_Data_Proc
	mov	A,IRCode_L
	xor	A,@0x55
	jbs	STATUS, Z
	jmp	Error_Data_Proc
	clr	IR_Status
	clr	TimeCnt
	bs 	Flag, POWER_VALID
	ret
Error_Data_Proc:
	clr	IR_Status
	clr	TimeCnt
	ret

;-----------------------------------------------------
Next_Dirct:
Next_Red:
	mov	A,Duty_RED
	mov	Temp,A
	mov	A,Red_Dirct
	mov	Dirct,A
	call	Next_Unit
	mov	A,Temp
	mov	Duty_RED,A
Next_Green:
	mov	A,Duty_GREEN
	mov	Temp,A
	mov	A,Green_Dirct
	mov	Dirct,A
	call	Next_Unit
	mov	A,Temp
	mov	Duty_GREEN,A
Next_Blue:
	mov	A,Duty_BLUE
	mov	Temp,A
	mov	A,Blue_Dirct
	mov	Dirct,A
	call	Next_Unit
	mov	A,Temp
	mov	Duty_BLUE,A
	inc	Count
	mov	A,Count
	sub	A,@120+10
	jbc	STATUS, C
	ret
	clr	Count
Next_Mode:
	inc	Mode
	mov	A,Mode
	sub	A,@11-1
	jbs	STATUS, C
	clr	Mode
	mov	A,Mode
	call   Red_Table
	mov	Red_Dirct,A
	mov	A,Mode
	call   Green_Table
	mov	Green_Dirct,A
	mov	A,Mode
	call   Blue_Table
	mov	Blue_Dirct,A
	ret
;-----------------------------------------------------
Next_Unit:		;00-DEC, 01-INC, 02-EMPTY, 04-FULL
	jbc	Dirct, 0
	jmp	Inc_Unit
	jbc	Dirct, 1
	jmp	Empty_Unit
	jbc	Dirct, 2
	jmp	Full_Unit
Dec_Unit:
	mov	A,Temp
	jbc	STATUS, Z
	jmp	Empty_Unit
	dec	Temp
	ret
Inc_Unit:
	inc	Temp
	mov	A,Temp
	sub	A,@120-1
	jbs	STATUS, C
	jmp	Full_Unit
	ret
Empty_Unit:
	clr	Temp
	ret
Full_Unit:
	mov	A,@120
	mov	Temp,A
	ret
;-----------------------------------------------------
DispMode_1:
	SET_LEFT_RED_ON
	SET_RIGHT_RED_ON
	SET_LEFT_GREEN_OFF
	SET_RIGHT_GREEN_OFF
	SET_LEFT_BLUE_OFF
	SET_RIGHT_BLUE_OFF
	ret
DispMode_2:
	SET_LEFT_RED_OFF
	SET_RIGHT_RED_OFF
	SET_LEFT_GREEN_ON
	SET_RIGHT_GREEN_ON
	SET_LEFT_BLUE_OFF
	SET_RIGHT_BLUE_OFF
	ret
DispMode_3:
	SET_LEFT_RED_OFF
	SET_RIGHT_RED_OFF
	SET_LEFT_GREEN_OFF
	SET_RIGHT_GREEN_OFF
	SET_LEFT_BLUE_ON
	SET_RIGHT_BLUE_ON
	ret
DispMode_4:
	SET_LEFT_RED_ON
	SET_RIGHT_RED_ON
	SET_LEFT_GREEN_ON
	SET_RIGHT_GREEN_ON
	SET_LEFT_BLUE_OFF
	SET_RIGHT_BLUE_OFF
	ret
DispMode_5:
	SET_LEFT_RED_ON
	SET_RIGHT_RED_ON
	SET_LEFT_GREEN_OFF
	SET_RIGHT_GREEN_OFF
	SET_LEFT_BLUE_ON
	SET_RIGHT_BLUE_ON
	ret
DispMode_6:
	SET_LEFT_RED_OFF
	SET_RIGHT_RED_OFF
	SET_LEFT_GREEN_ON
	SET_RIGHT_GREEN_ON
	SET_LEFT_BLUE_ON
	SET_RIGHT_BLUE_ON
	ret
DispMode_7:
	SET_LEFT_RED_ON
	SET_RIGHT_RED_ON
	SET_LEFT_GREEN_ON
	SET_RIGHT_GREEN_ON
	SET_LEFT_BLUE_ON
	SET_RIGHT_BLUE_ON
	ret
DispMode_8:
	SET_LEFT_RED_OFF
	SET_RIGHT_RED_OFF
	SET_LEFT_GREEN_OFF
	SET_RIGHT_GREEN_OFF
	SET_LEFT_BLUE_OFF
	SET_RIGHT_BLUE_OFF
	ret

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -