📄 engine.asm
字号:
CLRF EEP_NUMBER
;读出8个数据到EEP_DATAH0---EEP_DATAL3
READ_EEP_LOOP:
;读EEPROM
BSF STATUS, RP0 ;读EEPROM
BSF EECON1, EEPGD
BSF EECON1, RD
NOP
NOP
BCF STATUS, RP0
;保存数据
MOVF EEDATH, W
MOVWF INDF ;保存EEP高8位
INCF FSR,0x1
MOVF EEDATA, W
MOVWF INDF ;保存EEP低8位
INCF FSR,0x1
;地址递增
INCF EEADR,0x1 ;EEP地址+1
INCF EEP_NUMBER,0x1 ;EEP读计数器+1
;循环判断
BTFSS EEP_NUMBER,0x2 ;是否读了四个数据
GOTO READ_EEP_LOOP
FRESH_EEP_DATA:
;更新EEP_DATAL
RLF EEP_ADDRL,0x0
ANDLW 0x6
ADDLW EEP_DATAL0
MOVWF FSR ; =>FSR
MOVF EEP_DATAL,W ;EEP_DATA
MOVWF INDF ; =>[EEP_ADDR+EEP_ADDR[1:0]]
;写循环准备
MOVLW EEP_DATAH0
MOVWF FSR ;间接寻址EEP_DATA
MOVF EEP_ADDRL,W ;ADDRH,ADDRL为首地址
ANDLW 0xFC
MOVWF EEADR ;调入低8位地址的4偶地址
MOVF EEP_ADDRH,W
MOVWF EEADRH ;调入高8位地址
CLRF EEP_NUMBER ;写入数据计数清零
BCF INTCON,GIE
WRITE_EEP_LOOP:
CLRWDT
;调入数据
;MOVLW 0x34
MOVF INDF,W
MOVWF EEDATH ;存入数据高字节
INCF FSR,0x1
MOVF INDF,W
MOVWF EEDATA ;存入数据低字节
INCF FSR,0x1
;保存数据到EEPROM
BSF STATUS,RP0
BSF EECON1,EEPGD
BSF EECON1,WREN
MOVLW 0x55
MOVWF EECON2
MOVLW 0xaa
MOVWF EECON2
BSF EECON1,WR
NOP
NOP
BCF EECON1,WREN
BCF STATUS,RP0
;地址递增
INCF EEP_NUMBER,0x1
INCF EEADR,0x1
BTFSS EEP_NUMBER,0x2
GOTO WRITE_EEP_LOOP
BSF INTCON,GIE
UART_WR_EXIT:
CALL PAGE0
MOVLW 0x92
CALL UART_SEND
UART_WR_OVER:
RETURN
;===========================
UART_SEND:
BCF STATUS,RP0
BCF STATUS,RP1
UART_WAIT:
CLRWDT
BTFSS PIR1,TXIF
GOTO UART_WAIT
MOVWF TXREG
RETURN
;========================================================
;喷嘴处理
;========================================================
PJ_TIMING:
;GOTO EXE_PZ1
;===================================处理喷嘴0===================================
EXE_PZ0:
CLRWDT
INCFSZ PZ0_PRIODA,0x1
GOTO JUDGE_PZ0
INCFSZ PZ0_PRIODB,0x1
GOTO JUDGE_PZ0
MOVLW 0xFF
MOVWF PZ0_PRIODB
JUDGE_PZ0:
BTFSC PORTB,PZ0IN ;判断喷嘴0输入是否有效
GOTO PZ0_HIGH
PZ0_LOW:
BTFSS PORTC,JC12VIN
GOTO PZ0_JC12V_OK
GOTO PZ0_NO_JC12V
PZ0_JC12V_OK:
BSF PQREG,PQ0
GOTO SET_PZ0
PZ0_NO_JC12V:
BCF PQREG,PQ0
SET_PZ0:
MOVF PQREG,W
MOVWF PORTB
MEASURE_PZ0_PYMK:
BSF PZ0_FLAG,PQYC_LOAD_EN ;喷气延迟加载使能
BCF PZ0_FLAG,PQYC_DELAY_EN ;清除喷气延迟使能
INCFSZ PZ0_PYMK,0x1 ;喷油脉宽计数器累加
GOTO EXE_PZ0_OVER
MOVLW 0xFF ;喷油计数器累加为0,
MOVWF PZ0_PYMK
GOTO EXE_PZ0_OVER
PZ0_HIGH:
BTFSS PZ0_FLAG,PQYC_LOAD_EN ;判断喷气延迟加载使能
GOTO EXE_PZ0_PQYC ;PQYC_LOAD_EN=0,已经读取喷气延迟,执行喷气延迟
BCF PZ0_FLAG,PQYC_LOAD_EN
JUDGE_PZ0_STUDY_EN:
BTFSC REC_FLAG,STUDY_ENABLE ;判断是否学习使能
GOTO CAL_PZ0_REC_PYMK
MOVLW 0x08
MOVWF REC_CNT
CLRF REC_PYMKA
CLRF REC_PYMKB
CLRF REC_PYMKC
BCF REC_FLAG,REC_BUSY
GOTO GET_PZ0_PERIOD_ADDR
CAL_PZ0_REC_PYMK:
BTFSC REC_FLAG,REC_BUSY
GOTO GET_PZ0_PERIOD_ADDR
ACUMULATE_PZ0_REC_PYMK:
CLRF STATUS
MOVF PZ0_PYMK,W
ADDWF REC_PYMKA,0x1
BTFSC STATUS,C
INCFSZ REC_PYMKB,0x1
GOTO CAL_PZ0_CNT
MOVLW 0xFF
MOVWF REC_PYMKB
CAL_PZ0_CNT:
DECFSZ REC_CNT,0x01
GOTO GET_PZ0_PERIOD_ADDR
SET_PZ0_REC_PYMK_BUSY:
BSF REC_FLAG,REC_BUSY ;设置忙标志,等待主程序写入EEPROM
RRF REC_PYMKA,1
RRF REC_PYMKA,1
RRF REC_PYMKA,0
ANDLW 0x1F
MOVWF REC_PYMKC
RLF REC_PYMKB,1
SWAPF REC_PYMKB,0
ANDLW 0xE0
IORWF REC_PYMKC,1
REC_PZ0_INI:
CLRF REC_PYMKA
CLRF REC_PYMKB
REC_PZ0_PYMK_OVER:
MOVLW 0x08
MOVWF REC_CNT
GET_PZ0_PERIOD_ADDR:
MOVF PZ0_PRIODA,W
MOVWF PY_PERIOD
MOVF PZ0_PRIODB,W
MOVWF PY_PERIOD1
RRF PZ0_PRIODA,0x1
RRF PZ0_PRIODA,0x1
RRF PZ0_PRIODA,0x0 ;右移三位
ANDLW 0x1F
MOVWF PERIOD_ADDR ;得到周期低5位
CLRF PZ0_PRIODA
MOVF PZ0_PRIODB,W ;判断是否溢出
SUBLW 0x07
BTFSS STATUS,C
GOTO PZ0_OVFL
RLF PZ0_PRIODB,0x1
SWAPF PZ0_PRIODB,0x0
ANDLW 0xE0
IORWF PERIOD_ADDR,0x1 ;得到周期高3位
MOVF PERIOD_ADDR,W ;判断是否>0xFD
SUBLW 0xFD
BTFSC STATUS,C
GOTO GET_PZ0_SPEED_LEVEL
PZ0_OVFL:
MOVLW 0xFD
MOVWF PERIOD_ADDR
GET_PZ0_SPEED_LEVEL:
CLRF PZ0_PRIODB
MOVLW 0xA
MOVWF PCLATH
CALL 0xA00 ;取出喷气延迟
CLRF PCLATH
MOVWF SPEED_LEVEL
LOAD_PZ0_PQYC:
BSF PZ0_FLAG,PQYC_DELAY_EN ;使能喷气延迟
MOVF PZ0_PYMK,W ;取出喷油脉宽值
MOVWF PYMK ;存储喷油脉宽值到PZTIME,由串口送出
MOVWF OLD_PZ0_PYMK
CLRF PZ0_PYMK
JUDGE_PZ0_PYMK_OVFL:
MOVF PYMK,W
SUBLW 0xFD
BTFSC STATUS,C
GOTO GET_PZ0_PYMK_LEVEL
MOVLW 0xFD
MOVWF PYMK
GET_PZ0_PYMK_LEVEL:
MOVLW 0xB
MOVWF PCLATH
CALL 0xB00
CLRF PCLATH
MOVWF PYMK_LEVEL
GET_PZ0_PQYC:
CALL GET_PZ_PQYC
CLRF PCLATH
MOVWF PQYC ;保存喷气延迟到PQYC,有串口送出
MOVWF PZ0_PQYC ;喷气延迟保存到延迟寄存器
EXE_PZ0_PQYC:
BTFSS PZ0_FLAG,PQYC_DELAY_EN ;判断喷气延迟使能
GOTO EXE_PZ0_OVER
DECFSZ PZ0_PQYC,0x1
GOTO EXE_PZ0_OVER
BCF PZ0_FLAG,PQYC_DELAY_EN
BCF PQREG,PQ0
MOVF PQREG,W
MOVWF PORTB
EXE_PZ0_OVER:
;RETURN
;===================================处理喷嘴1===================================
EXE_PZ1:
CLRWDT
INCFSZ PZ1_PRIODA,0x1
GOTO JUDGE_PZ1
INCFSZ PZ1_PRIODB,0x1
GOTO JUDGE_PZ1
MOVLW 0xFF
MOVWF PZ1_PRIODB
JUDGE_PZ1:
BTFSC PORTB,PZ1IN ;判断喷嘴0输入是否有效
GOTO PZ1_HIGH
PZ1_LOW:
BTFSS PORTC,JC12VIN
GOTO PZ1_JC12V_OK
GOTO PZ1_NO_JC12V
PZ1_JC12V_OK:
BSF PQREG,PQ1
GOTO SET_PZ1
PZ1_NO_JC12V:
BCF PQREG,PQ1
SET_PZ1:
MOVF PQREG,W
MOVWF PORTB
MEASURE_PZ1_PYMK:
BSF PZ1_FLAG,PQYC_LOAD_EN ;喷气延迟加载使能
BCF PZ1_FLAG,PQYC_DELAY_EN ;清除喷气延迟使能
INCFSZ PZ1_PYMK,0x1 ;喷油脉宽计数器累加
GOTO EXE_PZ1_OVER
MOVLW 0xFF ;喷油计数器累加为0,
MOVWF PZ1_PYMK
GOTO EXE_PZ1_OVER
PZ1_HIGH:
BTFSS PZ1_FLAG,PQYC_LOAD_EN ;判断喷气延迟加载使能
GOTO EXE_PZ1_PQYC ;PQYC_LOAD_EN=0,已经读取喷气延迟,执行喷气延迟
GET_PZ1_PERIOD_ADDR:
BCF PZ1_FLAG,PQYC_LOAD_EN
MOVF PZ1_PRIODA,W
MOVWF PY_PERIOD
MOVF PZ1_PRIODB,W
MOVWF PY_PERIOD1
RRF PZ1_PRIODA,0x1
RRF PZ1_PRIODA,0x1
RRF PZ1_PRIODA,0x0 ;右移三位
ANDLW 0x1F
MOVWF PERIOD_ADDR ;得到周期低5位
CLRF PZ1_PRIODA
MOVF PZ1_PRIODB,W ;判断是否溢出
SUBLW 0x07
BTFSS STATUS,C
GOTO PZ1_OVFL
RLF PZ1_PRIODB,0x1
SWAPF PZ1_PRIODB,0x0
ANDLW 0xE0
IORWF PERIOD_ADDR,0x1 ;得到周期高3位
MOVF PERIOD_ADDR,W ;判断是否>0xFD
SUBLW 0xFD
BTFSC STATUS,C
GOTO GET_PZ1_SPEED_LEVEL
PZ1_OVFL:
MOVLW 0xFD
MOVWF PERIOD_ADDR
GET_PZ1_SPEED_LEVEL:
CLRF PZ1_PRIODB
MOVLW 0xA
MOVWF PCLATH
CALL 0xA00 ;取出喷气延迟
CLRF PCLATH
MOVWF SPEED_LEVEL
JUDGE_PZ1_PQYC_LOAD:
BSF PZ1_FLAG,PQYC_DELAY_EN ;使能喷气延迟
MOVF PZ1_PYMK,W ;取出喷油脉宽值
MOVWF PYMK ;存储喷油脉宽值到PZTIME,由串口送出
CLRF PZ1_PYMK
JUDGE_PZ1_PYMK_OVFL:
MOVF PYMK,W
SUBLW 0xFD
BTFSC STATUS,C
GOTO GET_PZ1_PYMK_LEVEL
MOVLW 0xFD
MOVWF PYMK
GET_PZ1_PYMK_LEVEL:
MOVLW 0xB
MOVWF PCLATH
CALL 0xB00
CLRF PCLATH
MOVWF PYMK_LEVEL
GET_PZ1_PQYC:
CALL GET_PZ_PQYC
CLRF PCLATH
MOVWF PQYC ;保存喷气延迟到PQYC,有串口送出
MOVWF PZ1_PQYC ;喷气延迟保存到延迟寄存器
EXE_PZ1_PQYC:
BTFSS PZ1_FLAG,PQYC_DELAY_EN ;判断喷气延迟使能
GOTO EXE_PZ1_OVER
DECFSZ PZ1_PQYC,0x1
GOTO EXE_PZ1_OVER
BCF PZ1_FLAG,PQYC_DELAY_EN
BCF PQREG,PQ1
MOVF PQREG,W
MOVWF PORTB
EXE_PZ1_OVER:
;RETURN
;===================================处理喷嘴2===================================
EXE_PZ2:
CLRWDT
INCFSZ PZ2_PRIODA,0x1
GOTO JUDGE_PZ2
INCFSZ PZ2_PRIODB,0x1
GOTO JUDGE_PZ2
MOVLW 0xFF
MOVWF PZ2_PRIODB
JUDGE_PZ2:
BTFSC PORTB,PZ2IN ;判断喷嘴0输入是否有效
GOTO PZ2_HIGH
PZ2_LOW:
BTFSS PORTC,JC12VIN
GOTO PZ2_JC12V_OK
GOTO PZ2_NO_JC12V
PZ2_JC12V_OK:
BSF PQREG,PQ2
GOTO SET_PZ2
PZ2_NO_JC12V:
BCF PQREG,PQ2
SET_PZ2:
MOVF PQREG,W
MOVWF PORTB
MEASURE_PZ2_PYMK:
BSF PZ2_FLAG,PQYC_LOAD_EN ;喷气延迟加载使能
BCF PZ2_FLAG,PQYC_DELAY_EN ;清除喷气延迟使能
INCFSZ PZ2_PYMK,0x1 ;喷油脉宽计数器累加
GOTO EXE_PZ2_OVER
MOVLW 0xFF ;喷油计数器累加为0,
MOVWF PZ2_PYMK
GOTO EXE_PZ2_OVER
PZ2_HIGH:
BTFSS PZ2_FLAG,PQYC_LOAD_EN ;判断喷气延迟加载使能
GOTO EXE_PZ2_PQYC ;PQYC_LOAD_EN=0,已经读取喷气延迟,执行喷气延迟
GET_PZ2_PERIOD_ADDR:
BCF PZ2_FLAG,PQYC_LOAD_EN
MOVF PZ2_PRIODA,W
MOVWF PY_PERIOD
MOVF PZ2_PRIODB,W
MOVWF PY_PERIOD1
RRF PZ2_PRIODA,0x1
RRF PZ2_PRIODA,0x1
RRF PZ2_PRIODA,0x0 ;右移三位
ANDLW 0x1F
MOVWF PERIOD_ADDR ;得到周期低5位
CLRF PZ2_PRIODA
MOVF PZ2_PRIODB,W ;判断是否溢出
SUBLW 0x07
BTFSS STATUS,C
GOTO PZ2_OVFL
RLF PZ2_PRIODB,0x1
SWAPF PZ2_PRIODB,0x0
ANDLW 0xE0
IORWF PERIOD_ADDR,0x1 ;得到周期高3位
MOVF PERIOD_ADDR,W ;判断是否>0xFD
SUBLW 0xFD
BTFSC STATUS,C
GOTO GET_PZ2_SPEED_LEVEL
PZ2_OVFL:
MOVLW 0xFD
MOVWF PERIOD_ADDR
GET_PZ2_SPEED_LEVEL:
CLRF PZ2_PRIODB
MOVLW 0xA
MOVWF PCLATH
CALL 0xA00 ;取出喷气延迟
CLRF PCLATH
MOVWF SPEED_LEVEL
LOAD_PZ2_PQYC:
BSF PZ2_FLAG,PQYC_DELAY_EN ;使能喷气延迟
MOVF PZ2_PYMK,W ;取出喷油脉宽值
MOVWF PYMK ;存储喷油脉宽值到PZTIME,由串口送出
CLRF PZ2_PYMK
JUDGE_PZ2_PYMK_OVFL:
MOVF PYMK,W
SUBLW 0xFD
BTFSC STATUS,C
GOTO GET_PZ2_PYMK_LEVEL
MOVLW 0xFD
MOVWF PYMK
GET_PZ2_PYMK_LEVEL:
MOVLW 0xB
MOVWF PCLATH
CALL 0xB00
CLRF PCLATH
MOVWF PYMK_LEVEL
GET_PZ2_PQYC:
CALL GET_PZ_PQYC
CLRF PCLATH
MOVWF PQYC ;保存喷气延迟到PQYC,有串口送出
MOVWF PZ2_PQYC ;喷气延迟保存到延迟寄存器
EXE_PZ2_PQYC:
BTFSS PZ2_FLAG,PQYC_DELAY_EN ;判断喷气延迟使能
GOTO EXE_PZ2_OVER
DECFSZ PZ2_PQYC,0x1
GOTO EXE_PZ2_OVER
BCF PZ2_FLAG,PQYC_DELAY_EN
BCF PQREG,PQ2
MOVF PQREG,W
MOVWF PORTB
EXE_PZ2_OVER:
;RETURN
;===================================处理喷嘴3===================================
EXE_PZ3:
CLRWDT
INCFSZ PZ3_PRIODA,0x1
GOTO JUDGE_PZ3
INCFSZ PZ3_PRIODB,0x1
GOTO JUDGE_PZ3
MOVLW 0xFF
MOVWF PZ3_PRIODB
JUDGE_PZ3:
BTFSC PORTB,PZ3IN ;判断喷嘴0输入是否有效
GOTO PZ3_HIGH
PZ3_LOW:
BTFSS PORTC,JC12VIN
GOTO PZ3_JC12V_OK
GOTO PZ3_NO_JC12V
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -