LIST P=16F88,ST=OFF INCLUDE P16F88.INC INCLUDE ms88.inc INCLUDE measure88.inc ERRORLEVEL -302,-306 __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF __IDLOCS H'FFFF' ;;;;; IO Assinment for IOS88 PA_CONF EQU PA0_IN|PA1_IN|PA2_IN|PA3_IN|PA4_IN|PA5_IN|PA6_IN|PA7_IN PB_CONF EQU PB0_OUT|PB1_OUT|PB2_OUT|PB3_OUT|PB4_OUT|PB5_OUT|PB6_OUT|PB7_OUT ;;;;; Refresh Factor Dijital Outputs extended by 74HC595(8-bit Shift Register)s MDO_ShitClockP equ PORTB ; Port Address for Data Input and Shift pulse MDO_ShitClockB equ 4 ; Bit Number for Data Input and Shift pulse MDO_DATAP equ PORTB ; Port Address for Data Input MDO_DATAB equ 0 ; Bit Number for Data Input MDO_LatchP equ PORTB ; Port Address for Data Latch and output actually MDO_LatchB equ 1 ; Bit Number for Data Latch and output actually MDI_DATAP equ PORTA ;MDI_00B equ 2 ;MDI_01B equ 3 ;MDI_02B equ 4 ;MDI_03B equ 5 ;MDI_04B equ 1 ;MDI_05B equ 0 TMR1_PresetValueH equ 0x80 TMR1_PresetValueL equ 0x00 org 0x20 msecCnt0 res 1 msecCnt1 res 1 lCnt000 res 1 wait10usx res 1 waitmsx res 1 wait100msx res 1 waitsecx res 1 nowSecH res 1 nowSecL res 1 nowSubSecH res 1 nowSubSecL res 1 watchSec res 1 watchMinute res 1 watchHour res 1 startSecH res 1 startSecL res 1 startSubSecH res 1 startSubSecL res 1 passedTimeSecH res 1 passedTimeSecL res 1 passedTimeSubSecH res 1 passedTimeSubSecL res 1 referenceTimeSecH res 1 referenceTimeSecL res 1 referenceTimeSubSecH res 1 referenceTimeSubSecL res 1 recordSecH res 1 recordSecL res 1 recordSubSecH res 1 recordSubSecL res 1 lcdData res 1 lcdWork res 1 lcdCursor res 1 lcdCurPhisical res 1 lcdSavwW res 1 mdo_tmp res 1 mdo_00 res 1 ; Digital Output Register0 and 1 mdo_01 res 1 ; Contents of these registers should be Send to 74HC595 by function DeployMDO mdi_00 res 1 ; Digital Input Register 0 and 1 mdi_last00 res 1 ; mdi_difU00 res 1 ; Digital Input UP-EDGE Table 0 and 1 corresponds mdi_00 and mdi_01 mdi_difD00 res 1 ; Digital Input DOWN-EDGE Table 0 and 1 corresponds mdi_00 and mdi_01 rxStatus res 1 rxData00 res .9 rxRingWP res 1 rxRingRP res 1 rxRingRPBUP res 1 rxOverFlow res 1 txRemain res 1 txCounter res 1 parameterFlags res 1 RecordAttributeFlags res 1 lastSec res 1 recordNoL res 1 recordNoH res 1 mainStatusEvent res 1 subStatusEvent res 1 org 0x70 saveFlagsInInt res 1 ; For saving contextual register in interrupt routine saveWInInt res 1 ; These registers should be assigned common bank savePCLATHInInt res 1 ; saveFSRInInt res 1 ; A32H res 1 A32L res 1 A16H res 1 ; Higher byte of Acumulator A for 16-bit operation A16L res 1 ; Lower byte of Acumulator A for 16-bit operation B32H res 1 B32L res 1 B16H res 1 ; Higher byte of Acumulator B for 16-bit operation B16L res 1 ; Lower byte of Acumulator B for 16-bit operation secCntH res 1 secCntL res 1 tmp res 1 tmpH res 1 org 0xA0 sendBuf res .65 ; Send Buffer for ASYNC Communication setTxBufDest res 1 setTxBufStrN res 1 setTxBufTmp res 1 org 0x190 putsTmp res 1 putsStrN res 1 putsDest res 1 lcdVram res 0x21 c2aPCLatHBup res 1 c2aTmp res 1 c2aAnswer res 2 dDecSaveStat res 1 dDecTmp0 res 1 LCD_E_Port equ mdo_00 ; Port Address for LCD_E LCD_E_Bit equ 3 ; Bit Number for LCD_E LCD_RS_Port equ mdo_00 ; Port Address for LCD_RS LCD_RS_Bit equ 2 ; Bit Number for LCD_RS ;==== pre set value for EEROM org 0x2100 VERNO de 0x08,0x12,0x21 AUTHER de "Ponpoko213" recordNoStr de "R#",0x00 M_Shift de "W+Y->SettingMode",0x00 M_RunUPMode de "Ready 5Sec ",0x00 M_Flying de "Flying Detected!",0x00 M_SensorFault de "Goal Sensor NG!!",0x00 M_SettingRecordNo de "RecordNo= ",0x00 M_SettingHour de " Hour= ",0x00 M_SettingMinute de " Minute= ",0x00 M_SettingSecond de " Second= ",0x00 M_SettingStartSWis de "StartSW=",0x00 M_FlyingSW de "FlyingSW",0x00 M_AutoStart de " A.Start",0x00 ;==== End Of definition EEROM preset value ;#################### Power on Reset jump to Start up ORG 0x0000 GOTO START ;#################### Interrupt Exception routine ORG 0x0004 ;;;;; Save Contextual Registers movwf saveWInInt swapf saveWInInt,F swapf STATUS,W movwf saveFlagsInInt swapf PCLATH,W movwf savePCLATHInInt swapf FSR,W movwf saveFSRInInt clrf PCLATH clrf STATUS ; ClearRP0:RP1 ;INT000 btfsc INTCON,RBIF ; goto IntRBIF ;INT001 btfsc INTCON,INTF ; goto IntINT0 ;INT002 btfsc INTCON,TMR0IF ; goto IntTMR0 INT003 btfsc INTCON,PEIE goto IntPeriferal INT004 goto INTPostProcess IntPeriferal btfsc PIR1,TMR1IF goto IntTMR1 INT100 btfsc PIR1,TMR2IF goto IntTMR2 INT101 btfsc PIR1,SSPIF goto IntSSPComm INT102 btfsc PIR1,RCIF goto IntRx INT103 bsf STATUS,RP0 btfsc PIE1,TXIE goto IntTX bcf STATUS,RP0 INT104 goto IntPPostP IntPPostP goto INT004 ;;;;; Restore Contextual Registers and Exit of Interrupt exception routine INTPostProcess swapf saveFSRInInt,W movwf FSR swapf savePCLATHInInt,W movwf PCLATH swapf saveFlagsInInt,W movwf STATUS swapf saveWInInt,W retfie ;IntRBIF bcf INTCON,RBIF ; goto INT001 ;IntINT0 bcf INTCON,INTF ; goto INT002 ;IntTMR0 bcf INTCON,TMR0IF ; goto INT003 ;;;;; Interrupt Routine from Timer1 IntTMR1 ;----- Reload Timer preset value ; bsf TMR1H,7 ; bsf TMR1L,0 movlw TMR1_PresetValueH movwf TMR1H movlw TMR1_PresetValueL movwf TMR1L incf secCntL,F btfsc STATUS,Z incf secCntH,F bcf PIR1,TMR1IF decfsz watchSec,F goto INT100 movlw .60 movwf watchSec decfsz watchMinute,F goto INT100 movlw .60 movwf watchMinute decfsz watchHour,F goto INT100 movlw .24 movwf watchHour goto INT100 ;;;;; Interrupt Routine from Timer2 IntTMR2 incf msecCnt0,F btfsc STATUS,Z incf msecCnt1,F bcf PIR1,TMR2IF goto INT101 IntSSPComm bcf PIR1,SSPIF goto INT102 ;;;;; Interrupt Routine from USART Receiver IntRx btfss PIR1,RCIF goto IntRxExit movf RCSTA,W iorwf rxStatus,W andlw 0x02 ;& RCSTA btfss STATUS,Z bsf rxOverFlow,1 btfss rxOverFlow,0 goto RxInt20 movf RCREG,W goto IntRx RxInt20 bcf STATUS,IRP movlw rxData00 addwf rxRingWP,W movwf FSR movf RCREG,W movwf INDF incf rxRingWP,F movlw 0x07 andwf rxRingWP,F movf rxRingRP,W subwf rxRingWP,W btfsc STATUS,Z bsf rxOverFlow,0 goto IntRx IntRxExit goto INT103 ;;;;; Interrupt Routine from USART Transmitter IntTX bcf STATUS,RP0 btfss PIR1,TXIF goto IntTxExit movf txRemain,F btfsc STATUS,Z goto IntTxComplete movf txCounter,W movlw sendBuf addwf txCounter,W movwf FSR movf INDF,W movwf TXREG incf txCounter,F decf txRemain,F goto IntTX IntTxComplete bsf STATUS,RP0 bcf PIE1,TXIE bcf STATUS,RP0 IntTxExit goto INT104 ;#################### End of Interrupt Exception routine ;#################### ASync Communication Survice Routine read1cFromAsync movf rxRingRP,W ;--- Read 1 char from Rx Buffer subwf rxRingWP,W ; (Receiving Character from comm. line should be done in Interrupt Routine) btfsc STATUS,Z ; retlw .0 ;--- Calling Sequence movf rxRingRP,W ; call 1cFromAsync movwf rxRingRPBUP ; incf rxRingRP,F ;--- Return Value movlw 0x07 ; W-Reg A character from Rx buffer andwf rxRingRP,F ; 0: No Character in Rx Buffer bcf STATUS,IRP movlw rxData00 addwf rxRingRPBUP,W movwf FSR movf INDF,W return writeDbToAsync movwf txRemain ;--- Request Transmit To ASync Communication line clrf txCounter ; This routine just only Invoke Transmitter and write the first character to send. ; Actual transmitting the following character should be done in Tx interrupt writeDbToAsync00 btfss PIR1,TXIF ; routine which is invoked Tx-int(Tx register empty). goto writeToAsyncExit; To know Tx are complete or not, test "txRemain". If txRemain is 0, it say movf txCounter,W ; "The last Tx-request have been completed.". movlw sendBuf ; addwf txCounter,W ;--- calling sequence movwf FSR ; Tx data ---> sendBuf(Be careful, sendBuf is alocated in bank1, size=65(0x41) movf INDF,W ; length of data ---> W-Reg (Max 64(0x40) movwf TXREG ; call writeDbToAsync incf txCounter,F ; decf txRemain,F ;--- Return Value None. bsf STATUS,RP0 bsf PIE1,TXIE bcf STATUS,RP0 writeToAsyncExit return setConstStrToTxBuff bsf STATUS,RP0 ;---Calling Sequence bcf STATUS,RP1 ; Address String in EEROM(length should be 32 or under 32) ---> W-Reg bcf STATUS,IRP ; call putCs movwf setTxBufStrN ; movlw sendBuf &0xff ;--- Return Value movwf setTxBufDest ; W-Reg <=== Length of Tx String setCSTxB000 movf setTxBufStrN,W bcf STATUS,RP0 ; Bank Select for EEADR bsf STATUS,RP1 ; Bank Select for EEADR movwf EEADR bsf STATUS,RP0 ; Bank Select for EECON1 bcf EECON1,EEPGD bsf EECON1,RD bcf STATUS,RP0 ; Bank Select for EEDATA movf EEDATA,W bsf STATUS,RP0 ; Bank Select for 3(for access working register in LCD sub) bcf STATUS,RP1 ; Bank Select for EEADR btfsc STATUS,Z goto setCSTxB001 movwf setTxBufTmp movf setTxBufDest,W movwf FSR movf setTxBufTmp,W movwf INDF incf setTxBufStrN,F incf setTxBufDest,F goto setCSTxB000 setCSTxB001 movf setTxBufDest,W movwf FSR movlw .0 movwf INDF movlw sendBuf &0xff subwf setTxBufDest,W bcf STATUS,RP0 return ;#################### End of ASync Communication Survice Routine org 0x0100 ;#################### Subroutines for treating String n2a addwf PCL,F ;--- Translate Nibble Dada to ASCII Character retlw '0' ; retlw '1' ;--- Calling Sequence retlw '2' ; nibble Data ---> W-Reg (Lower 4-bits) retlw '3' ; retlw '4' ;--- Return Value retlw '5' ; W-Reg <--- Ascii Character (Corresponds Input Nibble Data) retlw '6' ; retlw '7' ;!!!! This subroutine is expected to be internal subroutine. retlw '8' ; Therefore, to avoid redundant codes, recognize some restrictions. retlw '9' ; 1)This subroutine ishould be located among 100H-1FFH absolutly. retlw 'A' ; 2)PCLATH should be set to 0x01 retlw 'B' ; retlw 'C' ; retlw 'D' retlw 'E' retlw 'F' c2a bsf STATUS,RP0 bsf STATUS,RP1 movwf c2aTmp movf PCLATH,W movwf c2aPCLatHBup movlw 1 movwf PCLATH swapf c2aTmp,W andlw 0x0f call n2a movwf c2aAnswer+0 movf c2aTmp,W andlw 0x0f call n2a movwf c2aAnswer+1 movf c2aPCLatHBup,W movwf PCLATH return setVramcharIn2_DecimalNoSign clrf A16H movf STATUS,W bsf STATUS,RP0 bsf STATUS,RP1 movwf dDecSaveStat sVS2DN_20 movlw .10/.256 movwf B16H movlw .10%.256 movwf B16L movlw .1 movwf dDecTmp0 sVS2DN_21 call sub16 btfss STATUS,C goto sVS2DN_22 incf dDecTmp0,F goto sVS2DN_21 sVS2DN_22 call add16 decf dDecTmp0,F swapf dDecTmp0,F sVS2DN_10 movf A16L,W iorwf dDecTmp0,W call c2a movf c2aAnswer+0,w movwf lcdVram+0 movf c2aAnswer+1,w movwf lcdVram+1 clrf lcdVram+2 movf dDecSaveStat,W movwf STATUS return setVramcharIn3_DecimalNoSign movf STATUS,W bsf STATUS,RP0 bsf STATUS,RP1 movwf dDecSaveStat sVS3DN_30 movlw .100/.256 movwf B16H movlw .100%.256 movwf B16L movlw .1 movwf dDecTmp0 sVS3DN_31 call sub16 btfss STATUS,C goto sVS3DN_32 incf dDecTmp0,F goto sVS3DN_31 sVS3DN_32 call add16 decf dDecTmp0,W call c2a movf c2aAnswer+1,w movwf lcdVram+0 sVS3DN_20 movlw .10/.256 movwf B16H movlw .10%.256 movwf B16L movlw .1 movwf dDecTmp0 sVS3DN_21 call sub16 btfss STATUS,C goto sVS3DN_22 incf dDecTmp0,F goto sVS3DN_21 sVS3DN_22 call add16 decf dDecTmp0,F swapf dDecTmp0,F sVS3DN_10 movf A16L,W iorwf dDecTmp0,W call c2a movf c2aAnswer+0,w movwf lcdVram+1 movf c2aAnswer+1,w movwf lcdVram+2 clrf lcdVram+3 movf dDecSaveStat,W movwf STATUS return setVramShortIn5_DecimalNoSign movf STATUS,W bsf STATUS,RP0 bsf STATUS,RP1 movwf dDecSaveStat sVS5DN_50 movlw .10000/.256 movwf B16H movlw .10000%.256 movwf B16L movlw .1 movwf dDecTmp0 sVS5DN_51 call sub16 btfss STATUS,C goto sVS5DN_52 incf dDecTmp0,F goto sVS5DN_51 sVS5DN_52 call add16 decf dDecTmp0,W call c2a movf c2aAnswer+1,w movwf lcdVram+0 sVS5DN_40 movlw .1000/.256 movwf B16H movlw .1000%.256 movwf B16L movlw .1 movwf dDecTmp0 sVS5DN_41 call sub16 btfss STATUS,C goto sVS5DN_42 incf dDecTmp0,F goto sVS5DN_41 sVS5DN_42 call add16 decf dDecTmp0,F swapf dDecTmp0,F sVS5DN_30 movlw .100/.256 movwf B16H movlw .100%.256 movwf B16L incf dDecTmp0,F sVS5DN_31 call sub16 btfss STATUS,C goto sVS5DN_32 incf dDecTmp0,F goto sVS5DN_31 sVS5DN_32 call add16 decf dDecTmp0,W call c2a movf c2aAnswer+0,w movwf lcdVram+1 movf c2aAnswer+1,w movwf lcdVram+2 sVS5DN_20 movlw .10/.256 movwf B16H movlw .10%.256 movwf B16L movlw .1 movwf dDecTmp0 sVS5DN_21 call sub16 btfss STATUS,C goto sVS5DN_22 incf dDecTmp0,F goto sVS5DN_21 sVS5DN_22 call add16 decf dDecTmp0,F swapf dDecTmp0,F sVS5DN_10 movlw .1/.256 movwf B16H movlw .1%.256 movwf B16L incf dDecTmp0,F sVS5DN_11 call sub16 btfss STATUS,C goto sVS5DN_12 incf dDecTmp0,F goto sVS5DN_11 sVS5DN_12 call add16 decf dDecTmp0,W call c2a movf c2aAnswer+0,w movwf lcdVram+3 movf c2aAnswer+1,w movwf lcdVram+4 clrf lcdVram+5 movf dDecSaveStat,W movwf STATUS return ;#################### End of Subroutines for treating String ;#################### Standard subroutines for controlling LCD Device(SC1602B) on extended I/O by 74HC595 ;;;;; Internal subroutine for waiting wait10us movwf wait10usx w10us000 movlw .5 ; 12 at 20MHz(10.2us), 6 at 10MHz(10.8us), 5 at 8MHz movwf lCnt000 w10us001 nop decfsz lCnt000,F goto w10us001 decfsz wait10usx,F goto w10us000 return waitms movwf waitmsx wms000 movlw .100 call wait10us decfsz waitmsx,F goto wms000 return wait100ms movwf wait100msx w100ms000 movlw .100 call waitms decfsz wait100msx,F goto w100ms000 return waitsec movwf waitsecx wsec000 movlw .10 call wait100ms decfsz waitsecx,F goto wsec000 return wrtLcdNibble andlw 0xf0 movwf lcdWork movf mdo_00,W andlw 0x0f iorwf lcdWork,W movwf mdo_00 call deployMDO bsf LCD_E_Port , LCD_E_Bit call deployMDO bcf LCD_E_Port , LCD_E_Bit call deployMDO return wrtLcd movwf lcdData call wrtLcdNibble swapf lcdData,W call wrtLcdNibble return ;;;;; LCD Initial Routine which should be called onece after Initializine Digital I/O routine at in startup routine lcdInitilize bcf LCD_E_Port , LCD_E_Bit ; --- calling sequence call deployMDO ; call lcdInitialize movlw .30 ; call waitms ; --- Return Value None. ; Initialize LCD Controler bcf LCD_RS_Port , LCD_RS_Bit call deployMDO movlw B'00110000' call wrtLcdNibble movlw .5 call waitms movlw B'00110000' call wrtLcdNibble movlw .10 call wait10us movlw B'00110000' call wrtLcdNibble movlw .5 call waitms movlw B'00100000' call wrtLcdNibble movlw B'00101000' call wrtLcd movlw B'00001000' call wrtLcd movlw B'00000110' call wrtLcd movlw B'00001100' ;;; call wrtLcd call lcdClear return ;;;;; set cursor position lcdLocate movwf lcdCursor ;--- Calling Sequence movlw 0x1f ; cursor position(0-1F) --->W-Reg andwf lcdCursor,F ; call lcdLocate btfss lcdCursor,4 ; goto ll000 ;--- Return Value None. movf lcdCursor,W movwf lcdCurPhisical movlw 0x0f andwf lcdCurPhisical,F movlw 0x40 iorwf lcdCurPhisical,F goto ll001 ll000 movf lcdCursor,W movwf lcdCurPhisical ll001 bcf LCD_RS_Port , LCD_RS_Bit call deployMDO movlw B'10000000' iorwf lcdCurPhisical,W call wrtLcd return ;;; Clear Display lcdClear bcf LCD_RS_Port , LCD_RS_Bit ;--- Calling Sequence call deployMDO ; call lcdClear movlw B'00000001' ; call wrtLcd ;--- Return Value None. movlw .2 call waitms movlw .0 movwf lcdCursor movwf lcdCurPhisical return ;;; Print a character to current cursor position in LCD putc bsf LCD_RS_Port , LCD_RS_Bit ;--- Calling Sequence movwf lcdSavwW ; character to display ---> W-Reg call deployMDO ; call putc movf lcdSavwW,W ; call wrtLcd ;--- Return Value None. incf lcdCursor,W andlw 0x1f movwf lcdCursor btfss STATUS,Z goto putc000 bcf LCD_RS_Port , LCD_RS_Bit call deployMDO movlw .0 movwf lcdCurPhisical iorlw B'10000000' call wrtLcd goto putcExit putc000 sublw 0x10 btfss STATUS,Z goto putc001 bcf LCD_RS_Port , LCD_RS_Bit call deployMDO movlw 0x40 movwf lcdCurPhisical iorlw B'10000000' call wrtLcd goto putcExit putc001 incf lcdCurPhisical,F putcExit return ;;; Print a String (in Ascii Zero format) from the current cursor position in LCD puts movlw B'11100000' ;---Calling Sequence movwf STATUS ; String to be printed ---> lcdVram(Page0,Maxsize=32) movlw lcdVram & 0xff ; (String in ASCII-Zero format which terminated by 0x00(NULL)) movwf putsStrN ; call puts puts000 movf putsStrN,W ; movwf FSR ;--- Return Value None. movf INDF,W ; btfsc STATUS,Z goto putsExit clrf STATUS call putc movlw B'11100000' movwf STATUS incf putsStrN,F goto puts000 putsExit clrf STATUS return ;;;;; Print String (in Ascii Zero format) presetted in EEROM putCs bsf STATUS,RP0 ;---Calling Sequence bsf STATUS,RP1 ; Address String in EEROM(length should be 32 or under 32) ---> W-Reg bsf STATUS,IRP ; call putCs movwf putsStrN ; movlw lcdVram &0xff ;--- Return Value None. movwf putsDest putCs000 movf putsStrN,W bcf STATUS,RP0 ; Bank Select for EEADR movwf EEADR bsf STATUS,RP0 ; Bank Select for EECON1 bcf EECON1,EEPGD bsf EECON1,RD bcf STATUS,RP0 ; Bank Select for EEDATA movf EEDATA,W bsf STATUS,RP0 ; Bank Select for 3(for access working register in LCD sub) btfsc STATUS,Z goto putCs001 movwf putsTmp movf putsDest,W movwf FSR movf putsTmp,W movwf INDF incf putsStrN,F incf putsDest,F goto putCs000 putCs001 movf putsDest,W movwf FSR movlw .0 movwf INDF movlw lcdVram & 0xff movwf putsStrN putCs002 movf putsStrN,W movwf FSR movf INDF,W btfsc STATUS,Z goto putCsExit clrf STATUS call putc movlw B'11100000' movwf STATUS incf putsStrN,F goto putCs002 putCsExit clrf STATUS return ;#################### The End of Standard Subroutines for controlling LCD Device ;#################### The standard Subroutines for Watch and TIME Management displayCurrentTime clrf A16H movf watchHour,W sublw .24 movwf A16L call setVramcharIn2_DecimalNoSign call puts movlw ':' call putc movf watchMinute,W sublw .60 movwf A16L call setVramcharIn2_DecimalNoSign call puts movlw ':' call putc movf watchSec,W sublw .60 movwf A16L call setVramcharIn2_DecimalNoSign call puts return ;;;;; Read TMR1 actual counter presizely without suspending interruption readSubSec movf TMR1H,W movwf nowSubSecH movf TMR1L,W movwf nowSubSecL movf TMR1H,W subwf nowSubSecH,W btfss STATUS,Z goto readSubSec ; Because TMR1 Counter starts to count from 0x8000(PresetValue) to 0x0000(Overflow) movf nowSubSecH,W movwf A16H movf nowSubSecL,W movwf A16L movlw TMR1_PresetValueH movwf B16H movlw TMR1_PresetValueL movwf B16L call sub16 movf A16H,W movwf nowSubSecH movf A16L,W movwf nowSubSecL return ;;;;; ReadWatch: Read timer counter value and set current time to realtime clock variables readWatch clrf STATUS readWatch0 movf secCntH,W movwf nowSecH movf secCntL,W movwf nowSecL movf secCntH,W subwf nowSecH,W btfss STATUS,Z goto readWatch0 call readSubSec movf secCntL,W subwf nowSecL,W btfss STATUS,Z goto readWatch0 ;;;;; Transform subSecH&subSecLvalue(1-tick=1/32768 Sec) to value in the regular 1/1000sec units. ;;; ([subSecH][subSecL] / 32768(=2^15) * 1000(=0x3E8) ;;; = ((subSecH*0x100+subSecL) * (0x300+0xE8) / (2^15) ;;; =(((subSecH*0x300)*0x100 + (subSecH*0xE8)*0x100+(SubSecL*0x300)+(SubSecL*0xE8)) / (2^15) ;;; =(((subSecH*03)*0x10000 + ((subSecH*0xE8)+(SubSecL*3))*0x100 + (subSecL*0xE8) ) ) >> 15 ;;; =(((subSecH*03)*0x10000 + ((subSecH*0xE8)+(SubSecL*3))*0x100 + (subSecL*0xE8) ) ) >> 15 transformsubSec clrf A32H ; A32H is used as a temporary register in this routine clrf A32L ; A32L is used as keeping overflow value for add16Bit operation clrf STATUS ;Clear Bank-Sel & Carry-Flag movf nowSubSecL,W ; [A16H][A16L] <=== subSecL*0xE8 (0xE8=(2^3)+(2^5)+(2^6)+(2^7) movwf B16L ; [A16H][A16L]=[B16H][B16L] <=== subSecL<<3 clrf B16H bcf STATUS,C rlf B16L,F rlf B16H,F bcf STATUS,C rlf B16L,F rlf B16H,F bcf STATUS,C rlf B16L,F rlf B16H,F movf B16L,W movwf A16L movf B16H,W movwf A16H bcf STATUS,C rlf B16L,F ; [B16H][B16L] <=== (subSecL<<3)<<2 rlf B16H,F bcf STATUS,C rlf B16L,F rlf B16H,F call add16 ; [A16H][A16L] += (subSecL<<5) bcf STATUS,C rlf B16L,F ; [B16H][B16L] <=== ((subSecL<<3)<<2)<<1 rlf B16H,F call add16 ; [A16H][A16L] += (subSecL<<6) bcf STATUS,C rlf B16L,F ; [B16H][B16L] <=== (((subSecL<<3)<<2)<<1)<<1 rlf B16H,F call add16 ; [A16H][A16L] += (subSecL<<7) movf A16H,W ; 8-Bit Right Shift movwf A16L clrf A16H movf nowSubSecH,W ; [A16H][A16L] += subSecH*0xE8 (0xE8=(2^3)+(2^5)+(2^6)+(2^7) movwf B16L ; [A16H][A16L] += [B16H][B16L] <=== subSecL<<3 clrf B16H bcf STATUS,C rlf B16L,F rlf B16H,F bcf STATUS,C rlf B16L,F rlf B16H,F bcf STATUS,C rlf B16L,F rlf B16H,F call add16 btfsc STATUS,C incf A32L,F bcf STATUS,C rlf B16L,F ; [B16H][B16L] <=== (subSecL<<3)<<2 rlf B16H,F bcf STATUS,C rlf B16L,F rlf B16H,F call add16 ; [A16H][A16L] += (subSecL<<5) btfsc STATUS,C incf A32L,F bcf STATUS,C rlf B16L,F ; [B16H][B16L] <=== ((subSecL<<3)<<2)<<1 rlf B16H,F call add16 ; [A16H][A16L] += (subSecL<<6) btfsc STATUS,C incf A32L,F bcf STATUS,C rlf B16L,F ; [B16H][B16L] <=== (((subSecL<<3)<<2)<<1)<<1 rlf B16H,F call add16 ; [A16H][A16L] += (subSecL<<7) btfsc STATUS,C incf A32L,F movf nowSubSecL,W ; [A16H][A16L] += subSecL*0x03 (0x3=(2^0)+(2^1)) movwf B16L ; [A16H][A16L]=[B16H][B16L] <=== subSecL<<3 clrf B16H call add16 ; [A16H][A16L] += (subSecL<<0) btfsc STATUS,C incf A32L,F bcf STATUS,C rlf B16L,F ; [B16H][B16L] <=== (subSecL<<1) rlf B16H,F call add16 ; [A16H][A16L] += (subSecL<<1) btfsc STATUS,C incf A32L,F movf A16L,W ;Shift Left 8-bit temporaryly movwf A32H movf A16H,W addwf A32L,W movwf A16L clrf A16H btfsc STATUS,C incf A16H,F movf nowSubSecH,W ; [A16H][A16L] += subSecH*0x03 (0x3=(2^0)+(2^1)) movwf B16L ; [A16H][A16L]=[B16H][B16L] <=== subSecL<<3 clrf B16H call add16 ; [A16H][A16L] += (subSecL<<0) bcf STATUS,C rlf B16L,F ; [B16H][B16L] <=== (subSecL<<1) rlf B16H,F call add16 ; [A16H][A16L] += (subSecL<<1) bcf STATUS,C rlf A16L,F rlf A16H,F btfsc A32L,7 bsf A16L,0 movf A16L,W movwf nowSubSecL movf A16H,W movwf nowSubSecH return setStartTime call readWatch movf nowSubSecH,W movwf startSubSecH movf nowSubSecL,W movwf startSubSecL movf nowSecH,W movwf startSecH movf nowSecL,W movwf startSecL return calcPassedTime movf nowSubSecH,W movwf A16H movf nowSubSecL,W movwf A16L movf startSubSecH,W movwf B16H movf startSubSecL,W movwf B16L call sub16 btfsc STATUS,C goto calcPassTime001 movlw .1000 / 0x100 movwf B16H movlw .1000 & 0xff movwf B16L call add16 movf A16H,W movwf passedTimeSubSecH movf A16L,W movwf passedTimeSubSecL movf nowSecH,W movwf A16H movf nowSecL,W movwf A16L btfsc STATUS,Z decf A16H,F decf A16L,F goto calcPassTime002 calcPassTime001 movf A16H,W movwf passedTimeSubSecH movf A16L,W movwf passedTimeSubSecL movf nowSecH,W movwf A16H movf nowSecL,W movwf A16L calcPassTime002 movf startSecH,W movwf B16H movf startSecL,W movwf B16L call sub16 movf A16H,W movwf passedTimeSecH movf A16L,W movwf passedTimeSecL return isTimePassed movf passedTimeSubSecH,W movwf A16H movf passedTimeSubSecL,W movwf A16L movf referenceTimeSubSecH,W movwf B16H movf referenceTimeSubSecL,W movwf B16L call sub16 btfsc STATUS,C goto isTimePassed001 movf passedTimeSecH,W movwf A16H movf passedTimeSecL,W movwf A16L btfsc STATUS,Z goto isTimePassed002 decf A16L,F goto isTimePassed003 isTimePassed002 movf A16H,F btfsc STATUS,Z goto isTimePassed004 decf A16L,F decf A16H,F goto isTimePassed003 isTimePassed004 bcf STATUS,C return isTimePassed001 movf passedTimeSecH,W movwf A16H movf passedTimeSecL,W movwf A16L isTimePassed003 movf referenceTimeSecH,W movwf B16H movf referenceTimeSecL,W movwf B16L call sub16 return ;#################### The End of The standard Subroutines for Watch and TIME Management ; ################### Digital Outputs extended by 74HC595(8Bit cascadable Shift register) Refresh Routine deployMDO bcf MDO_ShitClockP, MDO_ShitClockB ;---Calling Sequence bcf MDO_DATAP, MDO_DATAB ; Out put Channel 0 Data ---> mdo_00 bcf MDO_LatchP, MDO_LatchB ; Out put Channel 1 Data ---> mdo_01 ; call deployMDO movf mdo_01,W ; movwf mdo_tmp ;--- Return Value None. call deployMDO_1Bytes movf mdo_00,W movwf mdo_tmp call deployMDO_1Bytes bsf MDO_LatchP, MDO_LatchB bcf MDO_LatchP, MDO_LatchB return deployMDO_1Bytes bcf MDO_DATAP, MDO_DATAB btfsc mdo_tmp,7 bsf MDO_DATAP, MDO_DATAB bsf MDO_ShitClockP, MDO_ShitClockB bcf MDO_ShitClockP, MDO_ShitClockB bcf MDO_DATAP, MDO_DATAB btfsc mdo_tmp,6 bsf MDO_DATAP, MDO_DATAB bsf MDO_ShitClockP, MDO_ShitClockB bcf MDO_ShitClockP, MDO_ShitClockB bcf MDO_DATAP, MDO_DATAB btfsc mdo_tmp,5 bsf MDO_DATAP, MDO_DATAB bsf MDO_ShitClockP, MDO_ShitClockB bcf MDO_ShitClockP, MDO_ShitClockB bcf MDO_DATAP, MDO_DATAB btfsc mdo_tmp,4 bsf MDO_DATAP, MDO_DATAB bsf MDO_ShitClockP, MDO_ShitClockB bcf MDO_ShitClockP, MDO_ShitClockB bcf MDO_DATAP, MDO_DATAB btfsc mdo_tmp,3 bsf MDO_DATAP, MDO_DATAB bsf MDO_ShitClockP, MDO_ShitClockB bcf MDO_ShitClockP, MDO_ShitClockB bcf MDO_DATAP, MDO_DATAB btfsc mdo_tmp,2 bsf MDO_DATAP, MDO_DATAB bsf MDO_ShitClockP, MDO_ShitClockB bcf MDO_ShitClockP, MDO_ShitClockB bcf MDO_DATAP, MDO_DATAB btfsc mdo_tmp,1 bsf MDO_DATAP, MDO_DATAB bsf MDO_ShitClockP, MDO_ShitClockB bcf MDO_ShitClockP, MDO_ShitClockB bcf MDO_DATAP, MDO_DATAB btfsc mdo_tmp,0 bsf MDO_DATAP, MDO_DATAB bsf MDO_ShitClockP, MDO_ShitClockB bcf MDO_ShitClockP, MDO_ShitClockB return ; ################### End of Digital Outputs extended by 74HC595(8Bit cascadable Shift register) Refresh Routine ; ################### Digital Inputs extended by 74HC138(3Bit-8Bit Decoder) Refresh Routine deployMdi ;;;;; Refresh mdi_00 & mdi_difU00, mdi_difD00 movf MDI_DATAP,W andlw 0x3f movwf mdo_tmp clrf mdi_difD00 clrf mdi_difU00 ; subwf mdi_last00,F ; Cansel "Double Reading" because for inproving sensing performance ; btfss STATUS,Z ; 21,Mar.,'09 ; goto mdi00 ; xorwf mdi_00,W btfsc STATUS,Z goto mdi00 movwf mdi_difU00 andwf mdi_00,W movwf mdi_difD00 comf mdi_00,W andwf mdi_difU00,F movf mdo_tmp,W movwf mdi_00 mdi00 movf mdo_tmp,W movwf mdi_last00 return ; ################### End of Digital Inputs extended by 74HC138(3Bit-8Bit Decoder) Refresh Routine ; ################### General Utilities add16 movf B16L,W ;--- 16-Bit Add A+B ---> A addwf A16L,F ;--- Calling Sequence btfss STATUS,C ; Set A16H:A16L and B16H, B16L goto add16_000 ; call add16 incf A16H,F ; btfss STATUS,Z ;--- Return Value goto add16_001 ; A16H:A16L <--- Answer movf B16H,W ; Status.Carry-bit <= carry addwf A16H,F ; bsf STATUS,C return add16_001 add16_000 movf B16H,W addwf A16H,F return sub16 movf B16L,W ;--- 16-Bit Subtract A-B ---> A subwf A16L,F ;--- Calling Sequence btfsc STATUS,C ; Set A16H:A16L and B16H, B16L goto sub16_000 ; call sub16 movf A16H,F ; btfss STATUS,Z ;--- Return Value goto sub16_001 ; A16:A16L <--- Answer decf A16H,F ; Status.Carry-bit <= Inverse of Borrow movf B16H,W subwf A16H,F bcf STATUS,C return sub16_001 decf A16H,F sub16_000 movf B16H,W subwf A16H,F return add32 clrf tmp ;--- 32-Bit Add A+B ---> A movf B16L,W ;--- Calling Sequence addwf A16L,F ; Set A32H:A32L:A16H:A16L and B32H:B32L:B16H:B16L movlw H'01' ; call add32 btfsc STATUS,C ; addwf A16H,F ;--- Return Value btfsc STATUS,C ; A32H:A32L:A16H:A16L <--- Answer addwf A32L,F ; Status.Carry-bit <= carry btfsc STATUS,C ; addwf A32H,F ; btfsc STATUS,C ; incf tmp,F movf B16H,W addwf A16H,F movlw H'01' btfsc STATUS,C addwf A32L,F btfsc STATUS,C addwf A32H,F btfsc STATUS,C incf tmp,F movf B32L,W addwf A32L,F movlw H'01' btfsc STATUS,C addwf A32H,F movf B32H,W addwf A32H,F btfsc STATUS,C incf tmp,F bcf STATUS,C movf tmp,F btfss STATUS,Z bsf STATUS,C return sub32 clrf tmp ;--- 32-Bit Subtract A-B ---> A movf B16L,W ;--- Calling Sequence subwf A16L,F ; Set A32H:A32L:A16H:A16L and B32H:B32L:B16H:B16L movlw H'01' ; call sub32 btfss STATUS,C ; subwf A16H,F ;--- Return Value btfss STATUS,C ; A32H:A32L:A16H:A16L <--- Answer subwf A32L,F ; Status.Carry-bit <= Inverse of Borrow btfss STATUS,C subwf A32H,F btfss STATUS,C incf tmp,F movf B16H,W subwf A16H,F movlw H'01' btfss STATUS,C subwf A32L,F btfss STATUS,C subwf A32H,F btfss STATUS,C incf tmp,F movf B32L,W subwf A32L,F movlw H'01' btfss STATUS,C subwf A32H,F movf B32H,W subwf A32H,F btfss STATUS,C incf tmp,F bsf STATUS,C movf tmp,F btfss STATUS,Z bcf STATUS,C return ; ################### End of General Utilities START clrf PORTA ; clrf PORTB ; clrf T1CON bsf STATUS,RP0 movlw 0x7e ; Set System Clock with Internal 8MHz movwf OSCCON movlw B'00000111' ; Pull-Up Port-B Output, PS==1/256 for TMR0 movwf OPTION_REG movlw .0 ; <--- PIC16F88 movwf ANSEL ; <--- PIC16F88 movlw PA_CONF ; RA0-RA4 : movwf TRISA movlw PB_CONF ; RB0-RB7 : movwf TRISB bcf STATUS,RP0 clrf T1CON clrf msecCnt0 clrf msecCnt1 clrf secCntH clrf secCntL movlw .24 movwf watchHour movlw .60 movwf watchMinute movwf watchSec clrf PORTA ; clrf PORTB ; clrf mdo_00 clrf mdo_01 clrf mdi_00 clrf mdi_last00 clrf mdi_difU00 clrf mdi_difD00 clrf rxRingRP clrf rxOverFlow clrf rxStatus clrf sendBuf clrf txRemain clrf txCounter clrf startSecH clrf startSecL clrf startSubSecH clrf startSubSecL clrf passedTimeSecH clrf passedTimeSecL clrf passedTimeSubSecH clrf passedTimeSubSecL clrf referenceTimeSecH clrf referenceTimeSecL clrf referenceTimeSubSecH clrf referenceTimeSubSecL clrf recordSecH clrf recordSecL clrf recordSubSecH clrf recordSubSecL clrf parameterFlags call lcdInitilize ;;; Enable Timer1 with Interrupt movlw 0x80 movwf TMR1H clrf TMR1L movlw B'00001111' movwf T1CON bsf STATUS,RP0 ;select page1 bsf PIE1,TMR1IE ; Enable Interruption from TMR2 bcf STATUS,RP0 ;;; Enable Timer2 with Interrupt bsf STATUS,RP0 movlw .125 ; Set TMR2Period register value = 125 movwf PR2 ; bsf PIE1,TMR2IE ; Enable Interruption from TMR2 bcf STATUS,RP0 movlw B'01001011' ; Set TMR2 Mode PostScaler(b6:b3)=1001(=Set 10times) movwf T2CON ; Priscaler(b1:b0)=1116, TMR2ON(b2)=0 bsf INTCON,PEIE bsf T2CON,TMR2ON ; INVOKE TMR2 ;;Enable Seriall port movlw B'10010000' movwf RCSTA bsf STATUS,RP0 ;select page1 movlw B'00000100' movwf TXSTA movlw .12 ;Set BauRate Generator / Value 25 for 19.2K || 12 for 38.4K movwf SPBRG bsf TXSTA,TXEN bsf PIE1,RCIE ;Set Interruption for Rx bcf STATUS,RP0 ;;; Enable Interrupt bsf INTCON,GIE goto main ;===================================================================================================== ;================================== Application specific Utilities =================================== ;===================================================================================================== dispRecordNo movlw .9 call lcdLocate movlw recordNoStr & 0xff call putCs movf recordNoL,W movwf A16L movf recordNoH,W movwf A16H call setVramShortIn5_DecimalNoSign call puts return dispRecordTime movlw .16 call lcdLocate movlw ' ' btfss RecordAttributeFlags,FB_FlyingDetected goto dispRcdT001 movlw 'F' goto dispRcdT010 dispRcdT001 btfsc RecordAttributeFlags,FB_MeasuringAborted movlw 'A' dispRcdT010 call putc movlw ' ' btfsc RecordAttributeFlags,FB_SensorFaultDetected movlw 'S' call putc movlw ' ' btfsc RecordAttributeFlags,FB_Remark movlw 'R' call putc movf recordSecH,W movwf A16H movf recordSecL,W movwf A16L dispRcdH0 movlw .3600/.256 movwf B16H movlw .3600%.256 movwf B16L clrf tmp dispRcdH1 call sub16 btfss STATUS,C goto dispRcdH2 incf tmp,F goto dispRcdH1 dispRcdH2 call add16 movf tmp,W movwf B32H dispRcdM0 movlw .60/.256 movwf B16H movlw .60%.256 movwf B16L clrf tmp dispRcdM1 call sub16 btfss STATUS,C goto dispRcdM2 incf tmp,F goto dispRcdM1 dispRcdM2 call add16 movf tmp,W movwf B32L movf A16L,W movwf A32H movf B32H,W movwf A16L call setVramcharIn2_DecimalNoSign call puts movlw ':' call putc movf B32L,W movwf A16L call setVramcharIn2_DecimalNoSign call puts movlw 0x27 ; ' call putc movf A32H,W movwf A16L call setVramcharIn2_DecimalNoSign call puts movlw '.' call putc movf recordSubSecH,W ; 1/1000秒カウンタを10進ASCII文字2文字に直して movwf A16H ; movf recordSubSecL,W ; movwf A16L ; call setVramShortIn5_DecimalNoSign ; bsf STATUS,RP0 bsf STATUS,RP1 movf lcdVram+2,W ; 上位2桁をカットしてから movwf lcdVram+0 movf lcdVram+3,W movwf lcdVram+1 movf lcdVram+4,W movwf lcdVram+2 clrf lcdVram+3 clrf STATUS call puts ; 液晶に表示する movlw '"' call putc return ;===================================================================================================== ;=========================================== MAIN ROUTINE ============================================ ;===================================================================================================== main ;================= Initiate routine for application main loop movlw S_Idle movwf mainStatusEvent clrf subStatusEvent clrf RecordAttributeFlags clrf recordNoL clrf recordNoH call dispRecordNo call dispRecordTime mainLoop ; =============== Main Loop ========================================= ;========== Refresh I/O Table andextruct differential Inputs as externalevents call deployMdi ; I/O展開(入力) call deployMDO ; (出力) ; bcf mdo_00,0 ; btfsc mdi_00,PB_Red ; bsf mdo_00,0 ; bcf mdo_00,1 ; btfsc mdi_00,PB_Yellow ; bsf mdo_00,1 ;========== Display Switch status to LEDs bcf mdo_01,DO06B_SwGoal btfsc mdi_00,PB_Blue bsf mdo_01,DO06B_SwGoal bcf mdo_01,DO07B_SwFlying btfsc mdi_00,PB_Orange bsf mdo_01,DO07B_SwFlying ;========== If AutoStartMode (by accrossing Flying Detect SW) Turn on LED.Running ; bcf mdo_01,DO00_Measuring ; btfsc RecordAttributeFlags,FB_StartSwitchforAutoStart ; bsf mdo_01,DO00_Measuring ;========== Refresh Current Time Display movf lastSec,W subwf watchSec,W btfsc STATUS,Z goto SkipDispCurrentTime movlw .0 call lcdLocate call displayCurrentTime SkipDispCurrentTime movf watchSec,W movwf lastSec ;========== Call Status-Event Matrix Driver movlw StatusEventDriver/0x100 movwf PCLATH goto StatusEventDriver ReturnPointOfSED goto mainLoop org 0x0800 StatusEventDriver movlw SED0A00H/0x100 movwf PCLATH ;===== Generate Event and encode it genEventCode movlw 0xf0 andwf mainStatusEvent,F ; ===== Goal Light SW is ON? getEventCode00 btfss mdi_difD00,PB_Blue goto getEventCode01 movlw E_Goal goto genEventCodeExit ; ===== Start Light SW is ON? getEventCode01 btfss mdi_difD00,PB_Orange goto getEventCode02 movlw E_Flying goto genEventCodeExit getEventCode02 btfss mdi_00,PB_White goto getEventCode10 ; ===== WhitePB is on getEventCode05 btfss mdi_difU00,PB_Yellow goto getEventCode06 movlw E_SETMode goto genEventCodeExit getEventCode06 btfss mdi_difU00,PB_Green goto getEventCode07 movlw E_RSCmd goto genEventCodeExit getEventCode07 btfss mdi_difU00,PB_White goto getEventCodezz movlw E_Shift goto genEventCodeExit ; ===== WhitePB is off getEventCode10 btfss mdi_difU00,PB_Red goto getEventCode11 movlw E_Abort goto genEventCodeExit getEventCode11 btfss mdi_difU00,PB_Green goto getEventCode12 movlw E_Start goto genEventCodeExit getEventCode12 btfss mdi_difU00,PB_Yellow goto getEventCode13 movlw E_Alarm goto genEventCodeExit getEventCode13 btfss mdi_difD00,PB_White goto getEventCodezz movlw E_UnShift goto genEventCodeExit getEventCodezz movlw E_NoEvent genEventCodeExit iorwf mainStatusEvent,F movf mainStatusEvent,W goto SED0A00H ExitOfSED clrf PCLATH goto ReturnPointOfSED ;===== Action Description for Main Roop ;******************************************************************************* Idole Mode sed00 ;-----No Event occure ; StartSwitchMode Bit:0 of parameterFlags If AutoStartMode(=1), LED Measuring are turned on. ; StartSwitchMode Bit:0 of parameterFlags If AutoStartMode(=1), LED Measuring are turned on. bcf mdo_01,DO01B_Start1SecBefore bcf mdo_01,DO02B_Start2SecBefore bcf mdo_01,DO03B_Start3SecBefore btfss parameterFlags,FB_StartSwitchforAutoStart goto ExitOfSED bsf mdo_01,DO01B_Start1SecBefore bsf mdo_01,DO02B_Start2SecBefore bsf mdo_01,DO03B_Start3SecBefore goto ExitOfSED sed01 sed01_RunUP ;-----Invoke RunUpMode btfss RecordAttributeFlags,FB_MeasuringDone goto sed_01RunUP000 incf recordNoL,F btfsc STATUS,Z incf recordNoH,F bcf PCLATH,3 call dispRecordNo bcf RecordAttributeFlags,FB_MeasuringDone sed_01RunUP000 bcf PCLATH,3 movlw .16 call lcdLocate movlw M_RunUPMode & 0xff call putCs call setStartTime movlw SU_Start_5 movwf subStatusEvent movlw S_RunUp movwf mainStatusEvent bsf PCLATH,3 bcf mdo_01,DO00B_Measuring bcf mdo_01,DO01B_Start1SecBefore bcf mdo_01,DO02B_Start2SecBefore bsf mdo_01,DO03B_Start3SecBefore bcf mdo_01,DO04B_Flying bcf mdo_01,DO05B_SwInFault goto ExitOfSED sed02 ;-----E_Abort sed03 ;-----E_Alarm bcf PCLATH,3 call dispRecordTime bsf PCLATH,3 goto ExitOfSED sed04 ;-----E_Shift bcf PCLATH,3 movlw .16 call lcdLocate movlw M_Shift & 0xff bcf PCLATH,3 call putCs bsf PCLATH,3 goto ExitOfSED sed05 ;-----E_UnShift bcf PCLATH,3 call dispRecordTime bsf PCLATH,3 goto ExitOfSED sed09 ; E_Flying btfss parameterFlags,FB_StartSwitchforAutoStart goto ExitOfSED ; Increment RecordNo if last record is exist(Check MeasuringDone Bit) btfss RecordAttributeFlags,FB_MeasuringDone goto sed_09_010 incf recordNoL,F btfsc STATUS,Z incf recordNoH,F bcf PCLATH,3 call dispRecordNo bcf RecordAttributeFlags,FB_MeasuringDone sed_09_010 ;-----Invoke RunUpMode Immidiately clrf RecordAttributeFlags clrf recordSecH clrf recordSecL clrf recordSubSecH clrf recordSubSecL bcf PCLATH,3 call setStartTime movlw S_Measuring movwf mainStatusEvent bsf STATUS,RP0 bcf PIE1,TMR2IE ; Disable Interruption from TMR2 bcf STATUS,RP0 bcf mdo_01,DO04B_Flying ;Turn Off Error LEDs bcf mdo_01,DO05B_SwInFault ; bsf PCLATH,3 goto ExitOfSED sed0C ;-----E_SETMode bcf PCLATH,3 movlw .16 call lcdLocate movlw M_SettingRecordNo & 0xff call putCs movlw .26 call lcdLocate movf recordNoL,W movwf tmp movwf A16L movf recordNoH,W movwf tmpH movwf A16H call setVramShortIn5_DecimalNoSign call puts bcf RecordAttributeFlags,FB_GreenPBKeptON bcf RecordAttributeFlags,FB_YellowPBKeptON movlw SS_RecordNo movwf subStatusEvent movlw S_Setting movwf mainStatusEvent bsf STATUS,RP0 bsf PIE1,TMR2IE ; Enable Interruption from TMR2 bcf STATUS,RP0 bsf PCLATH,3 goto ExitOfSED sed0D ;-----E_RSCmd goto ExitOfSED ;******************************************************************************* RunUp Mode sed_10 ;-----EU_NoEvent movlw 0xfc andwf subStatusEvent,W btfss mdi_00,PB_Blue iorlw EU_Goal btfss mdi_00,PB_Orange iorlw EU_Flying goto SED0A50H sed_12 ;-----E_Abort movlw 0xfc andwf subStatusEvent,F movlw EU_Abort iorwf subStatusEvent,W goto SED0A50H sed_18 ;-----E_Goal movlw 0xfc andwf subStatusEvent,F movlw EU_Goal iorwf subStatusEvent,W goto SED0A50H sed_19 ;-----E_Flying movlw 0xfc andwf subStatusEvent,F movlw EU_Flying iorwf subStatusEvent,W goto SED0A50H ;*************************************************************************** Measuring Mode sed_20 ;-----E_NoEvent ;---------- Move passedTime to recordSec and Display it bcf PCLATH,3 call readWatch call calcPassedTime movf passedTimeSecH,W movwf recordSecH movf passedTimeSecL,W movwf recordSecL movf passedTimeSubSecH,W movwf recordSubSecH movf passedTimeSubSecL,W movwf recordSubSecL call dispRecordTime bcf mdo_01,DO00B_Measuring btfss passedTimeSubSecL,6 bsf mdo_01,DO00B_Measuring clrf referenceTimeSubSecH clrf referenceTimeSubSecL clrf referenceTimeSecH movlw .03 movwf referenceTimeSecL call isTimePassed bsf mdo_00,DO01B_Running ;#### btfsc STATUS,C bcf mdo_00,DO01B_Running ;#### bsf PCLATH,3 goto ExitOfSED sed_22 ;-----E_Abort bsf RecordAttributeFlags,FB_MeasuringAborted bsf RecordAttributeFlags,FB_MeasuringDone bcf mdo_01,DO00B_Measuring bcf mdo_00,DO01B_Running ;#### movlw S_Idle movwf mainStatusEvent bcf PCLATH,3 call readWatch call calcPassedTime movf passedTimeSecH,W movwf recordSecH movf passedTimeSecL,W movwf recordSecL movf passedTimeSubSecH,W movwf recordSubSecH movf passedTimeSubSecL,W movwf recordSubSecL call dispRecordTime bsf PCLATH,3 goto ExitOfSED sed_23 ;-----E_Alarm btfss RecordAttributeFlags,FB_Remark goto sed_23000 bcf RecordAttributeFlags,FB_Remark goto ExitOfSED sed_23000 bsf RecordAttributeFlags,FB_Remark goto ExitOfSED sed_28 ;-----E_Goal bsf RecordAttributeFlags,FB_MeasuringDone bcf mdo_01,DO00B_Measuring bcf mdo_00,DO01B_Running ;#### movlw S_Idle movwf mainStatusEvent goto ExitOfSED ;******************************************************************************* Setting Mode sed_30 ;-----E_NoEvent -> Regenerate Event Code for setting mode sed30_000 bcf PCLATH,3 call readWatch call calcPassedTime bsf PCLATH,3 btfss mdi_00,PB_Green goto sed30_010 ; Green PB is off. sed30_001 btfsc mdi_difU00,PB_White goto sed30_002 bcf PCLATH,3 call readWatch clrf referenceTimeSecH clrf referenceTimeSecL movlw .500/.256 movwf referenceTimeSubSecH movlw .500%.256 movwf referenceTimeSubSecL call isTimePassed bsf PCLATH,3 btfss STATUS,C goto sed30_noEvent btfss msecCnt0,4 goto sed30_noEvent clrf msecCnt0 movlw 0xf0 andwf subStatusEvent,F movlw ES_RepeatInc iorwf subStatusEvent,W goto SED0A80H sed30_002 movlw 0xf0 andwf subStatusEvent,F movlw ES_TurboInc iorwf subStatusEvent,W goto SED0A80H sed30_010 btfss RecordAttributeFlags,FB_YellowPBKeptON goto sed30_020 ; Yellow PB is off. sed30_011 btfsc mdi_difU00,PB_White goto sed30_012 bcf PCLATH,3 call readWatch movlw .500/.256 movwf referenceTimeSubSecH movlw .500%.256 movwf referenceTimeSubSecL clrf referenceTimeSecH clrf referenceTimeSecL call isTimePassed bsf PCLATH,3 btfss STATUS,C goto sed30_noEvent btfss msecCnt0,4 goto sed30_noEvent clrf msecCnt0 movlw 0xf0 andwf subStatusEvent,F movlw ES_RepeatDec iorwf subStatusEvent,W goto SED0A80H sed30_012 movlw 0xf0 andwf subStatusEvent,F movlw ES_TurboDec iorwf subStatusEvent,W goto SED0A80H sed30_020 sed30_noEvent btfsc mdi_difD00,PB_Green bcf RecordAttributeFlags,FB_GreenPBKeptON ;Green PB has been off. btfsc mdi_difD00,PB_Yellow bcf RecordAttributeFlags,FB_YellowPBKeptON ;Green PB has been off. movlw 0xf0 andwf subStatusEvent,W bsf PCLATH,3 goto SED0A80H sed_31 ;-----E_Start -> ES_Increment bcf PCLATH,3 call setStartTime bsf PCLATH,3 bsf RecordAttributeFlags,FB_GreenPBKeptON clrf msecCnt0 movlw 0xf0 andwf subStatusEvent,F movlw ES_Increment iorwf subStatusEvent,W goto SED0A80H sed_32 ;-----E_Abort -> ES_Abort movlw 0xf0 andwf subStatusEvent,F movlw ES_Abort iorwf subStatusEvent,W goto SED0A80H sed_33 ;-----E_Alarm -> ES_Decrement bcf PCLATH,3 call setStartTime bsf PCLATH,3 bsf RecordAttributeFlags,FB_YellowPBKeptON clrf msecCnt0 movlw 0xf0 andwf subStatusEvent,F movlw ES_Decrement iorwf subStatusEvent,W goto SED0A80H sed_34 ;-----E_Shift -> ES_Set btfsc mdi_00,PB_Green goto sed_30 ; Regenerate Event Code btfsc mdi_00,PB_Yellow goto sed_30 ; Regenerate Event Code movlw 0xf0 andwf subStatusEvent,F movlw ES_Set iorwf subStatusEvent,W goto SED0A80H ; ===== Action Description for RunUp Mode sedRup00 ;-----Procedure After Flying Detected bcf PCLATH,3 call readWatch call calcPassedTime clrf referenceTimeSubSecH clrf referenceTimeSubSecL clrf referenceTimeSecH movlw .03 movwf referenceTimeSecL call isTimePassed bsf PCLATH,3 btfsc STATUS,C goto sedRup00Quit bcf PCLATH,3 bcf mdo_00,DO01B_Running ;#### btfss passedTimeSubSecL,6 bsf mdo_00,DO01B_Running ;#### bsf PCLATH,3 goto ExitOfSED sedRup00Quit bcf PCLATH,3 call setStartTime bcf mdo_00,DO01B_Running ;#### bsf PCLATH,3 movlw S_Idle movwf mainStatusEvent goto ExitOfSED sedRup05 ;-----Abort bcf PCLATH,3 call setStartTime call dispRecordTime bcf mdo_00,DO00B_RunUp ;@@@@ bsf PCLATH,3 movlw S_Idle movwf mainStatusEvent bcf mdo_01,DO01B_Start1SecBefore bcf mdo_01,DO02B_Start2SecBefore bcf mdo_01,DO03B_Start3SecBefore goto ExitOfSED sedRup06 ;-----EU_Goal bcf PCLATH,3 call setStartTime movlw .16 call lcdLocate movlw M_SensorFault &0xff call putCs bcf mdo_00,DO00B_RunUp ;@@@@ bsf PCLATH,3 movlw SU_FlyingDetected movwf subStatusEvent bsf mdo_01,DO05B_SwInFault goto ExitOfSED sedRup07 ;-----EU_Flying bcf PCLATH,3 call setStartTime movlw .16 call lcdLocate movlw M_Flying &0xff call putCs bcf mdo_00,DO00B_RunUp ;@@@@ bsf PCLATH,3 movlw SU_FlyingDetected movwf subStatusEvent bsf mdo_01,DO04B_Flying goto ExitOfSED sedRup04 ;-----NoEvent(-1Sec Before) bcf PCLATH,3 call readWatch call calcPassedTime clrf referenceTimeSubSecH clrf referenceTimeSubSecL clrf referenceTimeSecH movlw .01 movwf referenceTimeSecL call isTimePassed bsf PCLATH,3 btfsc STATUS,C goto sed04_1SecTimeUP bsf mdo_00,DO00B_RunUp ;@@@@ movf passedTimeSubSecH,F btfss STATUS,Z bcf mdo_00,DO00B_RunUp ;@@@@ bsf mdo_01,DO01B_Start1SecBefore btfss STATUS,Z bcf mdo_01,DO01B_Start1SecBefore goto ExitOfSED sed04_1SecTimeUP clrf RecordAttributeFlags bcf PCLATH,3 call setStartTime movlw S_Measuring movwf mainStatusEvent bsf STATUS,RP0 bcf PIE1,TMR2IE ; Disable Interruption from TMR2 bcf STATUS,RP0 bcf mdo_01,DO01B_Start1SecBefore ; Turn Off LEDs bsf PCLATH,3 goto ExitOfSED sedRup08 ;-----NoEvent(-2Sec Before) bcf PCLATH,3 call readWatch call calcPassedTime clrf referenceTimeSubSecH clrf referenceTimeSubSecL clrf referenceTimeSecH movlw .01 movwf referenceTimeSecL call isTimePassed bsf PCLATH,3 btfsc STATUS,C goto sed08_1SecTimeUP bsf mdo_00,DO00B_RunUp ;@@@@ movf passedTimeSubSecH,F btfss STATUS,Z bcf mdo_00,DO00B_RunUp ;@@@@ bsf mdo_01,DO02B_Start2SecBefore btfss STATUS,Z bcf mdo_01,DO02B_Start2SecBefore goto ExitOfSED sed08_1SecTimeUP clrf RecordAttributeFlags bcf PCLATH,3 call setStartTime movlw .22 call lcdLocate movlw '1' call putc movlw SU_Start_1 movwf subStatusEvent bsf PCLATH,3 goto ExitOfSED sedRup0C ;-----NoEvent(-3Sec Before) bcf PCLATH,3 call readWatch call calcPassedTime clrf referenceTimeSubSecH clrf referenceTimeSubSecL clrf referenceTimeSecH movlw .01 movwf referenceTimeSecL call isTimePassed bsf PCLATH,3 btfsc STATUS,C goto sed0C_1SecTimeUP bsf mdo_00,DO00B_RunUp ;@@@@ movf passedTimeSubSecH,F btfss STATUS,Z bcf mdo_00,DO00B_RunUp ;@@@@ bsf mdo_01,DO03B_Start3SecBefore btfss STATUS,Z bcf mdo_01,DO03B_Start3SecBefore goto ExitOfSED sed0C_1SecTimeUP clrf RecordAttributeFlags bcf PCLATH,3 call setStartTime movlw .22 call lcdLocate movlw '2' call putc movlw SU_Start_2 movwf subStatusEvent bsf PCLATH,3 goto ExitOfSED sedRup10 ;-----NoEvent(-4Sec Before) bcf PCLATH,3 call readWatch call calcPassedTime clrf referenceTimeSubSecH clrf referenceTimeSubSecL clrf referenceTimeSecH movlw .01 movwf referenceTimeSecL call isTimePassed bsf PCLATH,3 btfsc STATUS,C goto sed10_1SecTimeUP bsf mdo_00,DO00B_RunUp ;@@@@ movf passedTimeSubSecH,F btfss STATUS,Z bcf mdo_00,DO00B_RunUp ;@@@@ bsf mdo_01,DO03B_Start3SecBefore btfss STATUS,Z bcf mdo_01,DO03B_Start3SecBefore goto ExitOfSED sed10_1SecTimeUP clrf RecordAttributeFlags bcf PCLATH,3 call setStartTime movlw .22 call lcdLocate movlw '3' call putc movlw SU_Start_3 movwf subStatusEvent bsf PCLATH,3 goto ExitOfSED sedRup14 ;-----NoEvent(-5Sec Before) bcf PCLATH,3 call readWatch call calcPassedTime clrf referenceTimeSubSecH clrf referenceTimeSubSecL clrf referenceTimeSecH movlw .01 movwf referenceTimeSecL call isTimePassed bsf PCLATH,3 btfsc STATUS,C goto sed14_1SecTimeUP bsf mdo_00,DO00B_RunUp ;@@@@ movf passedTimeSubSecH,F btfss STATUS,Z bcf mdo_00,DO00B_RunUp ;@@@@ bsf mdo_01,DO03B_Start3SecBefore btfss STATUS,Z bcf mdo_01,DO03B_Start3SecBefore goto ExitOfSED sed14_1SecTimeUP clrf RecordAttributeFlags bcf PCLATH,3 call setStartTime movlw .22 call lcdLocate movlw '4' call putc movlw SU_Start_4 movwf subStatusEvent bsf PCLATH,3 goto ExitOfSED ; ===== Action Description for Setting Mode sedSet00 ;-----No Event occure bcf mdo_01,DO00B_Measuring btfss msecCnt0,6 bsf mdo_01,DO00B_Measuring goto ExitOfSED sedSet01 ;-----ES_Increment incf tmp,F btfsc STATUS,Z incf tmpH,F movf tmpH,W movwf A16H movf tmp,W movwf A16L movlw .10000/.256 movwf B16H movlw .10000%.256 movwf B16L bcf PCLATH,3 call sub16 bsf PCLATH,3 btfss STATUS,C goto sedSet01_001 clrf tmp clrf tmpH sedSet01_001 bcf PCLATH,3 movlw .26 call lcdLocate movf tmp,W movwf A16L movf tmpH,W movwf A16H call setVramShortIn5_DecimalNoSign call puts bsf PCLATH,3 goto ExitOfSED sedSet02 ;-----ES_Abort bcf RecordAttributeFlags,FB_GreenPBKeptON bcf RecordAttributeFlags,FB_YellowPBKeptON bcf mdo_01,DO00B_Measuring bcf PCLATH,3 call dispRecordTime bsf PCLATH,3 movlw S_Idle movwf mainStatusEvent goto ExitOfSED sedSet03 ;-----ES_Decrement movf tmp,W iorwf tmpH,W btfss STATUS,Z goto sedSet03_001 movlw .9999/.256 movwf tmpH movlw .9999%.256 movwf tmp goto sedSet03_002 sedSet03_001 movf tmp,W btfsc STATUS,Z decf tmpH,F decf tmp,F sedSet03_002 bcf PCLATH,3 movlw .26 call lcdLocate movf tmp,W movwf A16L movf tmpH,W movwf A16H call setVramShortIn5_DecimalNoSign call puts bsf PCLATH,3 goto ExitOfSED sedSet04 ;-----ES_Set bcf PCLATH,3 movf tmp,W movwf recordNoL movf tmpH,W movwf recordNoH call dispRecordNo bcf RecordAttributeFlags,FB_MeasuringDone movlw .16 call lcdLocate movlw M_SettingHour & 0xff call putCs movlw .26 call lcdLocate movf watchHour,W sublw .24 movwf tmp movwf A16L call setVramcharIn2_DecimalNoSign call puts bcf RecordAttributeFlags,FB_GreenPBKeptON bcf RecordAttributeFlags,FB_YellowPBKeptON movlw SS_Hour movwf subStatusEvent bsf PCLATH,3 goto ExitOfSED sedSet07 ;-----ES_TurboInc movf tmp,W movwf A16L movf tmpH,W movwf A16H movlw .50 movwf B16L clrf B16H bcf PCLATH,3 call add16 bsf PCLATH,3 movf A16L,W movwf tmp movf A16H,W movwf tmpH movlw .10000%.256 movwf B16L movlw .10000/.256 movwf B16H bcf PCLATH,3 call sub16 bsf PCLATH,3 btfss STATUS,C goto sedSet07_010 sedSet07_001 clrf tmp clrf tmpH sedSet07_010 bcf PCLATH,3 movlw .26 call lcdLocate movf tmp,W movwf A16L movf tmpH,W movwf A16H call setVramShortIn5_DecimalNoSign call puts bsf PCLATH,3 goto ExitOfSED sedSet09 ;-----ES_TurboDec movf tmp,W movwf A16L movf tmpH,W movwf A16H movlw .50 movwf B16L clrf B16H bcf PCLATH,3 call sub16 bsf PCLATH,3 btfsc STATUS,C goto sedSet09_010 movlw .9950%.256 movwf A16L movlw .9950/.256 movwf A16H sedSet09_010 movf A16L,W movwf tmp movf A16H,W movwf tmpH bcf PCLATH,3 movlw .26 call lcdLocate call setVramShortIn5_DecimalNoSign call puts bsf PCLATH,3 goto ExitOfSED sedSet11 ;-----ES_Increment incf tmp,F movf tmp,W sublw .23 btfss STATUS,C clrf tmp sedSet10_disp_and_Return bcf PCLATH,3 movlw .26 call lcdLocate movf tmp,W movwf A16L call setVramcharIn2_DecimalNoSign call puts bsf PCLATH,3 goto ExitOfSED sedSet13 ;-----ES_Decrement decf tmp,F incf tmp,W movlw .23 btfsc STATUS,Z movwf tmp goto sedSet10_disp_and_Return sedSet14 ;-----ES_Set movf tmp,W sublw .24 movwf watchHour bcf PCLATH,3 movlw .0 call lcdLocate call displayCurrentTime movlw .16 call lcdLocate movlw M_SettingMinute & 0xff call putCs movlw .26 call lcdLocate movf watchMinute,W sublw .60 movwf tmp movwf A16L call setVramcharIn2_DecimalNoSign call puts bcf RecordAttributeFlags,FB_GreenPBKeptON bcf RecordAttributeFlags,FB_YellowPBKeptON movlw SS_Minutes movwf subStatusEvent bsf PCLATH,3 goto ExitOfSED sedSet17 ;-----ES_TurboInc movlw .4 addwf tmp,F movlw .24 subwf tmp,W btfsc STATUS,C clrf tmp goto sedSet10_disp_and_Return sedSet19 ;-----ES_TurboDec movlw .4 subwf tmp,F movlw .24 subwf tmp,W movlw .20 btfsc STATUS,C movwf tmp goto sedSet10_disp_and_Return sedSet21 ;-----ES_Increment incf tmp,F movf tmp,W sublw .59 btfss STATUS,C clrf tmp sedSet20_disp_and_Return bcf PCLATH,3 movlw .26 call lcdLocate movf tmp,W movwf A16L call setVramcharIn2_DecimalNoSign call puts bsf PCLATH,3 goto ExitOfSED sedSet23 ;-----ES_Decrement decf tmp,F incf tmp,W movlw .59 btfsc STATUS,Z movwf tmp goto sedSet20_disp_and_Return sedSet24 ;-----ES_Set movf tmp,W sublw .60 movwf watchMinute bcf PCLATH,3 movlw .0 call lcdLocate call displayCurrentTime movlw .16 call lcdLocate movlw M_SettingSecond & 0xff call putCs movlw .26 call lcdLocate movf watchSec,W sublw .60 movwf tmp movwf A16L call setVramcharIn2_DecimalNoSign call puts bcf RecordAttributeFlags,FB_GreenPBKeptON bcf RecordAttributeFlags,FB_YellowPBKeptON movlw SS_Second movwf subStatusEvent bsf PCLATH,3 goto ExitOfSED sedSet27 ;-----ES_TurboInc movlw .10 addwf tmp,F movlw .60 subwf tmp,W btfsc STATUS,C clrf tmp goto sedSet20_disp_and_Return sedSet29 ;-----ES_TurboDec movlw .10 subwf tmp,F movlw .60 subwf tmp,W movlw .50 btfsc STATUS,C movwf tmp goto sedSet20_disp_and_Return sedSet31 ;-----ES_Increment incf tmp,F movf tmp,W sublw .59 btfss STATUS,C clrf tmp sedSet30_disp_and_Return bcf PCLATH,3 movlw .26 call lcdLocate movf tmp,W movwf A16L call setVramcharIn2_DecimalNoSign call puts bsf PCLATH,3 goto ExitOfSED sedSet33 ;-----ES_Decrement decf tmp,F incf tmp,W movlw .59 btfsc STATUS,Z movwf tmp goto sedSet30_disp_and_Return sedSet34 ;-----ES_Set movf tmp,W sublw .60 movwf watchSec bcf PCLATH,3 movlw .0 call lcdLocate call displayCurrentTime movlw .16 call lcdLocate movlw M_SettingStartSWis & 0xff call putCs movlw .24 call lcdLocate movlw M_FlyingSW & 0xff btfss parameterFlags,FB_StartSwitchforAutoStart call putCs movlw M_AutoStart & 0xff btfsc parameterFlags,FB_StartSwitchforAutoStart call putCs clrf tmp btfsc parameterFlags,FB_StartSwitchforAutoStart incf tmp,F bcf RecordAttributeFlags,FB_GreenPBKeptON bcf RecordAttributeFlags,FB_YellowPBKeptON movlw SS_FlyingDetector movwf subStatusEvent bsf PCLATH,3 goto ExitOfSED sedSet37 ;-----ES_TurboInc movlw .10 addwf tmp,F movlw .60 subwf tmp,W btfsc STATUS,C clrf tmp goto sedSet20_disp_and_Return sedSet39 ;-----ES_TurboDec movlw .10 subwf tmp,F movlw .60 subwf tmp,W movlw .50 btfsc STATUS,C movwf tmp goto sedSet20_disp_and_Return goto ExitOfSED sedSet41 ;-----ES_Increment incf tmp,F sedSet40_Disp_and_Return bcf PCLATH,3 movlw .24 call lcdLocate movlw M_FlyingSW & 0xff btfss tmp,0 call putCs movlw M_AutoStart & 0xff btfsc tmp,0 call putCs bsf PCLATH,3 goto ExitOfSED sedSet43 ;-----ES_Decrement decf tmp,F goto sedSet40_Disp_and_Return sedSet44 ;-----ES_Set bcf parameterFlags,FB_StartSwitchforAutoStart btfsc tmp,0 bsf parameterFlags,FB_StartSwitchforAutoStart bcf RecordAttributeFlags,FB_GreenPBKeptON bcf RecordAttributeFlags,FB_YellowPBKeptON bcf mdo_01,DO00B_Measuring bcf PCLATH,3 call dispRecordTime bsf PCLATH,3 movlw S_Idle movwf mainStatusEvent goto ExitOfSED org 0x0C00 SED0A00H addwf PCL,F ; ===== Jump Matrix Table for Main loop in the idole mode goto sed00 ; E_NoEvent goto sed01 ; E_Start goto sed02 ; E_Abort goto sed03 ; E_Alarm goto sed04 ; E_Shift goto sed05 ; E_UnShift goto sed00 ; E_Event_06 goto sed00 ; E_Event_07 goto sed00 ; E_Goal goto sed09 ; E_Flying goto sed00 ; E_Event_0a goto sed00 ; E_Event_0b goto sed0C ; E_SETMode goto sed0D ; E_RSCmd goto sed00 ; E_Event_0e goto sed00 ; E_Event_0f ; ===== Jump Matrix Table for Main loop in the Runup Mode goto sed_10 ; E_NoEvent goto sed_10 ; E_Start goto sed_12 ; E_Abort goto sed_10 ; E_Alarm goto sed_10 ; E_Shift goto sed_10 ; E_UnShift goto sed_10 ; E_Event_06 goto sed_10 ; E_Event_07 goto sed_18 ; E_Goal goto sed_19 ; E_Flying goto sed_10 ; E_Event_0a goto sed_10 ; E_Event_0b goto sed_10 ; E_SETMode goto sed_10 ; E_RSReport goto sed_10 ; E_Event_0e goto sed_10 ; E_Event_0f ; ===== Jump Matrix Table for Main loop in the Measuring mode goto sed_20 ; E_NoEvent goto sed_20 ; E_Start goto sed_22 ; E_Abort goto sed_23 ; E_Alarm goto sed_20 ; E_Shift goto sed_20 ; E_UnShift goto sed_20 ; E_Event_06 goto sed_20 ; E_Event_07 goto sed_28 ; E_Goal goto sed_20 ; E_Flying goto sed_20 ; E_Event_0a goto sed_20 ; E_Event_0b goto sed_20 ; E_SETMode goto sed_20 ; E_RSReport goto sed_20 ; E_Event_0e goto sed_20 ; E_Event_0f ;===== Jump Matrix Table for Main loop in the Configuration Mode goto sed_30 ; E_NoEvent goto sed_31 ; E_Start goto sed_32 ; E_Abort goto sed_33 ; E_Alarm goto sed_34 ; E_Shift goto sed_30 ; E_UnShift goto sed_30 ; E_Event_06 goto sed_30 ; E_Event_07 goto sed_30 ; E_Goal goto sed_30 ; E_Flying goto sed_30 ; E_Event_0a goto sed_30 ; E_Event_0b goto sed_30 ; E_SETMode goto sed_30 ; E_RSReport goto sed_30 ; E_Event_0e goto sed_30 ; E_Event_0f org 0x0C50 SED0A50H addwf PCL,F ; ===== Jump Matrix Table for RunUP loop in the SU_FlyingDetected goto sedRup00 ; NoEvent goto sedRup00 ; Abort goto sedRup00 ; EU_Goal goto sedRup00 ; EU_Flying ; ===== Jump Matrix Table for RunUP loop in the SU_Sart_1 goto sedRup04 ; NoEvent goto sedRup05 ; Abort goto sedRup06 ; EU_Goal goto sedRup07 ; EU_Flying ; ===== Jump Matrix Table for RunUP loop in the SU_Sart_2 goto sedRup08 ; NoEvent goto sedRup05 ; Abort goto sedRup06 ; EU_Goal goto sedRup07 ; EU_Flying ; ===== Jump Matrix Table for RunUP loop in the SU_Sart_3 goto sedRup0C ; NoEvent goto sedRup05 ; Abort goto sedRup06 ; EU_Goal goto sedRup07 ; EU_Flying ; ===== Jump Matrix Table for RunUP loop in the SU_Sart_4 goto sedRup10 ; NoEvent goto sedRup05 ; Abort goto sedRup06 ; EU_Goal goto sedRup07 ; EU_Flying ; ===== Jump Matrix Table for RunUP loop in the SU_Sart_5 goto sedRup14 ; NoEvent goto sedRup05 ; Abort goto sedRup06 ; EU_Goal goto sedRup07 ; EU_Flying org 0x0C80 SED0A80H addwf PCL,F ; ===== Jump Matrix Table for Setting SubLoop in SS_RecordNo Mode goto sedSet00 ; ES_NoEvent goto sedSet01 ; ES_Increment goto sedSet02 ; ES_Abort goto sedSet03 ; ES_Decrement goto sedSet04 ; ES_Set goto sedSet01 ; ES_RepeatInc goto sedSet03 ; ES_RepeatDec goto sedSet07 ; ES_TurboInc goto sedSet00 ; ES_Event_08 goto sedSet09 ; ES_TurboDec goto sedSet00 ; ES_Event_0A goto sedSet00 ; ES_Event_0B goto sedSet00 ; ES_Event_0C goto sedSet00 ; ES_Event_0D goto sedSet00 ; ES_Event_0E goto sedSet00 ; ES_Event_0F ; ===== Jump Matrix Table for Setting SubLoop in SS_Hour Mode goto sedSet00 ; ES_NoEvent goto sedSet11 ; ES_Increment goto sedSet02 ; ES_Abort goto sedSet13 ; ES_Decrement goto sedSet14 ; ES_Set goto sedSet11 ; ES_RepeatInc goto sedSet13 ; ES_RepeatDec goto sedSet17 ; ES_TurboInc goto sedSet00 ; ES_Event_08 goto sedSet19 ; ES_TurboDec goto sedSet00 ; ES_Event_0A goto sedSet00 ; ES_Event_0B goto sedSet00 ; ES_Event_0C goto sedSet00 ; ES_Event_0D goto sedSet00 ; ES_Event_0E goto sedSet00 ; ES_Event_0F ; ===== Jump Matrix Table for Setting SubLoop in SS_Munites Mode goto sedSet00 ; ES_NoEvent goto sedSet21 ; ES_Increment goto sedSet02 ; ES_Abort goto sedSet23 ; ES_Decrement goto sedSet24 ; ES_Set goto sedSet21 ; ES_RepeatInc goto sedSet23 ; ES_RepeatDec goto sedSet27 ; ES_TurboInc goto sedSet00 ; ES_Event_08 goto sedSet29 ; ES_TurboDec goto sedSet00 ; ES_Event_0A goto sedSet00 ; ES_Event_0B goto sedSet00 ; ES_Event_0C goto sedSet00 ; ES_Event_0D goto sedSet00 ; ES_Event_0E goto sedSet00 ; ES_Event_0F ; ===== Jump Matrix Table for Setting SubLoop in SS_Sec Mode goto sedSet00 ; ES_NoEvent goto sedSet31 ; ES_Increment goto sedSet02 ; ES_Abort goto sedSet33 ; ES_Decrement goto sedSet34 ; ES_Set goto sedSet31 ; ES_RepeatInc goto sedSet33 ; ES_RepeatDec goto sedSet37 ; ES_TurboInc goto sedSet00 ; ES_Event_08 goto sedSet39 ; ES_TurboDec goto sedSet00 ; ES_Event_0A goto sedSet00 ; ES_Event_0B goto sedSet00 ; ES_Event_0C goto sedSet00 ; ES_Event_0D goto sedSet00 ; ES_Event_0E goto sedSet00 ; ES_Event_0F ; ===== Jump Matrix Table for Setting SubLoop in FlyingDetector Mode goto sedSet00 ; ES_NoEvent goto sedSet41 ; ES_Increment goto sedSet02 ; ES_Abort goto sedSet43 ; ES_Decrement goto sedSet44 ; ES_Set goto sedSet41 ; ES_RepeatInc goto sedSet43 ; ES_RepeatDec goto sedSet41 ; ES_TurboInc goto sedSet00 ; ES_Event_08 goto sedSet43 ; ES_TurboDec goto sedSet00 ; ES_Event_0A goto sedSet00 ; ES_Event_0B goto sedSet00 ; ES_Event_0C goto sedSet00 ; ES_Event_0D goto sedSet00 ; ES_Event_0E goto sedSet00 ; ES_Event_0F END