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

📄 xiao.asm

📁 普通io口模拟pwm达到渐变显示效果,本程序用于led灯的渐变.
💻 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 + -