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

📄 ver30.asm

📁 用一片单片机控制两个直流无刷电机运转,所以可有效的控制两个直流无刷电机的同步运转
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	btfss status,c	;有无进位
	goto addspeedmed	;lowspeedmed+speedatamed
	movlw 1h	;有进位则LOWSPEEDMED+1
	addwf lowspeedmed,f
	btfss status,c	;有无进位
	goto addspeedmed	;无进位则lowspeedmed+speeddatamed
	incf lowspeedhig,f	;有进位则LOWSPEEDHIG+1
addspeedmed
	movlw speeddatamed
	addwf lowspeedmed,f
	btfss status,c	;有无进位
	return	
	incf lowspeedhig,f	;有进位则LOWSPEEDHIG+1
	return
;************
;增加子程序
;************
increasekeysub
	;call delaysub	;
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw increasekey	;是否为increasekey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return
	bcf defaultflag	;缺省标志置0
	call threelowtonesub
	return
;***************
;减小子程序
;***************
decreasekeysub
	;call delaysub	;
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw decreasekey	;是否为decreasekey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return
	bsf defaultflag	;缺省标志置1
	call threelowtonesub
	return
;**************
;上升下降子程序
;**************
updownkeysub
	bcf storeflag	;数据需要保存
	btfss defaultflag
	goto callcontinueup
	call continuedownsub
	return
callcontinueup
	call continueupsub
	return
;**********************
;设置状态TO运行状态子程序
;**********************
modetorunkeysub
	;call delaysub		;延时后是否仍为modetorunkey按钮,是则继续
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp		
	movlw modetorunkey	;是否为modetorunkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return	;不是则返回
	bsf runmodeflag	;设置运行标记
	call onehightwolowtonesub
	return
;*******************
;置0子程序
;*******************
zerokeysub
	call delaysub		;延时后是否仍为zeroset按钮,是则继续
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp		
	movlw zerokey	;是否为zeroset按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return	;不是则返回

	movf bottomlow,w	;是则置0
	movwf pulselow
	movf bottommed,w
	movwf pulsemed
	movf bottomhig,w
	movwf pulsehig
	movlw bottommin
	movwf pulselow1
	clrf pulsemed1
	clrf pulsehig1
	clrf toplowmax
	clrf topmedmax
	clrf tophigmax
	clrf toplow
	clrf topmed
	clrf tophig
	clrf lowspeedhig
	clrf lowspeedmed
	clrf lowspeedlow
	clrf flag
	clrf flag1
	clrf flag2
	clrf flag3
	clrf topcount
	clrf advcount
	clrf advcounttemp
	clrf count5
	movlw delaytempstart
	movwf delaytemp 
	call mainchecksub	;判断是否为主控制器
	call threehightonesub
	return
;*********************
;上限位置数据保存子程序
;*********************
storekeysub
	call delaysub	;
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw storekey	;是否为storekey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return
	movlw advcountmax	;广告画数是否为最大
	subwf advcount,w
	btfsc status,z	
	goto storekeyend1	;是则结束
	
	btfsc topsetflag
	return	;已保存则结束
	bcf storeflag	;数据需要保存
	movlw topstart
	addwf topcount,w
	movwf fsr

	movf delaytemp,w	;保存每一幅画停留的时间
	movwf indf

	incf fsr,f
	movf pulselow,w		;pulselow=fsr+1设置上限位置
	movwf indf

	incf fsr,f
	movf pulsemed,w		;pulsemed=fsr+2
	movwf indf

	incf fsr,f
	movf pulsehig,w		;pulsehig=fsr+3
	movwf indf

	incf fsr,f		;最后一幅画的停留时间
	movf delaytemp,w
	movwf indf

	movlw 4h
	addwf topcount,f	;topcount+4
	movf topcount,w
	movwf topdatacountreg
	incf topdatacountreg,f	;需要保存的数据个数
	
	incf advcount,f
	movf advcount,w
	movwf advcounttemp
	bsf topflag
	bsf topsetflag
	call threelowtonesub
	return
storekeyend1
	call threelowtonesub
	call delaysub
	call delaysub
	call threelowtonesub
	return

;*********************
;电机速度更改为缺省值子程序
;*********************
defaultspeedkeysub
	;call delaysub	;
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw defaultspeedkey	;是否为defaultspeedkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return
waitnotdefaultspeedkey
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw defaultspeedkey	;是否为updefaultspeedkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfsc status,z		;=0?
	goto waitnotdefaultspeedkey	;等待直到放开按键
	call threelowtonesub	;三声低音
	return

;*********************
;电机设置速度更改子程序
;*********************
setspeedkeysub
;	;call delaysub	;
;	call delaysub
;	movlw remotemask
;	andwf remote,w	;读取遥控器输入数据
;	movwf remotetemp	
;	movlw setspeedkey	;是否为setspeedkey按钮
;	subwf remotetemp,w	;remotetemp-w
;	btfss status,z		;=0?
;	return
;waitnotsetspeedkey
;	call delaysub
;	movlw remotemask
;	andwf remote,w	;读取遥控器输入数据
;	movwf remotetemp	
;	movlw setspeedkey	;是否为upsetspeedkey按钮
;	subwf remotetemp,w	;remotetemp-w
;	btfsc status,z		;=0?
;	goto waitnotsetspeedkey	;等待直到放开按键
;	bcf storeflag	;数据需要保存
;	btfss defaultflag	
;	goto addsetspeedadcbranch	;增加设置速度
;	movlw d'25'
;	subwf setspeedreg,f	;setspeedreg-5
;	movlw settimespeedadcmin	;是否到设置速度最小值
;	subwf setspeedreg,w
;	btfsc status,c
;	goto setspeedend1	;不到最小值则返回
;	movlw settimespeedadcmin	;到最小值则不能再减小
;	movwf setspeedreg
;	goto setspeedend
;addsetspeedadcbranch
;	movlw d'25'
;	addwf setspeedreg,f	;setspeedreg+5
;	movlw settimespeedadcmax	;是否到设置速度最大值
;	subwf setspeedreg,w
;	btfss status,c
;	goto setspeedend1	;不到最大值则返回
;	movlw settimespeedadcmax	;到最大值则不能再增加
;	movwf setspeedreg
;setspeedend
;	call threelowtonesub	;三声低音
;	return
;setspeedend1
;	call twolowtonesub	;二声低音
	return	
;*************************
;电机同时运转速度更改子程序
;*************************
sametimespeedkeysub
	;call delaysub	;
;	call delaysub
;	movlw remotemask
;	andwf remote,w	;读取遥控器输入数据
;	movwf remotetemp	
;	movlw sametimespeedkey	;是否为sametimespeedkey按钮
;	subwf remotetemp,w	;remotetemp-w
;	btfss status,z		;=0?
;	return
;waitnotsametimespeedkey
;	call delaysub
;	movlw remotemask
;	andwf remote,w	;读取遥控器输入数据
;	movwf remotetemp	
;	movlw sametimespeedkey	;是否为sametimespeedkey按钮
;	subwf remotetemp,w	;remotetemp-w
;	btfsc status,z		;=0?
;	goto waitnotsametimespeedkey	;等待直到放开按键
;	bcf storeflag	;数据需要保存	
;	btfss defaultflag	
;	goto addsametimespeedadcbranch	;增加设置速度
;	movlw d'25'
;	subwf sametimespeedreg,f	;sametimespeedreg-5
;	movlw sametimespeedadcmin	;是否到设置速度最小值
;	subwf sametimespeedreg,w
;	btfsc status,c
;	goto sametimespeedend1	;不到最小值则返回
;	movlw sametimespeedadcmin	;到最小值则不能再减小
;	movwf sametimespeedreg
;	goto sametimespeedend
;addsametimespeedadcbranch
;	movlw d'25'
;	addwf sametimespeedreg,f	;sametimespeedreg+2
;	movlw sametimespeedadcmax	;是否到设置速度最大值
;	subwf sametimespeedreg,w
;	btfss status,c
;	goto sametimespeedend1	;不到最大值则返回
;	movlw sametimespeedadcmax	;到最大值则不能再增加
;	movwf sametimespeedreg
;sametimespeedend
;	movf sametimespeedreg,w
;	movwf upsametimespeedreg
;	movwf downsametimespeedreg
;	call threelowtonesub
;	return
;sametimespeedend1
;	movf sametimespeedreg,w
;	movwf upsametimespeedreg
;	movwf downsametimespeedreg
;	call twolowtonesub
	return
;**********************
;运行状态到设置状态子程序
;**********************
runtomodekeysub
	;call delaysub		;延时后是否仍为runtomodekey按钮,是则继续
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp		
	movlw runtomodekey	;是否为modetorunkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return	;不是则返回
	bcf runmodeflag	;设置运行标记
	call onehightwolowtonesub
	return
;****************
;改变参数标记置0子程序
;****************
clearchangeparameterflagsub
	;call delaysub	
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp		
	movlw stopandrunkey	;是否为stopandrunkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return	;不是则返回
clearchangeloop
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw stopandrunkey	;是否为stopandrunkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfsc status,z		;=0?
	goto clearchangeloop	;等待直到放开按键

	bcf changeparameterflag	;改变参数标记置0
	call threelowtonesub
	return

;***************************
;改变某一幅画的停留时间子程序
;***************************
stoptimekeysub
	;call delaysub	;
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw stoptimekey	;是否为stoptimekey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return
waitnotstoptimekey
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw stoptimekey	;是否为stoptimekey按钮
	subwf remotetemp,w	;remotetemp-w
	btfsc status,z		;=0?
	goto waitnotstoptimekey	;等待直到放开按键

 	
	btfsc bottomflag
	goto advcountiszero
	movlw topstart	;计算延时数据地址
	addwf topcount,w
	movwf fsr
	goto advcountnotzero
advcountiszero
	movlw topstart
	movwf fsr
advcountnotzero
	movf indf,w
	movwf delaytemp

	btfss defaultflag	
	goto addstoptimebranch	;增加
		
	movlw 01h
	subwf delaytemp,f	;delaytemp+1
	movlw delaytempmin	;是否到最小值
	subwf delaytemp,w
	btfsc status,c
	goto stoptimeend1	;不到最小值则返回
	movlw delaytempmin	;到最小值则不能再减小
	movwf delaytemp
	goto stoptimeend
addstoptimebranch
	movlw 01h
	addwf delaytemp,f	;delaytemp+1
	movlw delaytempmax	;是否到设置速度最大值
	subwf delaytemp,w
	btfss status,c
	goto stoptimeend1	;不到最大值则返回
	movlw delaytempmax	;到最大值则不能再增加
	movwf delaytemp
stoptimeend
	movf delaytemp,w
	movwf indf
	call threelowtonesub
	return
stoptimeend1
	movf delaytemp,w
	movwf indf
	call twolowtonesub
	return

;***************************
;改变所有画的停留时间子程序
;***************************
allstoptimekeysub
	;call delaysub	;
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw allstoptimekey	;是否为allstoptimekey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return
waitnotallstoptimekey
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw allstoptimekey	;是否为allstoptimekey按钮
	subwf remotetemp,w	;remotetemp-w
	btfsc status,z		;=0?
	goto waitnotallstoptimekey	;等待直到放开按键
	decf topdatacountreg,f
	btfss defaultflag	
	goto addallstoptimebranch	;增加

	movlw topstart
	movwf fsr	;取出第一个延时参数
suballstoptimeloop
	movf indf,w
	movwf alldelaytemp
	movlw 01h
	subwf alldelaytemp,f	;alldelaytemp-1
	movlw delaytempmin	;是否到最小值
	subwf alldelaytemp,w
	btfsc status,c
	goto suballstoptimecontinue	;不到最小值则返回
	movlw delaytempmin	;到最小值则不能再减小
	movwf alldelaytemp
suballstoptimecontinue
	movf alldelaytemp,w
	movwf indf		;保存更改的数据
	movlw topstart
	addwf topdatacountreg,w	;所有数据是否更改完
	subwf fsr,w
	btfsc status,z
	goto allstoptimeend
	movlw 04h
	addwf fsr,f
	goto suballstoptimeloop
	
addallstoptimebranch
	movlw topstart
	movwf fsr	;取出第一个延时参数
addallstoptimeloop
	movf indf,w
	movwf alldelaytemp
	movlw 01h
	addwf alldelaytemp,f	;alldelaytemp+1
	movlw delaytempmax	;是否到最大值
	subwf alldelaytemp,w
	btfss status,c
	goto addallstoptimecontinue	;不到最大值则返回
	movlw delaytempmax	;到最大值则不能再增加
	movwf alldelaytemp
addallstoptimecontinue
	movf alldelaytemp,w
	movwf indf		;保存更改的数据
	movlw topstart
	addwf topdatacountreg,w	;所有数据是否更改完
	subwf fsr,w
	btfsc status,z
	goto allstoptimeend
	movlw 04h

⌨️ 快捷键说明

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