📄 main.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 + -