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

📄 hcs301滚动码遥控应用源程序.txt

📁 rerer huoir tywew opor oproer pokofig
💻 TXT
📖 第 1 页 / 共 3 页
字号:
                  ;------------------------------------------------------------------------------
                  EEREAD
                  MOVFW ADDRESS
                  MOVWF OUTBYT
                  BSF OUTBYT,7 ; COMMAND = READ
                  CALL SENDC ; SEND COMMAND
                  MOVLW RDCFG
                  TRIS PORTB ; DIO = INPUT
                  MOVLW 16D ; 16 BITS TO READ
                  MOVWF CNT1
                  READ0 BSF PORTB,CLK ; CLOCK HIGH
                  RLF TMP2,F ; SHIFT LO BYTE
                  BCF TMP2,0 ; ASSUME BIT WILL BE 1
                  BTFSC PORTB,DIO ; READ DIO LINE
                  BSF TMP2,0 ; COPY BIT TO REGISTER
                  BCF PORTB,CLK ; CLOCK LOW
                  RLF TMP1,F ; SHIFT HI BYTE
                  DECFSZ CNT1,F ; LOOP COUNTER
                  GOTO READ0
                  BCF PORTB,CS ; END READ CYCLE
                  RETLW 0H
                  ;------------------------------------------------------------------------------
                  ;
                  ; FUNCTION : DECRYPT () 
                  ;
                  ; DESCRIPTION : DECRYPTS 32 BIT [HOP1:HOP4] USING [CSR0:CSR7]
                  ;
                  ; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
                  ;
                  ;------------------------------------------------------------------------------

                  ; THE KEY USED IS A FIXED KEY WHICH IS NOT SERIAL NUMBER 
                  DEPENDANT
                  ; THE USER MUST CHOOSE A KEY AND CHANGE THE CODE HERE TO 
                  REFLECT THAT KEY
                  DECRYPT
                  MOVLW 0EFH ; LOAD FIXED 64 BIT KEY LSB 
                  MOVWF KEY0
                  MOVLW 0CDH
                  MOVWF KEY1
                  MOVLW 0ABH
                  MOVWF KEY2
                  MOVLW 089H
                  MOVWF KEY3
                  MOVLW 067H
                  MOVWF KEY4
                  MOVLW 045H
                  MOVWF KEY5
                  MOVLW 023H
                  MOVWF KEY6
                  MOVLW 01H ; LOAD FIXED 64 BIT KEY MSB
                  MOVWF KEY7
                  MOVLW 11+1 ; OUTER LOOP 11+1 TIMES 
                  MOVWF CNT1 ; OUTER LOOP 11+1 TIMES 
                  DECRYPT_OUTER
                  MOVLW 48 ; INNER LOOP 48 TIMES
                  MOVWF CNT0 ; INNER LOOP 48 TIMES
                  DECRYPT_INNER
                  CLRWDT ; RESET WATCHDOG TIMER
                  MOVFW CNT1 ; LAST 48 LOOPS RESTORE THE KEY
                  XORLW 1 ; LAST 48 LOOPS RESTORE THE KEY
                  SKPNZ ; LAST 48 LOOPS RESTORE THE KEY
                  GOTO ROTATE_KEY ; LAST 48 LOOPS RESTORE THE KEY
                  ; THE LOOKUP TABLE IS COMPRESSED INTO IN 4 BYTES TO SAVE SPACE
                  ; USE THE 3 LOW INDEX BITS TO MAKE UP AN 8-BIT BIT MASK
                  ; USE THE 2 HIGH INDEX BITS TO LOOK UP THE VALUE IN THE TABLE
                  ; USE THE BIT MASK TO ISOLATE THE CORRECT BIT IN THE BYTE
                  ; PART OF THE REASON FOR THIS SCHEME IS BECAUSE NORMAL TABLE 
                  LOOKUP
                  ; REQUIRES AN ADDITIONAL STACK LEVEL
                  CLRC ; CLEAR CARRY (FOR THE LEFT SHIFT)

                  MOVLW 1 ; INITIALISE MASK = 1
                  BTFSC HOP3,3 ; SHIFT MASK 4X IF BIT 2 SET
                  MOVLW 10000B ; SHIFT MASK 4X IF BIT 2 SET
                  MOVWF MASK ; INITIALISE MASK = 1
                  BTFSS HOP2,0 ; SHIFT MASK ANOTHER 2X IF BIT 1 SET
                  GOTO $+3
                  RLF MASK,F
                  RLF MASK,F 
                  BTFSC HOP1,0 ; SHIFT MASK ANOTHER 1X IF BIT 0 SET
                  RLF MASK,F
                  ; MASK HAS NOW BEEN SHIFTED 0-7 TIMES ACCORDING TO BITS 2:1:0
                  MOVLW 0 ; TABLE INDEX = 0
                  BTFSC HOP4,1
                  IORLW 2 ; IF BIT 3 SET ADD 2 TO THE TABLE INDEX
                  BTFSC HOP4,6
                  IORLW 4 ; IF BIT 4 SET ADD 4 TO THE TABLE INDEX
                  ADDWF PC,F ; ADD THE INDEX TO THE PROGRAM COUNTER
                  ; [ MUST BE IN LOWER HALF OF PAGE ]

                  TABLE
                  MOVLW 02EH ; BITS 4:3 WERE 00
                  GOTO TABLE_END ; END OF LOOKUP
                  MOVLW 074H ; BITS 4:3 WERE 01
                  GOTO TABLE_END ; END OF LOOKUP
                  MOVLW 05CH ; BITS 4:3 WERE 10
                  GOTO TABLE_END ; END OF LOOKUP
                  MOVLW 03AH ; BITS 4:3 WERE 11

                  TABLE_END
                  ANDWF MASK,F ; ISOLATE THE CORRECT BIT BY ANDING WITH MASK
                  MOVLW 0 ; COPY THE BIT TO BIT 7
                  SKPZ ; COPY THE BIT TO BIT 7
                  MOVLW 10000000B ; COPY THE BIT TO BIT 7
                  XORWF HOP2,W ; ONLY INTERESTED IN BIT HOP2,7
                  XORWF HOP4,W ; ONLY INTERESTED IN BIT HOP4,7
                  XORWF KEY1,W ; ONLY INTERESTED IN BIT KEYREG1,7
                  MOVWF MASK ; STORE W TEMPORARILY (WE NEED BIT 7)
                  RLF MASK,F ; LEFT ROTATE MASK TO GET BIT 7 INTO THE CARRY
                  RLF HOP1,F ; SHIFT IN THE NEW BIT
                  RLF HOP2,F
                  RLF HOP3,F
                  RLF HOP4,F
                  ROTATE_KEY
                  CLRC ; CLEAR CARRY
                  BTFSC KEY7,7 ; SET CARRY IF LEFTMOST BIT SET
                  SETC ; SET CARRY IF LEFTMOST BIT SET
                  RLF KEY0,F ; LEFT-ROTATE THE 64-BIT KEY 
                  RLF KEY1,F
                  RLF KEY2,F
                  RLF KEY3,F
                  RLF KEY4,F
                  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

⌨️ 快捷键说明

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