; //////////////////////////////////////////////////////////////////// ; メインループ ; //////////////////////////////////////////////////////////////////// mainloop call calccalc ; 各種計算 ; LED movf timer_cn+1,W andlw B'00001111' movwf ra_save movwf PORTA call print ; ////////////// 表示! loop1 ;btfss PORTB,0 ;call sw1 ;btfss PORTB,3 ;call sw2 btfss timer_cn,3 goto loop1 ; wait loop2 ;btfss PORTB,0 ;call sw1 ;btfss PORTB,3 ;call sw2 btfsc timer_cn,3 goto loop2 ; wait ;movf fuel_flow,W ;btfss STATUS,Z btfss fuel_flow,7 goto stopcheck_end ; fuel cut でなければ 通常処理へ btfsc speed_flow,6 call sleeping ; 0km/h と判断されたら お休み stopcheck_end goto mainloop ; 無限ループ ////////////// ループ、ココまで /////////// ; //////////////////////////////////////////////////////////////////// sw1 movf mode,W addlw 1 sublw 3 btfss STATUS,Z movlw 0 movwf mode movlw D'10' movwf calc_cn ; wait 10ms call wait_ms return sw2 clrf odometer_cn2+0 ; 車速パルス2 clrf odometer_cn2+1 clrf odometer_cn2+2 clrf fuel_cn2+0 ; 燃料パルス2 clrf fuel_cn2+1 clrf fuel_cn2+2 clrf timer_cn2+0 ; タイマ(信号間) clrf timer_cn2+1 clrf timer_cn2+2 return ; //////////////////////////////////////////////////////////////////// ; 各種計算 ; //////////////////////////////////////////////////////////////////// calccalc bcf INTCON,RBIE ; rb割込禁止 ; 車速パルス間隔計算 movf speed_tm_la+0,W movwf speed_tm+0 movf speed_tm_la+1,W movwf speed_tm+1 movf speed_tm_lb+0,W subwf speed_tm+0,F btfss STATUS,C decf speed_tm+1,F movf speed_tm_lb+1,W subwf speed_tm+1,F ; 燃料パルス間隔計算 movf fuel_tm_la+0,W movwf fuel_tm+0 movf fuel_tm_la+1,W movwf fuel_tm+1 movf fuel_tm_lb+0,W subwf fuel_tm+0,F btfss STATUS,C decf fuel_tm+1,F movf fuel_tm_lb+1,W subwf fuel_tm+1,F bsf INTCON,RBIE ; rb割込許可 return ; //////////////////////////////////////////////////////////////////// ; お休み中・・・ ; //////////////////////////////////////////////////////////////////// sleeping bcf RS movlw 0 clrf PORTA bsf E ; Eピンを'H' (長時間やると、液晶OFF) bsf STATUS,RP0 ;セレクトページ1 ;movlw B'11111011' ; E以外全部IN movlw B'11110101' ; RB1-RB3ピンをOUT movwf TRISB-0x80 bcf STATUS,RP0 ;セレクトページ0 ; パルスがこない間、無限ループ sleep_loop ;movf fuel_flow,W ;btfsc STATUS,Z btfsc fuel_flow,7 goto sleep_loop ; fuel cut と判断されたら bsf STATUS,RP0 ;セレクトページ1 movlw B'11110001' ; RB1-RB3ピンをOUT movwf TRISB-0x80 bcf STATUS,RP0 ;セレクトページ0 bcf E ; Eピンを'L' (長時間やると、液晶ON) call init_lcd ; 液晶初期化 return