        
        
         LIST     P=PIC16C54,R=HEX  
PA       EQU      05       ;-------  IV517       5 DROPS FOR AVERAGE    -----
PB       EQU      06       ;           EVERY 1 DROP MONITOR
CA1      EQU      07       ;           5 VERSION
CA2      EQU      08       ;-------  1997/5/25 SUN,PU-NENG  COPYRIGHT   -----
CA3      EQU      09       ;
CB1      EQU      0A       ;PRESS START FOR NORMAL START (G)
CB2      EQU      0B       ;PRESS START MORE THAN 1 SEC FOR SILENT MODLE (Y)
CB3      EQU      0C       ;ALARM2 OUTPUT TO RELAY(1.5 SEC) FOR CALL SYSTEM 
CC1      EQU      0D       ;REVIEW DEC/2002
CC2      EQU      0E   
CC3      EQU      0F   
CD1      EQU      10       
CD2      EQU      11
CD3      EQU      12   
CE1      EQU      13       ;ALL PURPOSE
CE2      EQU      14
CE3      EQU      15   
CDROP    EQU      16       ;DROPS FOR CALIBRATION N+1
CRUN     EQU      17       ;GENERAL OSC ,CNT6,3 =304mS ,4=608mS 
SNDM     EQU      18       ;SPEAKER MASK ,FOR CA1,2
TIMER2   EQU      19       ;ALARM2 TIMER
ALTIME   EQU      30       ;38mS * 48 =1.5 SEC, ALARM2 ON DUTY
CALDROP  EQU      06       ;(CALDROP-1 =5 DROPS) 
                           ;1F,7     EQU     FLAGG    ;GREEN MODLE
                           ;1F,6     EQU     FLAGY    ;YELLOW MODLE = SILENT
                           ;1F,5     EQU     FALGC    ;1=CAL
                           ;1F,4     EQU     FLAGE    ;1=ERROR
                           ;RED      EQU     6,0      ;RED OUTPUT
                           ;YELLOW   EQU     6.1      ;YELLOW
                           ;GREEN    EQU     6,2                        
                           ;IR       EQU     6,3
                           ;PREAMP   EQU     6,4      
                           ;SOUND    EQU     6,5      ;TO SPEARER 
                           ;ALARM    EQU     6,6      ;OUTPUT HIGH 
                           ;ALARM2   EQU     6,7      ;OUTPUT 1.5 SEC
                           ;ISTOP    EQU     5,0      ;PRESS=0
                           ;ISTART   EQU     5,1
                           ;IIV      EQU     5,2      ;DROP=0
                           ;ILOW     EQU     5,3      ;LOW=0
;--------------------------------------------------------------------------
         ORG      1FF     
         GOTO     00
;---------------------------------------------------------------------------
         ORG      000     
         GOTO     POWERON
         GOTO     1FF      ;RE-PROGRAMABLE
POWERON: CLRF     CE1      ;POWERON TIME DELAY, UNTIL STABLE
LOP1:    DECFSZ   CE1,1
         GOTO     LOP1
         MOVLW    00       ;PB0=6,0 1=6,1 2=6,2 3=6,3
         TRIS     PB       ;PB4=6,4 5=6,5 6=6,6 7=6,62
         CLRF     PB       ; 
         MOVLW    0F       ;PA0=OFF 1=START 2=PHOTOSENSER 3=LOW BATTERY 
         TRIS     PA       ;PA AS OUTPUT
         CLRF     PA       ;
         BTFSS    5,1      ;START ON,NOT SKIP
         GOTO     START
         CLRWDT            ;IDLE
         MOVLW    0E       ;001110 WDT ENABLE PRESCALE 64*18MS
         OPTION            ;
         SLEEP             ;POWER SAVE FUNTION
START:   CLRF     PB
         BCF      6,6
         BSF      6,4
         BSF      6,3
         BCF      1F,6
         BSF      1F,7     ;SET GREEN MODLE
         CALL     BEEP
         MOVLW    30       ;TEST START KEY FOR 48*38MS= 1.5 SEC
         MOVWF    CE3
SS1:     CALL     LED      ;GREEN ON
         BTFSS    5,3      ;TEST LOW BATTERY
         GOTO     LOWBAT  
         BTFSC    5,1      ;START KEY,STILL PRESSED
         GOTO     START3   ;NORMAL START
         DECFSZ   CE3,1
         GOTO     SS1
         BCF      1F,7
         BSF      1F,6     ;MORE THAN 1 SEC = YELLOW MODLE
SS2:     CALL     LED
         BTFSS    5,3      ;TEST LOW BATTERY
         GOTO     LOWBAT  
         BTFSC    5,1      ;START KEY,STILL PRESSED
         GOTO     START3   ;SILENT START
         GOTO     SS2
;--------------------------------------------------------------------------         
START3:  MOVLW    CALDROP  ;6-1 DROPS FOR CAL,ERR1 CAL      
         MOVWF    CDROP      
         BSF      1F,5     ;SET CAL FLAG
         BSF      6,0      ;RED ON
         CLRF     CB1
         CLRF     CB2
         CLRF     CB3 
L1:      CLRF     CA1      ;BEGIN FOR ANOTHER DROP
         CLRF     CA2
         CLRF     CA3
L3:      CLRWDT
         MOVF     CA1,0    ;CA1,3 =8.8uS*17*8 = 1.196mS= 835Hz     
         ANDWF    SNDM,0 
         BTFSS    3,2
         GOTO     SNDON
         GOTO     SNDOFF
SNDON:   BSF      6,5         
         GOTO     L3.1
SNDOFF:  BCF      6,5
         NOP               ;TOTAL 9 CYC
L3.1:    INCFSZ   CA1,1    ;CA1=(CA1+1),IF=0, SKIP 
         GOTO     L5     
         CALL     MASK     ;DO SOUND MASK, RED LED
         BTFSS    5,1      ;START KEY,RESTART
         GOTO     START
         INCFSZ   CA2,1   
         GOTO     L5     
         BSF      6,6      ;ALARM ON,TIME OUT
         GOTO     START3   ;ERROR BEGIN OF CAL
L5:      BTFSS    5,0      ;STOP KEY
         GOTO     POWERON
         BTFSC    5,2      ;SENSER=0(ON),SKIP 
         GOTO     L3       ;TOTAL 17 CYC
         CALL     LED
         BCF      6,6      ;OFF ALARM 
         MOVLW    CALDROP  ;THE FIRST DROP?
         SUBWF    CDROP,0
         BTFSS    3,0      ;YES(=6)SKIP 
         GOTO     L7       ;NO 
         DECF     CDROP,1
         GOTO     L1       ;
L7:      MOVF     CA1,0    ;TOTAL TIME CB1-3
         ADDWF    CB1,1    ;ADD TO CB1
         BTFSS    3,0 
         GOTO     L8
         INCF     CB2,1
         BTFSC    3,2
         INCF     CB3,1    
L8:      MOVF     CA2,0   
         ADDWF    CB2,1    ;ADD TO CB2
         BTFSC    3,0 
         INCF     CB3,1    ;3,0
         DECFSZ   CDROP,1  ;IF 5 DROPS PASS, SKIP
         GOTO     L1      
         BCF      1F,5     ;END OF LEARNING                   
;--------------------------------------------------------------------------
L9:      BCF      3,0      ;C=0, 5X CB
         RRF      CB3,1    ;2.5X CB
         RRF      CB2,1
         RRF      CB1,1
         MOVF     CB1,0    
         MOVWF    CC1      ;2.5X CC 
         MOVWF    CD1      ;     CD
         MOVF     CB2,0   
         MOVWF    CC2
         MOVWF    CD2
         MOVF     CB3,0   
         MOVWF    CC3
         MOVWF    CD3
         BCF      3,0
         RRF      CB3,1    ;1.25X CB
         RRF      CB2,1
         RRF      CB1,1
         BCF      3,0
         RRF      CB3,1    ;0.625X CB
         RRF      CB2,1
         RRF      CB1,1
         MOVF     CB1,0    ;2.5X-0.625X= CD-CB= 1.875X =CD
         SUBWF    CD1,1
         BTFSC    3,0
         GOTO     L9.6     ;CD1>=CB1
         MOVF     CD2,0
         BTFSS    3,2      ;CD2=0 ?
         GOTO     L9.5
         DECF     CD3,1    ;=0, CD>>CB NOT CHECK 
L9.5:    DECF     CD2,1
L9.6:    MOVF     CB2,0
         SUBWF    CD2,1
         BTFSS    3,0
         DECF     CD3,1    
         BCF      6,0      ;OFF 6,0 LED, END OF CAL.   
;---------------------------- MONITOR --------------------------------------
M2:      MOVF     CC1,0    ;
         MOVWF    CA1      ;CA=CC =2.5X
         MOVF     CC2,0    ;
         MOVWF    CA2
         MOVF     CC3,0   
         MOVWF    CA3     
M3:      CLRWDT
         MOVF     CA1,0    ;CA1,3 =8.8uS*17*8 = 1.196mS= 835Hz     
         ANDWF    SNDM,0 
         BTFSS    3,2
         GOTO     SNDON1
         GOTO     SNDOFF1
SNDON1:  BSF      6,5         
         GOTO     M3.1
SNDOFF1: BCF      6,5
         NOP               ;TOTAL 9 CYC
M3.1:    DECFSZ   CA1,1    ;IF INIT CA1=0 MAKE A MISTAKE 38mS, DON'T CARE 
         GOTO     M5     
         CALL     MASK     ;DO 6,5 MASK,6,0 LED
         BTFSS    5,1      ;START KEY,RESTART
         GOTO     START
         MOVF     CA2,0    ;CA2=0?
         BTFSC    3,2      ;
         GOTO     M3.3     ;=0
         DECF     CA2,1    ;<>0
         GOTO     M5     
M3.3:    DECF     CA2,1
         MOVF     CA3,0
         BTFSC    3,2
         GOTO     ERR1     ;CA3=0, TIME OUT
         DECF     CA3,1
M5:      BTFSS    5,0      ;STOP KEY
         GOTO     POWERON
         BTFSC    5,2      ;SENSER=0(ON),SKIP 
         GOTO     M3       ;TOTAL 17 CYC
         CALL     LED
         BTFSS    1F,4     ;FLAGE=?
         GOTO     M11      ;0, GOTO M11
         BCF      1F,4     ;1,SKIP
         GOTO     M2
;----------------------------BEGIN FOR CALCULATE ---------------------------
M11:     MOVF     CA2,0    ;          
         SUBWF    CD2,0    ;                  CD2-CA2 >=0 -> CD3=0 -> CA3+1
         BTFSC    3,0      ;IF C=0(<),SKIP       V             V       
         GOTO     M12      ;                                        
         MOVF     CD3,0    ;=0?             -> CD3-CA3 >=0  -> ERR1
         BTFSC    3,2      ;                     V
         GOTO     ERR1     ;=0
         INCF     CA3,0    ;                     OK
         GOTO     M13      ;
M12:     MOVF     CA3,0    ;
M13:     SUBWF    CD3,0    ; 
         BTFSS    3,0      ;IF C=1(>=),SKIP
         GOTO     ERR1     ;
         BCF      6,6      ;ALARM OFF,NORMAL END OF MONITOR 
         BCF      6,7      ;
         GOTO     M2       ;
ERR1:    BTFSC    6,6    
         GOTO     M2
         MOVLW    ALTIME   ;SET ALARM2 TIMER =38mS*32= 1 SEC
         MOVWF    TIMER2
         BSF      6,6      ;ALARM ON
         BSF      6,7      ;ALARM2 ON
         BSF      1F,4     ;SET ERROR FLAGE
         GOTO     M2
 ;------------------------ LOW BATTERY   -----------------------------------
LOWBAT:  CLRF     PB       ;MAKE SURE OUTPUT LOW
         CALL     BEEP
LB1:     CLRWDT            ;6*8.8uS*256*256= 3 SEC
         BTFSS    5,0      ;STOP KEY
         GOTO     POWERON
         DECFSZ   CE2,1
         GOTO     LB1
         DECFSZ   CE1,1
         GOTO     LB1
         GOTO     LOWBAT

;---------------------------------------------------------------------------
         ORG      0D0 
BEEP:    CLRF     CE2      ;256/2 =128 PULSE
BP3:     MOVLW    20       ;PB,5 =SOUND 
         XORWF    PB,1     ;REVERSE SOUND
         MOVLW    0D       ;ON     
         MOVWF    CE1
BP5:     CLRWDT            ;4*15*8.8uS=1000Hz/2
         DECFSZ   CE1,1   
         GOTO     BP5
         DECFSZ   CE2,1
         GOTO     BP3
         BCF      PB,5     ;MAKE SURE SOUND OFF
         RETLW    0
;--------------------------------------------------------------------------
LED:     BTFSC    1F,7     ;LED ON 36mS
         BSF      6,2
         BTFSC    1F,6
         BSF      6,1
         MOVLW    4        ;9mS*4
         MOVWF    CE1
         CLRF     CE2
G1:      CLRWDT            ;4CYC*256*8.8uS=9mS
         DECFSZ   CE2,1
         GOTO     G1
         DECFSZ   CE1,1
         GOTO     G1
         BCF      6,2
         BCF      6,1
         INCF     CRUN,1   ;TIME COMPENSATION
         RETLW    0
;--------------------------------------------------------------------------
MASK:    INCF     CRUN,1   ;** INC CRUN; IF 6,6 ON THEN 6,0 ON/OFF (CRUN,4)
         BTFSS    6,6      ;** AND IF TIMER2=0 6,7 OFF ELSE TIMER2-1
         GOTO     S1       ;** AND IF FLAGY=0, SNDM = 04 (FOR CA1,2)
         MOVF     TIMER2,0 
         BTFSC    3,2      ;TIMER2 <> 0 SKIP
         GOTO     MA1
         DECF     TIMER2,1
         GOTO     MA3
MA1:     BCF      6,7      ;1 SEC, ALARM2 OFF
MA3:     MOVLW    10       ;6,0 MASK
         ANDWF    CRUN,0
         BTFSC    3,2      ;6,0 ON SKIP
         GOTO     S1       ;CRUN,4=0 6,0 OFF SNDM OFF
         BSF      6,0      ;RED ON
         BTFSC    1F,6     ;IF SILENT GOTO S3 ELSE SKIP
         GOTO     S3
         MOVLW    04       ;6,6 AND CRUN,4=1 6,0 ON SNDM ON
         MOVWF    SNDM     ;6,5 MASK =04 ON (CA1,2)
         GOTO     S3
S1:      CLRF     SNDM     ;SNDM OFF
         BTFSS    1F,5     ;1F,5=CAL=1,DON'T OFF 6,0
         BCF      6,0      ;6,0 OFF
S3:      RETLW    0
         END
