⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 滚动码应用原程序.txt

📁 单片机开发源代码集锦 31例
💻 TXT
📖 第 1 页 / 共 2 页
字号:
RLF KEY5,F
RLF KEY6,F
RLF KEY7,F 

DECFSZ CNT0,F ; INNER LOOP 48 TIMES
GOTO DECRYPT_INNER ; INNER LOOP 48 TIMES

DECFSZ CNT1,F ; OUTER LOOP 12 TIMES (11 + 1 TO RESTORE KEY)
GOTO DECRYPT_OUTER ; OUTER LOOP 12 TIMES (11 + 1 TO RESTORE KEY)

RETLW 0 ; RETURN 

;------------------------------------------------------------------------------
;
; FUNCTION : LOAD_CNT_VALS() 
;
; DESCRIPTION : LOAD COUNTERS INTO WRITE BUFFERS
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------

LOAD_CNT_VALS
MOVFW CNTR_HI ; LOAD MSB OF COUNTER
MOVWF TMP1
MOVFW CNTR_LW ; LOAD LSB OF COUNTER
MOVWF TMP2
RETLW 0

;------------------------------------------------------------------------------
;
; FUNCTION : RECEIVE() 
;
; DESCRIPTION : RECEPTION ROUTINE FOR PWM TRANSMISSIONS
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------

RECEIVE

;******** WAIT FOR HEADER AND CALIBRATE *******************

BTFSS PORTA,RFIN ; INPUT LOW?
GOTO RMT_0 ; YES; RECEIVE ERROR

MOVLW 10 ; 10 ms TIMER
MOVWF CNT1
RCV0
MOVLW 200
MOVWF CNT0
RCV1
BTFSS PORTA,RFIN ; [2] INPUT HIGH?
GOTO RCV2 ; [0] NO, JUMP OUT OF LOOP
DECFSZ CNT0,1 ; [1] YES, CONTINUE WITH TIMING LOOP
GOTO RCV1 ; [2] 5 us X CNT0
DECFSZ CNT1,1 ; [0] DO 1 ms LOOP CNT1 TIMES
GOTO RCV0 ; [0]

RCV2
CLRF CNT0 ; [1] CLEAR CALIB COUNTER LOW BYTE
CLRF CNT1 ; [1] CLEAR CALIB COUNTER HIGH BYTE

;*************************************************************************
; 2.5 IS AVERAGE FOR DETECTING FALLING EDGE IN RCV1
; 2 INSTRUCTIONS FOR JUMP OUT RCV1 TO RCV2
; 2 INSTRUCTIONS FOR RCV2 - CLEAR CALIBRATION COUNTER
; TOTAL 6.5 INSTRUCTIONS < 1 CALIBRATION LOOP SO DISCARD
;*************************************************************************

RCV3
BTFSC PORTA,RFIN ; [2][2] INPUT HIGH?
GOTO RCV6 ; [0][0] YES--END CALIBRATION
INCF CNT0,1 ; [1] INCREMENT 16BIT COUNTER 
SKPNZ ; [2]
INCF CNT1,1 ; [0]
CLRWDT ; [1] RESET WATCH DOG TIMER
NOP ; [1]
BTFSS CNT1,3 ; [1]
GOTO RCV3 ; [2]
GOTO RMT_0 ; [0]
; TOTAL = 10

RCV6
CLRC ; [1] DIVIDE CNT1:CNT0 BY 8 (600/8=75)
RRF CNT1,1 ; [1]
RRF CNT0,1 ; [1]
RRF CNT1,1 ; [1]
RRF CNT0,1 ; [1]
RRF CNT1,1 ; [1]
RRF CNT0,1 ; [1] 

MOVLW MIN/80 ; [1]
SUBWF CNT0,W ; [1]
BTFSS STATUS,C ; [2] NEGATIVE?
GOTO RMT_0 ; [0] YES--HEADER SHORTER THAN MIN.
; TOTAL = 11
; ************* VALID HEADER RECEIVED *********************
RCV7
MOVLW NBITS ; [1] VALID START MARKER WAS RECEIVED
MOVWF CNT1 ; [1]
MOVF CNT0,W ; [1]
MOVWF CNT2 ; [1] CNT2 = CNT0
MOVLW 6H ; [1] SEE NOTE BELOW
SUBWF CNT2,1 ; [1]
GOTO DL1 ; [2] COMPENSATE FOR FIRST BIT
; TOTAL = 8

;**********************************************************************************
; 2.5 IS AVERAGE PLAY BETWEEN RISING EDGE AND JUMP OUT OF CALIBRATION LOOP.
; 2 FOR JUMP OUT OF RCV3 TO RCV6
; 11 INSTRUCTIONS FOR RVC6 - CAIBRATION COUNTER DIVIDE
; 8 INSTRUCTIONS FOR RCV7 - COMPENSATE FOR POST CALIBRATION CALCUATIONS
; TOTAL 22.5 INSTRUCTIONS BETWEEN RISING EDGE AND ENTERING DL1
; THEREFORE SUBTRACT 22.5/4 = 5.625 TO COMPENSATE FOR POST CALCULATION ON 1ST BIT
;**********************************************************************************

RCV8 
MOVLW 4H ; [1] WAIT A MAXIMUM OF 4 Te
MOVWF TMP_CNT ; [1] SET TEMP LOOP COUNTER

RCV10A
MOVFW CNT0 ; [1] and CSR processing
MOVWF CNT2 ; [1] Refer to explanation above

RCV10B
BTFSC PORTA,RFIN ; [2] Wait for rising edge
GOTO RCV11 ; [0] Edge found--Process
CLRWDT ; [1] Clear watchdog Timer
BTFSC PORTA,RFIN ; [2] Wait for Next rising edge
GOTO RCV11 ; [0] Edge found--Process
DECFSZ CNT2,1 ; [1] Decrement Timeout counter
GOTO RCV10B ; [2] Loop Back
; TOTAL = 8, RFIN CHECKED EVERY 4uS ON AVERAGE

DECFSZ TMP_CNT,1 ; [1] ALL Te PERIODS
GOTO RCV10A ; [2] ... NO, THEN WAIT FOR NEXT ONE
GOTO RMT01 ; [0] ... YES, [0] TIMEOUT--no edge found

RCV11
MOVLW 3H ; [1] SEE NOTE BELOW
SUBWF CNT0,W ; [1]
MOVWF CNT2 ; [1]

;*************************************************************************
; 2 SETUP OF TEMP LOOP COUNTER ( ONLY ONCE )
; 2 SETUP TE LOOP COUNTER ( MAX 4 )
; 3 DECREMENT TEMP LOOP COUNTER ( MAX 4 )
; 4 IS THE AVERAGE PLAY BETWEEN EDGE AND EDJE BEING DETECTED IN RCV9
; 2 JUMP OUT OF RCV10B TO RCV11
; 3 FOR RCV11
; TOTAL 10 INSTRUCTIONS BETWEEN EDGE AND ENTERING DL1
; THEREFORE SUBTRACT 10/4 = 2.5 => 3 DL1 LOOPS TO COMPENSATE FOR 
;*************************************************************************

DL1
CLRWDT ; [1] RESET WATCHDOG TIMER
DECFSZ CNT2,1 ; [1] [2, IF SKIP]
GOTO DL1 ; [2] CNT0 X 4 us

SAMPLE1
BTFSS PORTA,RFIN ; [2] INPUT HIGH? FIRST SAMPLE
GOTO RMT01 ; [0] NO--ERROR

MOVF CNT0,W ; [1] CALIBRATION COUNTER
MOVWF CNT2 ; [1] (NOMINALLY 75 FOR 300 us PULSE)
DECF CNT2,1 ; [1] SUBTRACT 2 FROM FINAL CALIB COUNTER TO COMPENATE FOR THIS
GOTO $+1 ; [2]
NOP ; [1]
; TOTAL = 8 => 1 LOOP COUNTER
DL2
CLRWDT ; [1] RESET WATCHDOG TIMER
GOTO $+1 ; [2] WASTE TIME
GOTO $+1 ; [2] WASTE TIME
DECFSZ CNT2,1 ; [1]
GOTO DL2 ; [2] CNT0 X 8 us [ CNT0 x Te ]

SAMPLE2
BCF FLAGS,BITIN ; [1] CLEAR BIT POSITION
BTFSS PORTA,RFIN ; [1.5] LEAVE 0 IF LINE HIGH
BSF FLAGS,BITIN ; [0.5] MAKE 1 IF LINE LOW
; SUB TOTAL = 3 CYCLES

CALL ROT_SHIFT ; [11]+[2] CSR SHIFT + CALL
BCF CSR7,7 ; [1]
BTFSC FLAGS,BITIN ; [1.5]
BSF CSR7,7 ; [0.5]
; SUB TOTAL = 16 CYCLES


MOVF CNT0,W ; [1] CALIBRATION COUNTER
MOVWF CNT2 ; [1] (NOMINALLY 75 FOR 300 us PULSE)
MOVLW 3 ; [1] SEE CALCULATION BELOW
SUBWF CNT2,1 ; [1]
NOP ; [1]
; SUB TOTAL = 5 CYCLE
; TOTAL = 24 => 24/8 = 3 LOOP COUNTERS

;*************************************************************************
; TOTAL = 24 INSTRUCTIONS
; SUBTRACT 24/8 = 3 TO COMPESATE FOR UPDATEING CSR AND OTHER PROCESSING 
; AFTER DATA SAMPLE IS TAKEN.
;*************************************************************************

DL3
GOTO $+1 ; [2] WASTE TIME
GOTO $+1 ; [2] WASTE TIME
CLRWDT ; [1] RESET WATCHDOG TIMER
DECFSZ CNT2,1 ; [1]
GOTO DL3 ; [2] CNT0 X 8 us [ CNT0 X Te ]

SAMPLE3
BTFSC PORTA,RFIN ; [2] INPUT LOW? THIRD SAMPLE
GOTO RMT0 ; [0] NO--RECEIVE ERROR

CALL TST_RTCC ; [11] CHECK RTCC

DECFSZ CNT1,1 ; [1] LAST BIT?
GOTO RCV8 ; [2] ... NO, GET NEXT BIT
GOTO RMT1 ; TOTAL = 14 CYCLES


RMT_0
RMT0 
RMT01 BSF STATUS,C ; INVALID TRANSMISSION
RETLW 1 ; RETURN

RMT1 BSF PORTA,LED ; VALID TRANSMISSION FORMAT, LED ON
MOVLW 0FH ; FORCE OPEN BUTTON CODES TO ZERO
ANDWF SER_0,1
CLRC ; VALID SERIAL NUMBER => VALID TX
RETLW 0 ; RETURN 

;------------------------------------------------------------------------------
;
; FUNCTION : M_LOOP () 
;
; DESCRIPTION : MAIN PROGRAM ROUTINE
;
;------------------------------------------------------------------------------

M_LOOP BCF PORTA,LED 
BTFSS PORTA,LRN 
GOTO LEARN ; TEST & HANDLE LEARN BUTTON
CALL TST_RTCC ; UPDATE TIMER 
CALL TST_TIMER ; HANDLE TIMER - UPDATE OUTPUTS
CALL RECEIVE ; RECEIVE TRANSMISSION 
BC M_LOOP ; CHECK IF TRANSMISSION VALID

M_SEARCH
CLRF TXNUM ; TEST FIRST POSITION
; ******* COMPARE LOWER WORD OF SERIAL NUMBER ********
M_SERIAL
CALL TX_LOOKUP ; GET TX BASE ADDRESS
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
CALL EEREAD ; READ LOWER 16-BITS OF SER# FROM EEPROM

MOVFW TMP1 ; COMPARE RX AND EEPROM VALUES
XORWF SER_2,W
BNZ M_NEXT ; IF NOT EQUAL CHECK NEXT
MOVFW TMP2 ; COMPARE RX AND EEPROM VALUES
XORWF SER_3,W
BNZ M_NEXT ; IF NOT EQUAL CHECK NEXT

; ******* COMPARE UPPER WORD OF SERIAL NUMBER ********
M_SERIAL2
INCF ADDRESS,F ; POINT TO NEXT ENTRY 
CALL EEREAD ; READ UPPER 16-BITS OF SER# FROM EEPROM

MOVFW TMP1 ; COMPARE RX AND EEPROM VALUES
XORWF SER_0,W
BNZ M_NEXT ; IF NOT EQUAL CHECK NEXT

MOVFW TMP2 ; COMPARE RX AND EEPROM VALUES
XORWF SER_1,W
BNZ M_NEXT ; IF NOT EQUAL CHECK NEXT

BTFSS FLAGS,LRNF ; LEARN MODE
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 
CALL SENDC ; SEND COMMAND TO EEPROM
MOVLW 20H ; ERASE ALL COMMAND
MOVWF OUTBYT 
CALL SENDC ; SEND COMMAND TO EEPROM
CALL WAITACK ; WAIT FOR ERASE ACK
GOTO RESET ; START OVER

LEARN2
BCF PORTA,LED ; CLEAR LED
BSF FLAGS,LRNF ; SET LEARN FLAG

LEARN3
CALL TST_RTCC ; UPDATE TIMER
CALL TST_TIMER ; CHECK FOR LEARN TIMEOUT
CALL RECEIVE ; RECEIVE TRANSMISSION 
BC LEARN3 ; CHECK IF TRANSMISSION VALID
GOTO M_SEARCH ; CHECK IF SERIAL NUMBER IS IN MAP

LEARN_NF

; *** IF SERIAL NOT IN MAP READ SELFLEARN POINTER ***

MOVLW LRNPTR ; POINT TO LEARN POINTER
MOVWF ADDRESS
CALL EEREAD ; READ LEARN POINTER FROM EEPROM

MOVF TMP2,W ; CHECK LOWER BYTE
MOVLW 0H ; LOAD 0 DEFAULT
BTFSC STATUS,Z ; IF LOWER != 0 LEARN ON 0
MOVF TMP1,W ; ELSE LEARN ON TMP1 VALUE
MOVWF TXNUM ; LOAD TXNUM

LEARN_F
CALL TX_LOOKUP
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
MOVFW SER_2 ; GET LOWER 16 BIT OF SERIAL NUMBER
MOVWF TMP1
MOVFW SER_3
MOVWF TMP2
CALL EEWRITE ; ... AND WRITE TO EEPROM

MOVFW SER_0 ; GET UPPER 16 BIT OF SERIAL NUMBER
MOVWF TMP1
MOVFW SER_1
MOVWF TMP2
CALL EEWRITE ; ... AND WRITE TO EEPROM

; *** DECRYPT HOP CODE ***

LEARN_DEC
CALL DECRYPT ; DECRYPTION ROUTINE

; *** CHECK DISCRIMINATION VALUE ***

LEARN_CHK
MOVFW SER_3 ; CHECK LOWER BYTE OF SERIAL NUMBER
XORWF DISC,W ; AGAINST DISCRIMINATION VALUE
BZ LEARN_UP ; UPDATE LEARN POINTER
GOTO CANCEL_LEARN ; ERROR CANCEL LEARN MODE

; ********* UPDATE LEARN POINTER **********
LEARN_UP
CALL TX_LOOKUP ; GET CURRENT TX BASE ADDRESS
CALL LOAD_CNT_VALS
CALL EEWRITE ; WRITE LSB WORD OF COUNTER TO EEPROM

BTFSC FLAGS,RELEARN ; IF RELEARN
GOTO BYPASS_POINTER_WRITE ; DONT UPDATE POINTER

INCF TXNUM,F ; INCREMENT LEARN POINTER 
MOVLW MAX_USERS ; ALLOW 0 .. MAX_USERS - 1
SUBWF TXNUM,W 
MOVLW 0H ; IF MAX WRAP TO 0
BTFSS STATUS,C
MOVF TXNUM,W ; ELSE USE TXNUM
MOVWF TMP1 ; FOR WRITE OPERATION

CLRF TMP2 ; CLEAR LOWER BYTE

MOVLW LRNPTR ; POINT TO LEARN POINTER
MOVWF ADDRESS
CALL EEWRITE ; UPDATE LEARN POINTER IN EEPROM

BYPASS_POINTER_WRITE

BSF PORTA,LED ; LED ON TO INDICATE VALID LEARN

CLRF CNT_LW ; CLEAR COUNTER LOW BYTE

SUCCESS
CALL TST_RTCC ; INDICATE SUCCESSFUL LEARN
BTFSS CNT_LW,4 ; LED ON FOR 0.5 SEC
GOTO SUCCESS ; LOOP BACK

CANCEL_LEARN
BCF FLAGS,LRNF ; CLEAR LEARN FLAG
BCF FLAGS,RELEARN ; CLEAR RELEARN FLAG
GOTO M_LOOP ; RETURN TO MAIN LOOP - LED OFF

;------------------------------------------------------------------------------
; END OF FILE : SIMDEC10.ASM
;------------------------------------------------------------------------------

ORG 1FFH
GOTO RESET
END
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -