GOTO M_HOP ; FOUND TRANSMITTER - DECRYPT
BSF FLAGS,RELEARN ; SET RELEARN FLAG
GOTO LEARN_F ; FOUND TRANSMITTER - LEARN
; **** SEARCH NEXT POSITION FOR SERIAL NUMBER *****
M_NEXT INCF TXNUM,F ; POINT TO NEXT TRANSMITTER POSITION
MOVLW MAX_USERS ; TEST FOR LAST POSITION
SUBWF TXNUM,W
BTFSS STATUS,C ; NOT FOUND IN MAP
GOTO M_SERIAL ; TRY NEXT POSITION
M_NF
BTFSS FLAGS,LRNF ; LEARN MODE
GOTO M_LOOP ; NO... INVALID SERIAL NUMBER
GOTO LEARN_NF ; NEW TRANSMITTER - USE POINTER FOR LEARN
; ********** DECRYPT HOPCODE *********************
M_HOP
CALL DECRYPT ; DECRYPT HOPCODE
; ********* TEST DICRIMINATION VALUE *************
M_DIS MOVFW SER_3 ; SERIAL NUBER LSB MUST BE EQUAL
XORWF DISC,W ; TO DISCRIMINATION VALUE
BNZ M_LOOP
; *************** CHECK COUNTERS VALID ************
BCF FLAGS,SEC_CNT ; CHECK FIRST COUNTER
M_CNT CALL TX_LOOKUP ; POINT LOWER 16 BIT COUNTER
BTFSC FLAGS,SEC_CNT ; IF SECOND COUNTER IS USED
INCF ADDRESS,F ; INCREMENT ADDRESS
CALL EEREAD ; READ LOWER 16 BIT COUNTER FROM EEPROM
; ************ CHECK COUNTER WINDOWS ***********
M_SUB
MOVFW TMP2 ; 16 BIT COUNTER SUBSTRACTION
SUBWF CNTR_LW,W
MOVWF TMP2
SKPC ; SKIP IF NO BORROW
INCF TMP1,F ; ... ELSE INCR HI BYTE
MOVFW TMP1
SUBWF CNTR_HI,W
MOVWF TMP1
BCF TMP1,0 ; MAKE ACCEPTED WINDOW 512
M_CHECK0
MOVFW TMP1 ; TEST IF IN WINDOW ( UPPER BYTE )
BTFSC STATUS,Z
GOTO M_CHECK2 ; GO AND CHECK LOWER BYTE
BTFSC FLAGS,SEC_CNT ; IF SECOND COUNTER
GOTO M_LOOP ; ERROR - GOTO MAIN LOOP
BSF FLAGS,SEC_CNT ; SET FLAG FOR SECOND COUNTER CHECK
GOTO M_CNT ; AND CHECK IT
M_CHECK2
MOVFW TMP2 ; CHECK LOWER BYTE
BZ M_TZERO ; IF REPEAT - RESET TIMEOUT COUNTER
; ************ UPDATE EEPROM COUNTER ***********
M_UPDATE
CALL TX_LOOKUP ; GET CURRENT TX BASE ADDRESS
CALL LOAD_CNT_VALS ; LOAD COUNTER VALUES
CALL EEWRITE ; UPDATE FIRST COUNTER
CALL LOAD_CNT_VALS ; LOAD COUNTER VALUES
CALL EEWRITE ; UPDATE SECOND COUNTER
; ******** UPDATE OUTPUT WITH CURRENT BUTTON CODE ********
M_OUTPUT
MOVLW 0F0H ; MASK ONLY BUTTON CODES
ANDWF FUNC,1
SWAPF FUNC,1 ; GET BUTTON CODE FROM FUNC BYTE
BTFSC FUNC,0 ; CHANGE BUTTON TO S-OUTPUT FORMAT
BSF FUNC,4 ; [ S2 S1 S0 S3 ]
CLRC
RRF FUNC,W
M_OUTPUT1
MOVWF PORTB ; UPDATE PORT WITH FUNCTION CODE
M_TZERO CLRF CNT_HI ; RESET RTCC CLOCK
CLRF CNT_LW
M_END
GOTO M_LOOP ; WAIT FOR NEXT TRANMISSION
;------------------------------------------------------------------------------
;
; FUNCTION : LEARN ()
;
; DESCRIPTION : LEARN ROUTINE
;
;------------------------------------------------------------------------------
LEARN
CLRF CNT_LW ; RESET TIMER
CLRF CNT_HI
LEARN1 BSF PORTA,LED ; LED ON
CALL TST_RTCC ; UPDATE TIMER
BTFSC PORTA,LRN ; TEST FOR BUTTON RELEASE
GOTO LEARN2 ; ENTER LEARN MODE
BTFSS CNT_HI,0 ; TEST FOR ERASE ALL
GOTO LEARN1 ; LOOP BACK
; ******* EEPROM ERASE ALL ******************
BCF PORTA,LED
ERASE_ALL
CLRWDT ; CLEAR WATCHDOG TIMER
BTFSS PORTA,LRN ; WAIT FOR BUTTON RELEASE
GOTO ERASE_ALL ; LOOP BACK
MOVLW 30H ; ERASE ENABLE COMMAND
MOVWF OUTBYT
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.

