📄 xiao.asm
字号:
;email:qiuqcc@163.com qq:29967689
;==========================
;BANK 0
R0 EQU 0X00
R1 EQU 0X01
R2 EQU 0X02
R3 EQU 0X03
C EQU 0X00
DC EQU 0X01
Z EQU 0X02
PS0 EQU 0X05
PS1 EQU 0X06
IOCPAGE EQU 0X07
R4 EQU 0X04
R5 EQU 0X05
R6 EQU 0X06
R7 EQU 0X07
R8 EQU 0X08
R9 EQU 0X09
RA EQU 0X0A
RAMP EQU 0X04
RB EQU 0X0B
RC EQU 0X0C
RD EQU 0X0D
RE EQU 0X0E
RF EQU 0X0F
IOCE EQU 0X0E
R3_BUF EQU 0X10
R4_BUF EQU 0X11
ACC_BUF EQU 0X12
KFLAG EQU 0X13
FANGXIANGCHAN EQU 0X07
PWM_EN EQU 0X06
SWCHIP EQU 0X05
WAITTIME EQU 0X04
RLDAT EQU 0X14
RTMP1 EQU 0X15
RTMP2 EQU 0X16
RTMP3 EQU 0X17
STAR_TIME EQU 0X18
SET_TEMP EQU 0X19
INRTMP1 EQU 0X1A
INRTMP2 EQU 0X1B
TIMFLAG EQU 0X1C
DET_TEMPF EQU 0X04 ;FOR_READY_TO_DETECT_TEMP
ST1MSF EQU 0X03
ST08mSF EQU 0X02
TWOLUF EQU 0X01
DETPOW EQU 0X00
AC_STAR_CT EQU 0X1D
AC_STAR_REF EQU 0X04
TIMEBUF1 EQU 0X1E
TIMEBUF2 EQU 0X1F
RGBBUF1 EQU 0X20
RGBBUF2 EQU 0X21
RGBBUF3 EQU 0X22
RGBBUF4 EQU 0X23
RGBBUF5 EQU 0X24
RGBBUF6 EQU 0X25
TIMERTMP1 EQU 0X26
TIMEBUF04 EQU 0X27
TIMEBUF05 EQU 0X28
TIMEBUF06 EQU 0X29
BUFLOOP EQU 0X2A
PWMBUF EQU 0X2B
PWMEND EQU 0X2C
RGBTIME EQU 0X2D
GRBTIME EQU 0X2D
COLOCRTIME EQU 0X2E
PG1 EQU 0X06
GRN1 EQU 0X01
PB1 EQU 0X06
BLE1 EQU 0X00
;=================
ORG 0X0000
;================
JBS R3,4
JMP dogon
DISI
CLR R4
CLR R3
BC R3,PS0
BC R3,PS1
JMP RESET
;=================
ORG 0X0008
;=================
INTDET:
MOV ACC_BUF,A ;FOR PUSH A
SWAP ACC_BUF
SWAPA R3
MOV R3_BUF,A ;FOR PUSH 0X03
MOV A,R4
MOV R4_BUF,A ;FOR PUSH 0X04
CLR R3
CLR R4
MOV A,@0X80
MOV R1,A
JBC RF,0X00
JMP TCCINT ;DET TCC_IRQ
INTDET_R:
MOV A,@00000000B
MOV RF,A
MOV A,R4_BUF
MOV R4,A
SWAPA R3_BUF
MOV R3,A
SWAPA ACC_BUF
RETI
;一次的时间是256us.一整段长度是7.936毫秒 158.72毫秒变换一次
TCCINT:
BS TIMFLAG,ST1MSF
MOV A,@0X80
ADD RGBBUF2,A
JBS R3,C
JMP INTDET_R
TCCINT1:
;=============FOR_50HZ
MOV A,@00100000B
JBS R6,0X05
MOV A,@00000000B
XOR A,AC_STAR_CT
AND A,@00010000B
JBS R3,Z
JMP DET_50HZ_3_1 ;有变化
;没有变化
DET_50HZ_2:
MOV A,@00000100B
ADD STAR_TIME,A
MOV A,@11001000B
SUB A,STAR_TIME ;IF > 12.8mS
JBC R3,C
JMP DET_50HZ_4 ; 大于12.8毫秒要修正引脚状态
;引脚状态没有改变,时间也不到预计的
JMP TCCC_INT_3
;端口检测到变化
DET_50HZ_3_1:
MOV A,STAR_TIME
AND A,@11111100B
SUB A,@01110000B ;7.168MS
JBC R3,C
JMP DET_50HZ_2 ;RETURN 小于7.8 那是错误触发的
;大于7.8说明是到了10毫秒 可以改变状态
;引脚改变了状态,跟着修改这个位.
DET_50HZ_4:
MOV A,@00110000B
AND AC_STAR_CT,A
MOV A,@00100000B
XOR AC_STAR_CT,A
CLR STAR_TIME
BS TIMFLAG,ST08mSF
INC TIMEBUF1
MOV A,TIMEBUF1
SUB A,@100
JBS R3,Z
JMP TCCC_INT_3
CLR TIMEBUF1
INC TIMEBUF2 ;一秒钟的计时
MOV A,TIMEBUF2
SUB A,@20
JBS R3,Z
JMP TCCC_INT_3
CLR TIMEBUF2
TCCC_INT_3:
JMP INTDET_R
;处理PWM的输出.
RUNPWM:
NOP
;JBS TIMFLAG,ST1MSF
;JMP TCC_INT01
BC TIMFLAG,ST1MSF
CALL DEL15US
JBC KFLAG,WAITTIME
JMP WAITAC50
MOV A,@0X3F
AND PWMEND,A
AND PWMBUF,A
;INC PWMEND
MOV A,PWMEND
SUB A,PWMBUF
JBS R3,Z
JMP TCC_INT_CHG1 ;相等就转换到低电平
INC PWMEND
TCC_INT_CHGK:
;JBC COLOCRTIME,0X00
;JMP COLOCRCHAN6
BS PG1,GRN1
BC PB1,BLE1
JMP TCC_INT01
COLOCRCHAN6:
BS PB1,BLE1
BC PG1,GRN1
JMP TCC_INT01
TCC_INT_CHG1:
INC PWMEND
MOV A,PWMEND
SUB A,@0X3E ;总长度10豪秒
JBC R3,C
JMP TCC_INT01 ;小于跳转
CLR PWMEND ;时间到了变高电平
;JBC COLOCRTIME,0X00
;JMP COLOCRCHAN0
BS PB1,BLE1
BC PG1,GRN1
JMP TCC_INT_CHG3
COLOCRCHAN0:
BS PG1,GRN1
BC PB1,BLE1
JMP TCC_INT_CHG3
;==========================================================
TCC_INT_CHG3:
INC TIMERTMP1 ;10*80=800ms步进一个单位
MOV A,TIMERTMP1
SUB A,@110
JBC R3,C
JMP TCC_INT01 ;小于跳转
CLR TIMERTMP1
;BS KFLAG,WAITTIME
JBS KFLAG,FANGXIANGCHAN;KFLAG,WAITTIME
JMP CHANGFX
INC PWMBUF ;一直增加到大于等于31的时候就改变方向
MOV A,PWMBUF
SUB A,@0X3E
JBC R3,C
JMP TCC_INT01 ;小于跳转
BC KFLAG,FANGXIANGCHAN;KFLAG,WAITTIME
BS KFLAG,WAITTIME
;INC COLOCRTIME
;CLR PWMBUF
JMP WAITAC52;TCC_INT_CHGK
TCC_INT01:
JMP HAH3
CHANGFX:
DEC PWMBUF
MOV A,PWMBUF
SUB A,@0X03
JBS R3,C
JMP TCC_INT01 ;大于跳转
BS KFLAG,FANGXIANGCHAN;KFLAG,WAITTIME
BS KFLAG,WAITTIME
;INC COLOCRTIME
;JMP TCC_INT01;TCC_INT_CHGK
WAITAC52:
JBS KFLAG,FANGXIANGCHAN
JMP WAITAC51
BS PG1,GRN1
BC PB1,BLE1
JMP TCC_INT01
WAITAC51:
BS PB1,BLE1
BC PG1,GRN1
JMP TCC_INT01
;==================FOR RESET THE MCU
RESET:
MOV A,@00000000B
CONTW ;TCC=8MS
MOV A,@10000000B ;开看门狗
IOW IOCE
MOV A,@11111011B ;P6,2内部上拉
IOW RD
CLR R6
CLR R5
MOV A,@0x11 ;
IOW R5 ;
MOV A,@11111100B ;
IOW R6 ;
CLR R6
CLR R5
;==================RESET COMMAN REGISTER AND REGISTER(BANK0,1)
MOV A,@10H
MOV R4,A
LOOP1:
CLR R0
INC R4
MOV A,@00111111B
AND A,R4
SUB A,@0X2F
JBS R3,Z
JMP LOOP1
LOOP2:
CLR R4
;默认参数的值
LOOP3:
MOV A,@00000001B ;TCC ENABLE
IOW RF
ENI
;============ MAIN START
HAH2:
WDTC
eni
JBC KFLAG,PWM_EN ;先处理PWM的输出.
JMP RUNPWM
HAH3:
JBC TIMFLAG,ST08mSF ;8豪秒的时间处理
JMP RLROUT1
HAH4:
JBC KFLAG,PWM_EN
JMP HAH2
JBC TIMFLAG,ST1MSF
JMP RLRWLT
JMP HAH2
RLRWLT:
BC TIMFLAG,ST1MSF
JBS TIMFLAG,TWOLUF
JMP RLRMODE
INC RGBBUF1
MOV A,@0X0F
AND RGBBUF1,A
MOV A,RGBBUF1
SUB A,@10
JBS R3,2
JMP RLROUT31
CLR RGBBUF1
BS PG1,GRN1
BC PB1,BLE1
JMP RLRMODE
RLROUT31:
MOV A,RGBBUF1
SUB A,@6
JBS R3,2
JMP RLRMODE
BC PG1,GRN1
BS PB1,BLE1
JMP RLRMODE
RLRMODE:
JMP HAH2
;==========================================
;10毫秒处理过程
RLROUT1:
BC TIMFLAG,ST08mSF
JBC R6,0X03
JMP RLROUT4
JBC TIMFLAG,DETPOW
JMP RLERT
MOV A,@0X40
ADD TIMEBUF06,A
JBS R3,2
JMP RLROUT3
RLERT:
BS TIMFLAG,DETPOW
DISI
SLEP
JMP RLROUT3
RLRT06:
MOV A,@62
JMP RLROUT5
RLRT05:
MOV A,@124
JMP RLROUT5
RLROUT4:
JBS TIMFLAG,DETPOW
JMP RLROUT2
INC RLDAT
BC TIMFLAG,TWOLUF
MOV A,@0X07
AND RLDAT,A
MOV A,RLDAT
XOR A,@3
JBC R3,2
CALL SETMODE2
MOV A,RLDAT
XOR A,@6
JBC R3,2
JMP RLRT06
MOV A,RLDAT
XOR A,@5
JBC R3,2
JMP RLRT05
MOV A,RLDAT
XOR A,@4
JBS R3,2
JMP RLROUT2
MOV A,@248
RLROUT5:
MOV TIMEBUF04,A
BC KFLAG,PWM_EN
RLROUT2:
BC TIMFLAG,DETPOW
CLR TIMEBUF06
RLROUT3:
JBC KFLAG,PWM_EN
JMP HAH2
MOV A,RLDAT
AND A,@00000111B
ADD R2,A
JMP MOD_STEP_0
JMP MOD_STEP_1
JMP MOD_STEP_2
JMP MOD_STEP_3
JMP MOD_STEP_4
JMP MOD_STEP_5
JMP MOD_STEP_6
JMP MOD_STEP_7
MOD_STEP_7:
CLR RLDAT
MOD_STEP_0:
BC PG1,GRN1
BS PB1,BLE1
JMP HAH4
MOD_STEP_1:
BS TIMFLAG,TWOLUF
;BS PB1,BLE1
;BS PG1,GRN1
JMP HAH4
MOD_STEP_2:
BS PG1,GRN1
BC PB1,BLE1
JMP HAH4
MOD_STEP_3:
JMP HAH4
MOD_STEP_4:
MOD_STEP_5:
MOD_STEP_6:
;一秒钟跳动一次,依次为 R-G-B-RG-RB-GB-RGB-R-G-B-RG-RB-GB-RGB-OVER
MOD_STEP_G:
INC TIMEBUF05
MOV A,TIMEBUF05
SUB A,TIMEBUF04
JBC R3,C
JMP HAH4
BC TIMFLAG,TWOLUF
CLR TIMEBUF05
STEP_0_000:
SWAPA RLDAT
AND A,@0X03
MOV RTMP1,A
SUB A,@3
JBC R3,Z
JMP STEP_0_00E
BC PG1,GRN1
BC PB1,BLE1
MOV A,RTMP1
JBC R3,2
JMP STEP_0_00
SUB A,@1
JBC R3,2
JMP STEP_0_01
BS PG1,GRN1
STEP_0_02:
MOV A,@0X10
ADD RLDAT,A
JMP HAH4
STEP_0_00E:
MOV A,@0X0F
AND RLDAT,A
JMP STEP_0_000
STEP_0_00:
BS PB1,BLE1
JMP STEP_0_02
STEP_0_01:
BS TIMFLAG,TWOLUF
;BS PB1,BLE1
;BS PG1,GRN1
JMP STEP_0_02
;==============================================
WAITAC50:
MOV A,TIMEBUF2
SUB A,@9
JBC R3,C
JMP TCC_INT01
BC KFLAG,WAITTIME
CLR TIMEBUF1
CLR TIMEBUF2
JMP TCC_INT01
SETMODE2:
;CLR COLOCRTIME
CLR PWMEND
CLR PWMBUF
CLR TIMEBUF1
CLR TIMEBUF2
BS KFLAG,PWM_EN
RET
dogon:
MOV A,@00000000B
CONTW ;TCC=8MS
MOV A,@10000000B ;开看门狗
IOW IOCE
MOV A,@0xFF ;
IOW R5 ;
MOV A,@11111100B ;
IOW R6 ;
MOV A,@00000001B ;TCC ENABLE
IOW RF
JMP HAH2
DEL15US:
JMP $+1
JMP $+1
JMP $+1
JMP $+1
JMP $+1
JMP $+1
JMP $+1
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -