📄 ver30.asm
字号:
addwf fsr,f
goto addallstoptimeloop
allstoptimeend
incf topdatacountreg,f
call threelowtonesub
return
;***************************
;改变所有画的停留时间为20s子程序
;***************************
allstoptime3keysub
;call delaysub ;
call delaysub
movlw remotemask
andwf remote,w ;读取遥控器输入数据
movwf remotetemp
movlw allstoptime3key ;是否为allstoptimekey按钮
subwf remotetemp,w ;remotetemp-w
btfss status,z ;=0?
return
waitnotallstoptime3key
call delaysub
movlw remotemask
andwf remote,w ;读取遥控器输入数据
movwf remotetemp
movlw allstoptime3key ;是否为allstoptimekey按钮
subwf remotetemp,w ;remotetemp-w
btfsc status,z ;=0?
goto waitnotallstoptime3key ;等待直到放开按键
movlw d'6'
movwf stoptimereg
call stoptimesub
return
;*****************
;改变停留时间子程序
;*****************
stoptimesub
decf topdatacountreg,f
movlw topstart
movwf fsr ;取出第一个延时参数
allstoptime3loop
movf stoptimereg,w
movwf indf ;保存数据3
movlw topstart
addwf topdatacountreg,w ;所有数据是否更改完
subwf fsr,w
btfsc status,z
goto allstoptime3end
movlw 04h
addwf fsr,f
goto allstoptime3loop
allstoptime3end
incf topdatacountreg,f
call threelowtonesub
return
;**************
;高速子程序
;**************
highspeedkeysub
; ;call delaysub ;
; call delaysub
; movlw remotemask
; andwf remote,w ;读取遥控器输入数据
; movwf remotetemp
; movlw highspeedkey ;是否为highspeedkey按钮
; subwf remotetemp,w ;remotetemp-w
; btfss status,z ;=0?
; return
;waitnothighspeedkey
; call delaysub
; movlw remotemask
; andwf remote,w ;读取遥控器输入数据
; movwf remotetemp
; movlw highspeedkey ;是否为highspeedkey按钮
; subwf remotetemp,w ;remotetemp-w
; btfsc status,z ;=0?
; goto waitnothighspeedkey ;等待直到放开按键
; bcf storeflag ;数据需要保存
; movlw upsametimelowspeedadcmax
; movwf upsametimelowspeedreg
; movlw downsametimelowspeedadcmax
; movwf downsametimelowspeedreg
call threelowtonesub
return
;**************
;中速子程序
;**************
medspeedkeysub
; ;call delaysub ;
; call delaysub
; movlw remotemask
; andwf remote,w ;读取遥控器输入数据
; movwf remotetemp
; movlw medspeedkey ;是否为medspeedkey按钮
; subwf remotetemp,w ;remotetemp-w
; btfss status,z ;=0?
; return
;waitnotmedspeedkey
; call delaysub
; movlw remotemask
; andwf remote,w ;读取遥控器输入数据
; movwf remotetemp
; movlw medspeedkey ;是否为medspeedkey按钮
; subwf remotetemp,w ;remotetemp-w
; btfsc status,z ;=0?
; goto waitnotmedspeedkey ;等待直到放开按键
; bcf storeflag ;数据需要保存
; movlw upsametimelowspeedadc
; movwf upsametimelowspeedreg
; movlw downsametimelowspeedadc
; movwf downsametimelowspeedreg
call threelowtonesub
return
;**************
;低速子程序
;**************
lowspeedkeysub
; ;call delaysub ;
; call delaysub
; movlw remotemask
; andwf remote,w ;读取遥控器输入数据
; movwf remotetemp
; movlw lowspeedkey ;是否为lowspeedkey按钮
; subwf remotetemp,w ;remotetemp-w
; btfss status,z ;=0?
; return
;waitnotlowspeedkey
; call delaysub
; movlw remotemask
; andwf remote,w ;读取遥控器输入数据
; movwf remotetemp
; movlw lowspeedkey ;是否为lowspeedkey按钮
; subwf remotetemp,w ;remotetemp-w
; btfsc status,z ;=0?
; goto waitnotlowspeedkey ;等待直到放开按键
; bcf storeflag ;数据需要保存
; movlw upsametimelowspeedadcmin
; movwf upsametimelowspeedreg
; movlw downsametimelowspeedadcmin
; movwf downsametimelowspeedreg
call threelowtonesub
return
;***********************
;使所有画面停留时间为1min
;***********************
stoptime1minkeysub
call delaysub
movlw remotemask
andwf remote,w ;读取遥控器输入数据
movwf remotetemp
movlw stoptime1minkey ;是否为stoptime1minkey按钮
subwf remotetemp,w ;remotetemp-w
btfss status,z ;=0?
return
waitnotstoptime1minkey
call delaysub
movlw remotemask
andwf remote,w ;读取遥控器输入数据
movwf remotetemp
movlw stoptime1minkey ;是否为stoptime1minkey按钮
subwf remotetemp,w ;remotetemp-w
btfsc status,z ;=0?
goto waitnotstoptime1minkey ;等待直到放开按键
bcf storeflag ;数据需要保存
movlw d'18'
movwf stoptimereg
call stoptimesub
return
;***********************
;使所有画面停留时间为5min
;***********************
stoptime5minkeysub
call delaysub
movlw remotemask
andwf remote,w ;读取遥控器输入数据
movwf remotetemp
movlw stoptime5minkey ;是否为stoptime5minkey按钮
subwf remotetemp,w ;remotetemp-w
btfss status,z ;=0?
return
waitnotstoptime5minkey
call delaysub
movlw remotemask
andwf remote,w ;读取遥控器输入数据
movwf remotetemp
movlw stoptime5minkey ;是否为stoptime5minkey按钮
subwf remotetemp,w ;remotetemp-w
btfsc status,z ;=0?
goto waitnotstoptime5minkey ;等待直到放开按键
bcf storeflag ;数据需要保存
movlw d'31'
movwf stoptimereg
call stoptimesub
return
;***********************
;使所有画面停留时间为10min
;***********************
stoptime10minkeysub
call delaysub
movlw remotemask
andwf remote,w ;读取遥控器输入数据
movwf remotetemp
movlw stoptime10minkey ;是否为stoptime10minkey按钮
subwf remotetemp,w ;remotetemp-w
btfss status,z ;=0?
return
waitnotstoptime10minkey
call delaysub
movlw remotemask
andwf remote,w ;读取遥控器输入数据
movwf remotetemp
movlw stoptime10minkey ;是否为stoptime10minkey按钮
subwf remotetemp,w ;remotetemp-w
btfsc status,z ;=0?
goto waitnotstoptime10minkey ;等待直到放开按键
bcf storeflag ;数据需要保存
movlw d'52'
movwf stoptimereg
call stoptimesub
return
;**************
;延时10S子程序
;**************
delay10ssub
;movlw d'10'
movf delaytemp,w
movwf delay10scount1
delay10sloop3
movlw d'250'
;movlw d'100'
movwf delay10scount2
delay10sloop2
clrf tmr1L ;TIMER1为0
clrf tmr1h
bsf t1con,tmr1on ;启动TIMER1
delay10sloop1
movlw remotemask
andwf remote,w ;读取遥控器输入数据
movwf remotetemp
movlw stopandrunkey ;是否为stopandrunkey按钮
subwf remotetemp,w ;remotetemp-w
btfss status,z ;=0?
goto otherkey
waitnokey
call delaysub
movlw remotemask
andwf remote,w ;读取遥控器输入数据
movwf remotetemp
movlw stopandrunkey ;是否为stopandrunkey按钮
subwf remotetemp,w ;remotetemp-w
btfsc status,z ;=0?
goto waitnokey ;等待直到放开按键
bsf changeparameterflag
call threelowtonesub
return ;返回
otherkey
call voltagecomparesub ;比较电压低于规定值则断开蓄电池并保存数据
btfss mode
goto nostop
bcf runmodeflag ;处于参数设置状态
return
nostop
btfss pir1,tmr1if ;时间到?
goto delay10sloop1
bcf pir1,tmr1if
decfsz delay10scount2,f
goto delay10sloop2
decfsz delay10scount1,f
goto delay10sloop3
bcf t1con,tmr1on
return
;*************
;adc转换子程序
;*************
readadcsub
;bsf adcon0,go
btfss pir1,adif ;is adc ready?
goto readadcsub ;no then return
bcf pir1,adif
bsf adcon0,go ;restart adc
movf adresh,w ;get adc result
movwf adcvoltage ;save result in speed control threshold
;movwf adc
return
;****************
;判断电压是否过低
;****************
voltagelowsub
bsf adcon0,go ;开始转换
call readadcsub ;读取输入电压
;movlw 06fh ;电压是否大与22V?
movf voltagecompare,w
subwf adcvoltage,w
btfsc status,c
return
bsf systemerror
bsf voltagelowflag ;电压低标志
return
;*******************
;保存数据后处理子程序
;*******************
afterwritedosub
bsf relaycontrol ;关闭蓄电池
call delaysub ;延时一段时间后判断电压是否为高电平
call delaysub
waitturnonvoltage
;movlw turnonvoltage ;电压比较值(22.5V)(2.65v以下为7eh,2.65v以上为82h)
movf turnonvoltagereg,w
MOVWF VOLTAGECOMPARE
;bsf adcon0,go ;开始转换
call readadcsub ;读取输入电压
movf voltagecompare,w
subwf adcvoltage,w
btfss status,c
goto waitturnonvoltage
bcf relaycontrol ;大于22V则打开蓄电池
call readdatasub
bcf voltagelowflag
bcf systemerror
return
;*****************************
;电压低于规定值后不能运转子程序
;*****************************
cannotrunvoltagesub
movlw cannotrunvoltage ;电压是否低于18V
movwf voltagecompare
call voltagelowsub
btfss voltagelowflag
return
call writedatasub
call afterwritedosub
return
;**********************
;电压比较子程序
;**********************
voltagecomparesub
;movlw turnoffvoltage ;电压比较值(22DCV)(2.65v以下为7ch,2.65v以上为80h)
movf turnoffvoltagereg,w
movwf voltagecompare
call voltagelowsub
btfss voltagelowflag
return
call writedatasub ;电压过低则保存数据
call afterwritedosub ;保存数据后处理
return
;***************
;读取数据子程序
;***************
readdatasub
;bank0数据的读取
movlw flag
movwf fsr
movlw topcount ;BANK0最后一个需要保存到EEPROM中的地址
movwf storedatacountreg
incf storedatacountreg,f
movlw flag ;BANK0中第一个需要保存到EEPROM中的地址
subwf storedatacountreg,f ;需要保存的数据个数
movf storedatacountreg,w
movwf count4
banksel eeadr
clrf eeadr ;地址为0
call bankreaddatasub
;bank1数据的读取
movlw topstart
movwf fsr
;movlw storedatacount ;bank1需要保存的数据个数
movlw d'79'
subwf topdatacountreg,w
btfss status,c
goto lessthan79
movlw d'79'
movwf topdatacountreg
lessthan79
movf topdatacountreg,w
movwf count4
movf storedatacountreg,w
banksel eeadr
movwf eeadr ;地址为storedatacountreg
call bankreaddatasub
return
;********************
;BANK的数据读数据子程序
;********************
bankreaddatasub
; movlw flag ;内存起始地址
; movwf fsr
; banksel count4
; movlw topcount ;BANK0最后一个需要保存到EEPROM中的地址
; movwf storedatacountreg
; incf storedatacountreg,f
; movlw flag ;BANK0中第一个需要保存到EEPROM中的地址
; subwf storedatacountreg,w ;需要保存的数据个数
; movwf count4
READLOOP
banksel eecon1 ;设为BANK1
bcf eecon1,eepgd
bsf eecon1,rd ;启动读操作
;bcf status,rp0 ;设为BANK0
banksel eedata
movf eedata,w
movwf indf ;读取数据到内存
INCF EEADR,f ;地址加1
incf fsr,f
banksel count4
DECFSZ COUNT4,F
GOTO READLOOP
return
;***************
;保存数据子程序
;***************
Writedatasub
btfsc storeflag ;数据是否已保存
return ;已保存则返回
;没有保存则需要保存
;bank0数据的保存
movlw flag
movwf fsr
movlw topcount ;BANK0最后一个需要保存到EEPROM中的地址
movwf storedatacountreg
incf storedatacountreg,f
movlw flag ;BANK0中第一个需要保存到EEPROM中的地址
subwf storedatacountreg,f ;需要保存的数据个数
movf storedatacountreg,w
movwf count4
banksel eeadr
clrf eeadr ;地址为0
call bankwritedatasub
;bank1数据的保存
movlw topstart
movwf fsr
;movlw storedatacount ;bank1需要保存的数据个数
movf topdatacountreg,w
movwf count4
movf storedatacountreg,w
banksel eeadr
movwf eeadr ;地址为storedatacountreg
call bankwritedatasub
bsf storeflag
return
;********************
;bank 数据的保存子程序
;********************
bankwritedatasub
;banksel eeadr
;clrf eeadr ;地址为0
bank0w3
;bsf status,rp0 ;设为BANK1
bank0w1
banksel eecon1
bcf eecon1,eepgd
BTFSC EECON1,WR
GOTO bank0W1
;BCF STATUS,RP0
banksel eedata
MOVF indf,W ;数据放在EEDATA
MOVWF EEDATA
;BSF STATUS,RP0
banksel eecon1
BSF EECON1,WREN
MOVLW 55H ;固定的5指令序列
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,WR ;启动写操作
BCF EECON1,WREN ;禁止写操作发生
bank0w11
btfsc eecon1,wr
goto bank0w11
;bcf eecon1,eeif
;bcf status,rp0
incf fsr,f
banksel eeadr
incf eeadr,f
banksel count4
decfsz count4,f
goto bank0w3
;bsf storeflag
return
;****************
;延时子程序(10ms)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -