📄 engine.asm
字号:
;======================================================================================================================================
;edit by geyuanqing 20051119
;==========================================================程序流程图=============================================================
;INT_PROGRAM :UART
; :TIMER0 :>] :JUDGE_PY0 :>TABLE
; :JUDGE_PY1 :>TABLE
; :JUDGE_PY2 :>TABLE
; :JUDGE_PY3 :>TABLE
; :>JUDGE_PZ_JC
;中断服务程序中调用3级子程序嵌套,主程序至多有5级嵌套
;=====================================================================
;MAINLOOP:
; :>AD_SAMPLE
; :>SEND_AD_VALUE :>SEND_STATUS :>UART_SEND
; :>JUDGE_JC12V_PZ12V
; :>PROCESS_UART :>UART_RD_EEP :RD_EEP
; :>UART_WR_EEP :WR_EEP
;主程序中最多嵌套3级,所有子程序和中断调用没有问题
include "headfile.h"
ORG 0x000
NOP
NOP
NOP
GOTO START
GOTO INT_PROG
;===================================================================================================================================
;==========================================================中断服务程序===============================================================
;===================================================================================================================================
INT_PROG:
;保存W STATUS PC
MOVWF WSAVE
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUSSAVE
MOVF PCLATH,W
MOVWF PCLATHSAVE
CLRF PCLATH
MOVF FSR,W
MOVWF FSRSAVE
;检测串口中断
BTFSS PIR1,RCIF
GOTO TMR0_PROG
BTFSC RCSTA,FERR
GOTO UART_ERR
BTFSC RCSTA,OERR
GOTO UART_ERR
;缓存串口数据,串口收数缓存在PAGE1中
MOVF RCREG,W
MOVWF UART_DATAA
JUDGE_UART_COMMAND:
XORWF OLD_COMMAND,0x0 ;判断是否和旧数据相同
BTFSS STATUS,Z
GOTO CLEAR_COMMAND_CNT
INCFSZ COMMAND_CNT,0x1
GOTO NORMAL_RECIEVE
;累加次数溢出,判断命令
JUDGE_RD_DISEN:
MOVLW 0xA0
XORWF OLD_COMMAND,0
BTFSS STATUS,Z
GOTO JUDGE_RD_EN
BCF REC_FLAG,RD_EN
GOTO CLEAR_COMMAND_CNT
JUDGE_RD_EN:
MOVLW 0xA1
XORWF OLD_COMMAND,0
BTFSS STATUS,Z
GOTO JUDGE_WR_DISEN
BSF REC_FLAG,RD_EN
GOTO CLEAR_COMMAND_CNT
JUDGE_WR_DISEN:
MOVLW 0xA2
XORWF OLD_COMMAND,0
BTFSS STATUS,Z
GOTO JUDGE_WR_EN
BCF REC_FLAG,WR_EN
GOTO CLEAR_COMMAND_CNT
JUDGE_WR_EN:
MOVLW 0xA3
XORWF OLD_COMMAND,0
BTFSS STATUS,Z
GOTO JUDGE_STUDY_DISEN
BSF REC_FLAG,WR_EN
GOTO CLEAR_COMMAND_CNT
JUDGE_STUDY_DISEN:
MOVLW 0xA4
XORWF OLD_COMMAND,0
BTFSS STATUS,Z
GOTO JUDGE_STUDY_EN
BCF REC_FLAG,STUDY_ENABLE
GOTO CLEAR_COMMAND_CNT
JUDGE_STUDY_EN:
MOVLW 0xA5
XORWF OLD_COMMAND,0
BTFSS STATUS,Z
GOTO CLEAR_COMMAND_CNT
BSF REC_FLAG,STUDY_ENABLE
CLEAR_COMMAND_CNT:
MOVLW 0xC0
MOVWF COMMAND_CNT
MOVF UART_DATAA,W
MOVWF OLD_COMMAND
NORMAL_RECIEVE:
SWAPF UART_DATAA,0x0
ANDLW 0xF
ADDLW UART_DATA_ADDR
MOVWF FSR
MOVF UART_DATAA,W
MOVWF INDF
GOTO TMR0_PROG
UART_ERR:
CALL PAGE0
BCF RCSTA,FERR
BCF RCSTA,OERR
CALL INI_COM
CALL PAGE0
TMR0_PROG:
CLRWDT
BTFSS INTCON,TMR0IF
GOTO INT_RECOVER
;MOVLW 0x9C ;定时器0中断,0.1mS,溢出中断,并赋初值(0xA5)
;MOVLW 0x38
MOVLW 0x07
MOVWF TMR0
CALL PJ_TIMING ;检测喷嘴输入
DECFSZ TMR0A,0x1 ;定时器A 25mS
GOTO TMR0_OVER
MOVLW 0xFA
MOVWF TMR0A
;BSF TIMER_IF,SMP_EN
DECFSZ TMR0B,0x1 ;定时器B 100mS
GOTO TMR0_OVER
MOVLW 0x10;0x4
MOVWF TMR0B
BSF TIMER_IF,SMP_EN
BSF TIMER_IF,STATUS_SEN
DECFSZ TMR0C,0x1 ;定时器C 1S
GOTO TMR0_OVER
MOVLW 0x10
MOVWF TMR0C
;BSF TIMER_IF,SMP_EN
;BSF TIMER_IF,STATUS_SEN
TMR0_OVER:
BCF INTCON,TMR0IF
INT_RECOVER:
MOVF FSRSAVE,W ;恢复中断前状态
MOVWF FSR
BCF INTCON,RBIF
MOVF PCLATHSAVE,W
MOVWF PCLATH
SWAPF STATUSSAVE,W
MOVWF STATUS
SWAPF WSAVE,0x1
SWAPF WSAVE,W
RETFIE
;===================================================================================================================================
;===============================================================主程序===============================================================
;===================================================================================================================================
START:
CLRF STATUS
CLRF PCLATH
CALL INI_DATA_REG
CALL INI_COM
CALL INI_CNTL_REG
CALL INI_LED
BSF INTCON,GIE
;主程序循环,完成传感器采集,状态发送,并检测控制输入,处理串口数据
MAIN_LOOP:
CLRWDT
;传感器采集
CALL AD_SAMPLE
CLRWDT
;发送状态
CALL PAGE0
CALL SEND_AD_VALUE
;检测输入控制
CLRWDT
CALL JUDGE_PZ12VBIT_JC12V
;处理串口数据
CALL PAGE0
CLRWDT
CALL SAVE_JYMK
CLRWDT
CALL PAGE0
CALL PROCESS_UART
CALL PAGE0
GOTO MAIN_LOOP
;===================================================================================================================================
;==================================================初始LED显示,加电 灭 亮===========================================================
;===================================================================================================================================
INI_LED:
BCF PORTC,LED
CALL DELAY1
CLRWDT
BSF PORTC,LED
CALL DELAY1
CLRWDT
BCF PORTC,LED
RETURN
DELAY1: MOVLW 0xFE
CALL DELAY2
MOVLW 0xFE
CALL DELAY2
MOVLW 0xFE
CALL DELAY2
RETURN
DELAY2:
MOVWF DELAY2_REGA
CLRF DELAY2_REGB
DELAY2_LOOP1:
CLRWDT
DECFSZ DELAY2_REGB,0x1
GOTO DELAY2_LOOP1
NOP
DECFSZ DELAY2_REGA,0x1
GOTO DELAY2_LOOP1
RETURN
;===================================================================================================================================
;================================================初始化数据寄存器=====================================================================
;===================================================================================================================================
INI_DATA_REG:
CLRWDT
CLRF TIMER_IF
CLRF PZREG
MOVLW 0x1
MOVWF ZKYL
MOVWF RQYL
MOVWF QYCG
MOVWF HYCG
MOVWF PQYC
MOVWF PYMK
CLRF JCREG
CLRF UART_DATA8
CLRF UART_DATA9
CLRF UART_DATAA
CLRF UART_DATAB
CLRF UART_DATAC
CLRF UART_DATAD
CLRF UART_DATAE
CLRF UART_DATAF
CLRF PQREG
CLRF PORTB
CLRF TIMER_IF
CLRF PY_PERIOD
CALL PAGE1
MOVLW 0xB0
MOVWF FSR
MOVLW 0x40
MOVWF JYMK_CNT
CLEAR_FLAG_LOOP:
CLRF INDF
INCF FSR
DECFSZ JYMK_CNT,0x01
GOTO CLEAR_FLAG_LOOP
CALL PAGE0
RETURN
;====================================================================================================================================
;================================================初始化控制寄存器======================================================================
;====================================================================================================================================
INI_CNTL_REG:
;页面1
CALL PAGE1
;定时器0:内部指令周期时钟Fosc/4,下降沿触发,有预分频 1/4,以Fosc/8=8MHz/8=1MHz计数
BCF OPTION_REG,T0CS ;inner instruction cycle
BCF OPTION_REG,INTEDG ;falling edlge conversion
BCF OPTION_REG,PSA ;rescaler is assigned to the Timer0 module
BCF OPTION_REG,PS2 ;Fcommandcycle/2
BCF OPTION_REG,PS1
BCF OPTION_REG,PS0
;BSF OPTION_REG,PS0
;初始PORTA[3:0]为输入引脚,为四路A/D输入
BSF TRISA,0x0 ;真空压力输入
BSF TRISA,0x1 ;燃气压力输入
BSF TRISA,0x2 ;前氧传感器输入
BSF TRISA,0x3 ;后氧传感器出入
BSF TRISA,KEYIN ;钥匙12V电压输入
BSF TRISA,PZ12VIN ;喷嘴12V电压输入
;初始化PORTB
BCF TRISB,PQ3
BCF TRISB,PQ2
BCF TRISB,PQ1
BCF TRISB,PQ0
BSF TRISB,PZ0IN
BSF TRISB,PZ1IN
BSF TRISB,PZ2IN
BSF TRISB,PZ3IN
;初始化PORTC
BSF TRISC,RXD
;BSF TRISC,TXD
BCF TRISC,TXD
BSF TRISC,PZ4IN
BSF TRISC,PZ5IN
; BCF TRISC,PQ4
BCF TRISC,LED
BSF TRISC,QF12VIN
BSF TRISC,JC12VIN
BSF PIE1,RCIE
CALL PAGE0
CLRF INTCON ;禁止所有中断
CLRF PIR1
CLRF PIR1 ;清除外设中断标志两次
MOVLW 0xA5 ;计数器初始值是0xA5
MOVWF TMR0 ;90个指令周期发生一次定时器中断
MOVLW 0xFA ;R[32]一级中断计数器,0xFA*90个指令周期中断一次
MOVWF TMR0A ;R[32]=0xFA
MOVLW 0x4 ;R[33]2级中断计数器,0x04*0xFA*90个指令周期中断一次
MOVWF TMR0B ;R[33]=0x04
MOVLW 0x8 ;R[34]3级中断计数器,0x08*0x04*0xFA*90个指令周期中断一次
MOVWF TMR0C ;R[34]=0x08
CLRF REC_FLAG
BSF ADCON0,ADCS1
BSF ADCON0,ADCS0 ;AD采样时钟是内部RC振荡器
BSF INTCON,TMR0IE ;使能TIMER0中断
BSF INTCON,PEIE
BSF INTCON,GIE ;打开所有中断
CALL PAGE0
RETURN
;===================================================================================================================================
;================定时发送 真空压力,燃气压力,前氧传感,后氧传感,喷油脉宽,喷气延迟,喷油周期状态=====================================================
;===================================================================================================================================
SEND_AD_VALUE:
;检测是否状态发送使能
BTFSS TIMER_IF,STATUS_SEN
RETURN
CLRWDT
BCF TIMER_IF,STATUS_SEN
;送当前状态
MOVLW 0x0F
ANDWF REC_FLAG,0
IORLW 0xA0
CALL UART_SEND
BTFSS REC_FLAG,RD_EN
RETURN
;发送真空压力
MOVLW AD_ADDR ;调入状态首地址
MOVWF FSR ;到文件选择寄存器
MOVLW 0x80 ;加载状态地址头
MOVWF CNT ; 到计数器
STATUS_LOOP:
CLRWDT
MOVF INDF,W ;真空压力
ANDLW 0x0F
IORLW 0x60
CALL UART_SEND
SWAPF INDF,0x0
ANDLW 0x0F
IORLW 0x70
CALL UART_SEND
MOVF CNT,W
CALL UART_SEND
INCF CNT,0x1
INCF FSR,0x1
MOVF CNT,W
XORLW 0x8E
BTFSS STATUS,Z
GOTO STATUS_LOOP
RETURN
;===================================================================================================================================
;=============================================================串口处理程序============================================================
;======表格读命令================================================================
; 0 0 AD7 AD6 x x x x
; 0 1 AD5 AD4 AD3 AD2 AD1 AD0
;======表格写命令================================================================
; 0 0 AD7 AD6 DATA7 DATA6 DATA5 DATA4
; 1 0 AD5 AD4 AD3 AD2 AD1 AD0
; 1 1 x x DATA3 DATA2 DATA1 DATA0
;======表格回送字================================================================
; 0 0 AD7 AD6 DATA7 DATA6 DATA5 DATA4
; 0 1 AD5 AD4 AD3 AD2 AD1 AD0
; 1 1 0 0 DATA3 DATA2 DATA1 DATA0
;===================================================================================================================================
PROCESS_UART:
;计算标志位
MOVF UART_DATA9,w
XORLW 0x91
BTFSS STATUS,Z
GOTO JUDGE_UART_WRITE_EEP
BTFSS REC_FLAG,RD_EN
RETURN
UART_READ_EEP:
MOVLW 0xF0 ;写命令无效
MOVWF UART_DATA9
MOVF UART_DATA0,W ;EEP地址低四位
ANDLW 0x0F
CALL PAGE2
MOVWF EEADR
CALL PAGE0
SWAPF UART_DATA1,0x0 ;EEP地址高四位
ANDLW 0xF0
CALL PAGE2
IORWF EEADR,0x1
CALL PAGE0
MOVF UART_DATA2,W ;EEP地址最高四位
ANDLW 0x0F
CALL PAGE2
MOVWF EEADRH
; BCF INTCON,GIE ;关中断
BSF STATUS, RP0 ;读取EEP数据
BSF EECON1, EEPGD
BSF EECON1, RD
NOP
NOP
BCF STATUS, RP0 ;
; BSF INTCON,GIE ;开中断
MOVF EEDATA,W
ANDLW 0x0F
IORLW 0x30
CALL PAGE0
CALL UART_SEND
CALL PAGE2
SWAPF EEDATA,0x0
ANDLW 0x0F
IORLW 0x40
CALL PAGE0
CALL UART_SEND
MOVLW 0x91
CALL UART_SEND
RETURN
;=============================================================
;=============================写串口数据到EEP===================
;=============================================================
JUDGE_UART_WRITE_EEP:
MOVF UART_DATA9,w
XORLW 0x92
BTFSS STATUS,Z
RETURN
MOVLW 0x90
MOVWF UART_DATA9
UART_WR_EEP:
CLRWDT
BTFSS REC_FLAG,WR_EN ;判断写使能
GOTO UART_WR_OVER
CALL PAGE2
MOVF UART_DATA0,W ;EEP地址低四位
ANDLW 0x0F
MOVWF EEP_ADDRL
SWAPF UART_DATA1,0x0 ;EEP地址高四位
ANDLW 0xF0
IORWF EEP_ADDRL,0x1
MOVF EEP_ADDRL,W
ANDLW 0xFC
MOVWF EEADR
MOVF UART_DATA2,W ;EEP地址最高四位
ANDLW 0x0F
MOVWF EEP_ADDRH
MOVWF EEADRH
MOVF UART_DATA3,W
ANDLW 0xF
MOVWF EEP_DATAL
SWAPF UART_DATA4,W
ANDLW 0xF0
IORWF EEP_DATAL,0x1
MOVLW EEP_DATAH0 ;保存数据保存地址
MOVWF FSR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -