?? 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 + -