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

📄 pw48akmbrf5.asm

📁 这是电动自行车控制程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
		bsf	FLAG1,BK
		bcf	FLAG1,FUN
		bcf	FLAG0,WL
		bcf	FLAG2,RC	;YIN1.11清滑行反充电标志
		bcf	PORTA,5		;YIN1.13从滑行进入刹车关灯
		clrf	PWMC 
		clrf	PWM_TEMP
		clrf	PWMSP
		movlw	0XFF
		movwf	CCPR1L 		;PWM duty cycle register
		movlw	0X54
		movwf	PORTB
		goto	BK_END
CBK		
		movf	COU_TEMP,0	;ELECTRICIZE
		btfss	STATUS,Z	;ELECTRICIZE
		goto	OFFCBK		;ELECTRICIZE
		movlw	0X1F		;ELECTRICIZE
		subwf	COU_TEMP1,0	;ELECTRICIZE
		btfss	STATUS,C	;ELECTRICIZE
		goto	ELECTRICIZE	;ELECTRICIZE
OFFCBK		incf	COUNCBK	
		btfss	STATUS,Z
		goto	CBK_BAOCHI08
		movlw	0XFF		;ELECTRICIZE 如果速度很低取消充电
		movwf	CCPR1L		;ELECTRICIZE
		bcf	PORTA,5		;ELECTRICIZE	
		goto	BK_END		;ELECTRICIZE
ELECTRICIZE	bsf	PORTA,5		;ELECTRICIZE show electricize
		incf	COUNTERBK0	
		btfss	STATUS,Z
		goto	BK_END
;		movlw	0X20
;		subwf	COUNTERBK1,0
;		btfsc	STATUS,Z
;		goto	BREAK1
;		incf	COUNTERBK1
;		goto	BK_END
BREAK1		movf	COUNCBK,0	;zhj  W=COUNCBK
		sublw	0X08		;zhj	
		btfsc	STATUS,C	;zhj
		goto	CBK_BAOCHI08	;zhj
		movlw	0X04		;zhj
		subwf	COUNCBK,1	;zhj
CBK_BAOCHI08	movf	COUNCBK,0	;zhj
		movwf	CCPR1L		;bsf	PORTA,5		;show CBK
		clrf	PORTB
		goto	BK_END
BNEXT2		incf	COUNTER1
BK_END					
;********************YIN1.16滑行反充电************************
		btfsc	FLAG1,FUN	;YIN1.10
		goto	RC_END
		btfsc	FLAG1,BK
		goto	RC_END
		btfsc	FLAG1,AE
		goto	RC_END
		movlw	0X4D		;把手电压大于0X4D,取消滑行反充电
;		subwf	PWMSP,0
		subwf	SPBUF,0		;YIN1.14
		btfsc	STATUS,C
		goto	CF_RC
		movf	COU_TEMP,0	;速度小于一定值,取消滑行反充电
		btfss	STATUS,Z	
		goto	CF_RC		
		movlw	0X10		
		subwf	COU_TEMP1,0	
		btfss	STATUS,C	
		goto	ELECR_RC	;把手电压小于0X4D,且滑行速度大于一定值	去滑行反充电
CF_RC		btfss	FLAG2,RC	;清滑行反充电标志位
		goto	RC_END
;		incfsz	COUNCBK
		movlw	0X04		;YIN1.14
		addwf	COUNCBK	,1	
		btfss	STATUS,C
		goto	RC_BAOCHI20
		movlw	0XFF
		movwf	CCPR1L
		clrf	COUNTERBK0
		clrf	COUNTERBK1
		clrf	PWMC 		;ELECTRICIZE
		clrf	PWM_TEMP
		clrf	PWMSP		;ELECTRICIZE
		movlw	0XE0		;zhj
		movwf	COUNCBK		;zhj
		bcf	PORTA,5		
		bcf	FLAG2,RC	;ELECTRICIZE	
		goto	RC_END		;ELECTRICIZE
ELECR_RC	btfsc	FLAG2,RC	;滑行反充电标志位
		goto	ELE_RC
		bsf	FLAG2,RC
		bcf	FLAG0,WL
		clrf	PWMC 
		clrf	PWM_TEMP
		clrf	PWMSP		;YIN1.14
		movlw	0XFF
		movwf	CCPR1L 		;PWM duty cycle register
		movlw	0X54
		movwf	PORTB
		movlw	0XE0		;滑行反充电最大值
		movwf	COUNCBK	
		goto	RC_END
ELE_RC	
		bsf	PORTA,5		;滑行反充电指示,高电平
		incf	COUNTERBK0	;延时	
		btfss	STATUS,Z
		goto	RC_END
;		movlw	0X20
;		subwf	COUNTERBK1,0
;		btfsc	STATUS,Z
;		goto	ERC1
;		incf	COUNTERBK1
;		goto	RC_END
ERC1		movf	COUNCBK,0	;W=COUNCBK
		sublw	0X70		;送CCPR1L滑行反充电时最小为0X70	
		btfsc	STATUS,C	;
		goto	RC_BAOCHI20	;
		movlw	0X04		;
		subwf	COUNCBK,1	;
RC_BAOCHI20	movf	COUNCBK,0	;滑行反充电时保持在定值
		movwf	CCPR1L		;
		clrf	PORTB
RC_END
;*****************************************************************
READSP_AND_CONVERT
		btfss	FLAG0,SPV
		goto	TI
		bcf	FLAG0,SPV
		movf	ADBUFSPV,0
		movwf	SPBUF1		;read speed value to SPBUF1
		movlw	0X3B		;speed single low limit
		subwf	SPBUF1,0
		btfsc	STATUS,C
		goto	HIGHLIM
		clrw
HIGHLIM		movwf	SPBUF1		;speed single high limit
		movlw	0XA6		;0806zhj  if high 4.4V invalidation
		subwf	SPBUF1,0	;0806zhj
		btfss	STATUS,C	;0806zhj
		goto	NEXTSPV		;0806zhj
		clrw			;0806zhj	
		movwf	SPBUF1		;speed single high limit
NEXTSPV		movlw	0X94
		subwf	SPBUF1,0
		btfss	STATUS,C
		goto	CONV
		movlw	0X94
		movwf	SPBUF1
CONV		bcf	STATUS,C
       		rrf	SPBUF1,0       	;SPBUF1 divide two	
		call	CONVERT		;convert speed single to PWM duty cycle
		movwf	SPBUF
READEND
;******************************************************************
		incf	COUNTER5
		btfss	STATUS,Z
		goto	S_E_A
		incf	COUNTER6
		movlw	0X20
		subwf	COUNTER6,0
		btfss	STATUS,C
		goto	S_E_A
		clrf	COUNTERB0
		clrf	COUNTERB1
		clrf	COUNTER6
;******************************************************************
;speed adjust
S_E_A		movf	ASPD0,0
		subwf	ASPD,0
		btfsc	STATUS,Z
		goto	COMP
		btfsc	STATUS,C
		goto	INASPD
		goto	DEASPD
INASPD		movf	ASPD,0
		movwf	ASPD0
		goto	COMP
DEASPD		movf	ASPD0,0
		btfss	STATUS,Z
		decf	ASPD0
;------------------------------------------------------------------
COMP		movf	ASPD0,0
		movwf	ASPD
		subwf	SPBUF,0
		btfsc	STATUS,C	;Get the lager one and move to PWMSP
		goto	S_I_N0
		movf	ASPD,0
		movwf	PWMSP
		bsf	FLAG1,AE	;Assist state AE=1
		goto	S_I_N1
S_I_N0		movf	SPBUF,0
		movwf	PWMSP
		bcf	FLAG1,AE	;Electric state AE=0
S_I_N1		movlw	0X4D
		subwf	PWMSP,0
		btfsc	STATUS,C
		goto	ZZ
		btfsc	FLAG2,RC	;YIN1.11
		goto	ZZ		;YIN1.11
		btfsc	FLAG1,BK	;YIN1.13
		goto	ZZ		;YIN1.13
		bcf	FLAG0,ZD
		bcf	FLAG2,ADZ
		bcf	FLAG2,DZIN
		bcf	FLAG2,ASPV
		goto	SPEED
;******************************************************************
ZZ		bcf	FLAG1,FZ
		bsf	FLAG2,DZIN
;------------------------------------------------------------------
SPEED;		btfss	FLAG0,ZD
;		goto	QBPWM0
		movf	COU_TEMP,0
		btfss	STATUS,Z
		goto	QBPWM0
		movlw	0X49
		subwf	COU_TEMP1,0
		btfsc	STATUS,C
		goto	QBPWM
		movlw	0X12		;120R/M
		subwf	COU_TEMP1,0
		btfsc	STATUS,C
		goto	HLP
		movlw	0X60
		movwf	ILIMIT
		goto	LOAD
HLP		bcf	STATUS,C
		rrf	COU_TEMP1,0
		movwf	PWMHL
		movlw	0X09
		subwf	PWMHL,0
		call	ISUB
		movwf	ILIMIT
		goto	LOAD
QBPWM0		movlw	0X60		;4D
		movwf	ILIMIT
		movlw	0XC0		;50%-0XA5
		subwf	PWMSP,0
		btfss	STATUS,C
		goto	LOAD
		movlw	0XC0
		movwf	PWM_TEMP
		goto	OPEN
QBPWM		movlw	0X50		;4D
		movwf	ILIMIT
		movlw	0XA5		;50%-0XA5
		subwf	PWMSP,0
		btfss	STATUS,C
		goto	LOAD
		movlw	0XA5
		movwf	PWM_TEMP
		goto	OPEN
;		btfss	FLAG0,ZD
;		goto	QBPWM0
;		movf	COU_TEMP,0
;		btfss	STATUS,Z
;		goto	QBPWM
;		movlw	0X49
;		subwf	COU_TEMP1,0
;		btfsc	STATUS,C
;		goto	QBPWM
;		movlw	0X11
;		subwf	COU_TEMP1,0
;		btfsc	STATUS,C
;		goto	HLP
;		movlw	0X60
;		movwf	ILIMIT
;		goto	LOAD
;HLP		bcf	STATUS,C
;		rrf	COU_TEMP1,0
;		movwf	PWMHL
;		movlw	0X08
;		subwf	PWMHL,0
;		call	ISUB
;		movwf	ILIMIT
;		movlw	0XED
;		subwf	PWMSP,0
;		btfss	STATUS,C
;		goto	LOAD
;		movlw	0XED
;		movwf	PWM_TEMP
;		goto	OPEN		
;QBPWM0		movlw	0X60			;4D
;		movwf	ILIMIT
;		movlw	0XC0			;50%-0XA5
;		subwf	PWMSP,0
;		btfss	STATUS,C
;		goto	LOAD
;		movlw	0XC0
;		movwf	PWM_TEMP
;		goto	OPEN
;QBPWM		movlw	0X50			;4D
;		movwf	ILIMIT
;		movlw	0XA5			;50%-0XA5
;		subwf	PWMSP,0
;		btfss	STATUS,C
;		goto	LOAD
;		movlw	0XA5
;		movwf	PWM_TEMP
;		goto	OPEN
;------------------------------------------------------------------
LOAD		movf	PWMSP,0
		movwf	PWM_TEMP
OPEN		btfsc	FLAG1,FUN
		goto	C_TEMP
		movf	PWM_TEMP,0
		movwf	PWM_TEMP0
		goto	TEMP_V	
C_TEMP		movf	PWM_TEMP0,0
		subwf	PWM_TEMP,0
		btfsc	STATUS,C
		goto	TEMP_V
		movf	PWM_TEMP0,0
		movwf	PWM_TEMP	
TEMP_V		movf	PWM_V,0		;PWM_TEMP=PWM_TEMP-PWM_V
		subwf	PWM_TEMP,0
		btfss	STATUS,C
		clrw
		movwf	PWM_TEMP
		sublw	0X4B		;PWM_TEMP>0X4B
		btfss	STATUS,C
		goto	S_CURRISE
		movlw	0X4B
		movwf	PWM_TEMP
S_CURRISE
		btfss	FLAG2,ASPV
		goto	SC2
		goto	SC1
;SC		btfss	FLAG1,BK
;		goto	SC2
;		goto	SC1
SC2		btfss	FLAG2,ADZ
		goto	S_END
SC1		clrf	PWM_TEMP
		clrf	PWMC
		movlw	0XFF
		movwf	CCPR1L
S_END
;******************************************************************
;		btfsc	FLAG1,BK
;		goto	TI
;		btfss	FLAG2,REA
;		goto	LOWSPEED
;------------------------------------------------------------------
;HIGHSPEED	movf	COU_TEMP,0	;6N.M convert
;		btfss	STATUS,Z
;		goto	RELEASE
;		movlw	0X0E		;390r/m
;		subwf	COU_TEMP1,0
;		btfss	STATUS,C
;		goto	TI
;RELEASE		movf	COUNTERREA,0
;		btfsc	STATUS,Z
;		goto	RELEASE1
;		decf	COUNTERREA
;		goto	TI
;RELEASE1	movlw	0XFF
;		movwf	CCPR1L
;		movlw	0X54
;		movwf	PORTB
;		bcf	PORTA,5
;		bcf	FLAG2,REA
;		call	DELA
;		goto	TI
;------------------------------------------------------------------
;LOWSPEED	movf	COU_TEMP,0	;8N.M convert
;		btfss	STATUS,Z
;		goto	TI
;		movlw	0X0C		;280r/m
;		subwf	COU_TEMP1,0
;		btfsc	STATUS,C
;		goto	TI
;ICON1		movlw	0X40		;6A/12A
;		subwf	IBUF,0
;		btfsc	STATUS,C
;		goto	TI
;SUCTION		movlw	0X10
;		subwf	COUNTERREA,0
;		btfsc	STATUS,Z
;		goto	SUCTION1
;		incf	COUNTERREA
;		goto	TI
;SUCTION1	movlw	0XFF
;		movwf	CCPR1L
;		movlw	0X54
;		movwf	PORTB
;		bsf	PORTA,5
;		bsf	FLAG2,REA
;		call	DELA
;******************************************************************
TI		btfss	FLAG0,I
		goto	NOTLOAD
		bcf	FLAG0,I
		bcf	STATUS,C
		rrf	DATAI1
		bcf	STATUS,C
		rrf	ADBUFI,0
		addwf	DATAI1
		movf	DATAI1,0
		movwf	IBUF
;------------------------------------------------------------------
		btfsc	FLAG1,HX1
		goto	PULLPHASE
TWL		btfss	FLAG0,WL
		goto	NOT_WL
;WL
;------------------------------------------------------------------
		call	PI
		btfss	FLAG0,FY
		goto	ADDY
		goto	DECY
ADDY		movf	Y,0		;FLAG0.FY=0,then PWMC=PWMC+Y
		addwf	PWMC,0
		btfsc	STATUS,C
		movlw	0XFF		;PWMC<0XFF
		movwf	PWMC
		goto	CALEND
DECY		movf	Y,0		;FLAG0.FY=1,then PWMC=PWMC-Y
		subwf	PWMC,0
		btfss	STATUS,C
		clrw
		movwf	PWMC
		sublw	0X4B		;PWMC>0X4B
		btfss	STATUS,C
		goto	CALEND
		movlw	0X4B
		movwf	PWMC
CALEND		
;------------------------------------------------------------------
S_I_N2		movf	PWM_TEMP,0	;Compare PWM_TEMP with PWMC
		subwf	PWMC,0
		btfss	STATUS,C
		goto	S_I_N3		;PWM_TEMP>PWMC
		movf	COUNTER2,0	;PWM_TEMP<PWMC
		sublw	0X02		;COUNTER2<0X40!
		btfss	STATUS,Z
		goto	S_I_N4
		goto	S_I_N5
S_I_N4		incf	COUNTER2	;PWM_TEMP<PWMC&COUNTER2<0X40
		goto	S_I_END
S_I_N5		bcf	FLAG0,WL	;PWM_TEMP<PWMC&COUNTER2>0X40
		clrf	COUNTER2
		goto	S_I_END
S_I_N3		clrf	COUNTER2	;PWM_TEMP>PWMC
		goto	S_I_END
;-------------------------------------------------------------------
NOT_WL		movf	IBUF,0
		subwf	ILIMIT,0	;Compare now current with current limit
		btfss	STATUS,C
		goto	OVERCURRENT
		movf	COUNTER3,0
		btfss	STATUS,Z
		decf	COUNTER3
		goto	IOVER
OVERCURRENT				;FLAG1.WL=0&overcurrent
		incf	COUNTER3
		movlw	0X01		;0X03
		subwf	COUNTER3,0
		btfss	STATUS,C
		goto	IOVER
		bsf	FLAG0,WL
		clrf	COUNTER3
		goto	NOTLOAD
IOVER
;------------------------------------------------------------------
		movf	PWM_TEMP,0	;Compare PWM_TEMP with PWMC
		subwf	PWMC,0
		btfsc	STATUS,Z
		goto	LEND
		btfsc	STATUS,C
		goto	DPWM
		movlw	0X03
		addwf	PWMC,0
		btfsc	STATUS,C
		movlw	0XFF
		movwf	PWMC
		goto	LEND
DPWM		movlw	0X03
		subwf	PWMC,0
		btfss	STATUS,C
		clrw
		movwf	PWMC
LEND
;---------------------------------------------------------------------------------
S_I_END		movlw	0X4B
		addwf	PWMSPL,0
		btfsc	STATUS,C
		movlw	0XFF
		movwf	PWMXZ	
;---------------------------------------------------------------------------------
		movf	PWMC,0
		subwf	PWMXZ,0
		btfsc	STATUS,C
		goto	PCOM
		movf	PWMXZ,0
		movwf	PWMC
;---------------------------------------------------------------------------------
PCOM		btfsc	FLAG1,BK
		goto	NOTLOAD
		btfsc	FLAG2,RC	;YIN1.11
		goto	NOTLOAD		;YIN1.11
		movf	PWMC,0
		sublw	0XFF
		movwf	CCPR1L
NOTLOAD
;*********************************************************************************
FUNCOV_DETECT	
		btfss	PORTA,4		;PORTA<2> is the mode input I/O
		goto	NEXT1		;If PORTA<2> is low level,then increase one
		bcf	FLAG1,FUNCON	;Permit convert
		clrf	C_FUN1		;If PORTA<2> is high level,clear C_FUN1
		btfss	FLAG1,FC	;If have convert flag,then set FLAG0.FUN
		goto	FUNCTIONEND
		bcf	FLAG1,FC
		btfsc	FLAG1,FUN	;PORTA<2>=1&FLAG0.FC=1,then convert function
		goto	INV
		bsf	FLAG1,FUN
		goto	FUNCTIONEND
INV		bcf	FLAG1,FUN
		goto	FUNCTIONEND	;If PORTA<2> is high ,do not convert function
NEXT1	
		btfsc	FLAG1,FUNCON
		goto	FUNCTIONEND
		incf	C_FUN1		
		movlw	0X10
		subwf	C_FUN1,0
		btfss	STATUS,C	;If C_FUN1>0XF0,then set function convert flag
		goto	FUNCTIONEND
		bsf	FLAG1,FUNCON	;Set in convert proess
		clrf	C_FUN1
		bsf	FLAG1,FC
FUNCTIONEND
;********************************************************************	
FUNCTION_DISPPLAY
		btfsc	FLAG1,FUN
		goto	SS
		btfsc	FLAG1,AE
		goto	AS
		goto	ES
AS		bsf	DISPR,DEL	;assist state
		bcf	DISPR,DAS
		bsf	DISPR,DSC
		goto	FUNEND
ES		bcf	DISPR,DEL	;electric state
		bsf	DISPR,DAS
		bsf	DISPR,DSC
		goto	FUNEND
SS		bsf   	DISPR,DEL	;Scurise state
		bsf	DISPR,DAS
		bcf	DISPR,DSC
FUNEND
;********************************************************************
		movlw	0X03		;DZ protect
		subwf	COUNTERDZ,0
		btfss	STATUS,C
		goto	DZOVER
		bsf	FLAG2,ADZ
		bcf	FLAG0,WL
		clrf	PWMC
		movlw	0XFF
		movwf	CCPR1L
DZOVER
;*******************************************************************
PULLPHASE
		clrwdt
		clrf	SAMCOUNT
DIGIN		movf	PORTC,0		;read PORTC to W
		andlw	0X38
		xorwf	PC_TEMP
		btfss	STATUS,Z
		goto	NSAME
		movwf	PC_TEMP
		incf	SAMCOUNT
		movlw	0X03
		subwf	SAMCOUNT,0
		btfsc	STATUS,Z
		goto	FIND
		goto	DIGIN
NSAME		movwf	PC_TEMP
		clrf	SAMCOUNT
		goto	DIGIN
FIND
;--------------------------------------------------------------------
		movf	PC_TEMP,0
		xorwf	PC_TEMP2,0
		btfsc	STATUS,Z
		goto	SAME
		movlw	0X10
		subwf	PC_TEMP2,0
		btfss	STATUS,Z
		goto	S2
S1		movlw	0X30
		subwf	PC_TEMP,0
		btfss	STATUS,Z
		goto	HXCL1
		goto	HXCL
S2		movlw	0X30
		subwf	PC_TEMP2,0
		btfss	STATUS,Z
		goto	S3
		movlw	0X20
		subwf	PC_TEMP,0
		btfss	STATUS,Z
		goto	HXCL1
		goto	HXCL
S3		movlw	0X20
		subwf	PC_TEMP2,0
		btfss	STATUS,Z
		goto	S4
		movlw	0X28
		subwf	PC_TEMP,0
		btfss	STATUS,Z
		goto	HXCL1
		goto	HXCL
S4		movlw	0X28
		subwf	PC_TEMP2,0
		btfss	STATUS,Z
		goto	S5
		movlw	0X08
		subwf	PC_TEMP,0
		btfss	STATUS,Z
		goto	HXCL1
		goto	HXCL
S5		movlw	0X08
		subwf	PC_TEMP2,0
		btfss	STATUS,Z
		goto	S6
		movlw	0X18
		subwf	PC_TEMP,0
		btfss	STATUS,Z
		goto	HXCL1
		goto	HXCL
S6		movlw	0X18
		subwf	PC_TEMP2,0
		btfss	STATUS,Z
		goto	HXCL1
		movlw	0X10
		subwf	PC_TEMP,0
		btfss	STATUS,Z
		goto	HXCL1	
HXCL		bcf	FLAG1,FZ
		decfsz	COUPASE
		goto	SETHX
		movlw	0X0C
		movwf	COUPASE
		movf	COUNTERDZ,0
		movwf	COU_TEMP
		movf	COUNTERDZ1,0
		movwf	COU_TEMP1
		clrf	COUNTERDZ1
		clrf	COUNTERDZ
		goto	SETHX
HXCL1		movlw	0X01

⌨️ 快捷键说明

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