; //////////////////////////////////////////////////////////////////// ; メインループ ; //////////////////////////////////////////////////////////////////// mainloop ; //////////////////////////////////////////////////////////////////// ; 各種計算 ; //////////////////////////////////////////////////////////////////// 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割込許可 ;;;;; 各種計算終わり ; LED movf timer_cn+1,W andlw B'00001111' movwf ra_save movwf PORTA call print ; ////////////// 表示! loop1 btfss timer_cn,3 goto loop1 ; wait loop2 btfsc timer_cn,3 goto loop2 ; wait movlw FUEL_ST_FLOW_MAX ^ 0ffh addwf fuel_flow,0 btfss STATUS,C ; fuel cut と判断したら skip goto stopcheck_end ; fuel cut でなければ 通常処理へ movlw SPEED_FLOW_MAX ^ 0ffh addwf speed_flow,0 btfss STATUS,C goto stopcheck_end ; 0km/h と判断されたら お休み ; //////////////////////////////////////////////////////////////////// ; お休み中・・・ ; //////////////////////////////////////////////////////////////////// ;sleeping bcf RS movlw 0 clrf PORTA bsf E ; Eピンを'H' (長時間やると、液晶OFF) bsf STATUS,RP0 ;セレクトページ1 ;movlw B'11111111' ; 全部IN (9mA) ;movlw B'11111011' ; Eを出力 (15mA) movlw B'11110101' ; RS,R/~W を出力 (4mA) movwf TRISB-0x80 bcf STATUS,RP0 ;セレクトページ0 bsf flag,1 ; お休み中フラグON clrf timer_cn2+0 ; タイマ(信号間) clrf timer_cn2+1 clrf timer_cn2+2 ; パルスがこない間、無限ループ --> sleep_loop movlw FUEL_ST_FLOW_MAX ^ 0ffh addwf fuel_flow,0 btfsc STATUS,C goto sleep_loop ; fuel cut と判断されたら ; パルスがこない間、無限ループ <-- ; 一定時間停車していた? movlw RESET_FLOW_MAX subwf timer_cn2+2,W btfss STATUS,C goto reset_flow_check_1 ; 一定時間に満たないので信号間だけリセット ; 前回値を信号間の方にコピってからリセット bsf flag,2 ; 前回値表示中フラグON ; コピ movf timer_cn+0,W movwf timer_cn2+0 movf timer_cn+1,W movwf timer_cn2+1 movf timer_cn+2,W movwf timer_cn2+2 movf odometer_cn+0,W movwf odometer_cn2+0 movf odometer_cn+1,W movwf odometer_cn2+1 movf odometer_cn+2,W movwf odometer_cn2+2 movf fuel_cn+0,W movwf fuel_cn2+0 movf fuel_cn+1,W movwf fuel_cn2+1 movf fuel_cn+2,W movwf fuel_cn2+2 ; リセ clrf timer_cn+0 clrf timer_cn+1 clrf timer_cn+2 clrf odometer_cn+0 clrf odometer_cn+1 clrf odometer_cn+2 clrf fuel_cn+0 clrf fuel_cn+1 clrf fuel_cn+2 goto reset_flow_check_end reset_flow_check_1 ; 一定時間に満たないので信号間だけリセット clrf timer_cn2+0 clrf timer_cn2+1 clrf timer_cn2+2 clrf odometer_cn2+0 clrf odometer_cn2+1 clrf odometer_cn2+2 clrf fuel_cn2+0 clrf fuel_cn2+1 clrf fuel_cn2+2 reset_flow_check_end 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 ; 液晶初期化 bcf flag,1 ; お休み中フラグOFF stopcheck_end goto mainloop ; 無限ループ ////////////// ループ、ココまで ///////////