HCS300滚动码遥控程序

list p=16F630
#include
#include "1029CA.INC"

errorlevel -302,-203
;#########配置字赋值,烧芯片时无需再设置;332c(MCLR内部复位,RA3数字输入口)
__CONFIG _CPD_OFF & _CP & _BODEN & _MCLRE_ON & _PWRTE_ON & _WDT_ON & _INTRC_OSC_NOCLKOUT

;******************************************************************************
;
; 1------------\/------------14
; +5V ---|VDD VSS|--- SGND
; 2| |13
; LEARN ---|RA5 P RA0|--- MOPEN
; 3| I |12
; ---|RA4 C RA1|---
; 4| 1 |11
; Vpp ---|MCLR 6 RA2|--- RFIN
; 5| F |10
; ---|RC5 6 RC0|---
; 6| 3 |9
; ---|RC4 0 RC1|---
; 7| |8
; LOCK ---|RC3 RC2|--- UNLOCK
; --------------------------
;
;******************************************************************************
;******USER DEFINITIONS******
MAX_USERS EQU 2
; This is the maximum number of transmitters that the system is able to
; learn (1 to 15).
;------------------------------------------------------------------------------

; GENERAL PURPOSE REGISTERS

IND EQU 00H ; INDIRECT ADDRESS REGISTER
RTCC EQU 01H ; REAL TIME COUNTER CLOCK
;PORTC EQU 07H ; PORT C

; USER DEFINED REGISTER

FLAGS EQU 37H ; USER FLAG REGISTER
ADDRESS EQU 38H ; ADDRESS REGISTER
TXNUM EQU 39H ; CURRENT TX
OUTBYT EQU 3AH ; GENERAL DATA REGISTER
MASK EQU OUTBYT ; MASK REGISTER USED IN DECRYPTION
TMP_CNT EQU OUTBYT ; TEMPORARY COUNTER

; COUNTER REGISTERS

CNT0 EQU 3BH ; LOOP COUNTERS
CNT1 EQU 3CH
CNT2 EQU 3DH

CNT_HI EQU 3EH ; 16 BIT CLOCK COUNTER
CNT_LW EQU 3FH

; CIRCULAR BUFFER REGISTER

CSR0 EQU 40H ; 64 BIT RECEIVE SHIFT REGISTER
CSR1 EQU 41H
CSR2 EQU 42H
CSR3 EQU 43H
CSR4 EQU 44H
CSR5 EQU 45H
CSR6 EQU 46H
CSR7 EQU 47H

; TEMP REGISTERS
TMP1 EQU 48H ; TEMP REGISTER FOR READ AND WRITE
TMP2 EQU 49H ; TEMP REGISTER FOR READ AND WRITE
REG EQU 4AH ; NOT USED
REG1 EQU 4BH ; NOT USED

KEY0 EQU 4CH ; 64 BIT KEY SHIFT REGISTER
KEY1 EQU 4DH
KEY2 EQU 4EH
KEY3 EQU 4FH
KEY4 EQU CNT2
KEY5 EQU CSR5
KEY6 EQU CSR6
KEY7 EQU CSR7

tmpBuff EQU 50H
tmpBuff1 EQU 51H
tmpBuff2 EQU 52H

; ***** USER REGISTER RE-MAPPINGS ***************

HOP1 EQU CSR0 ; 32 BIT HOPCODE REGISTER
HOP2 EQU CSR1
HOP3 EQU CSR2
HOP4 EQU CSR3

; RECEIVED TRANSMISSION OPEN 32 BITS

SER_0 EQU

CSR7 ; 28 BIT SERIAL NUMBER
SER_1 EQU CSR6
SER_2 EQU CSR5
SER_3 EQU CSR4

; RECEIVED TRANSMISSION ENCRYPTED 32 BITS

FUNC EQU CSR3 ; BUTTON CODE & USER BIT FUNCTION BYTE
DISC EQU CSR2 ; DISCRIMINATION VALUE
CNTR_HI EQU CSR1 ; 16 BIT RX COUNTER HIGH BYTE
CNTR_LW EQU CSR0 ; 16 BIT RX COUNTER LOW BYTE

; ********* EEPROM MEMORY *******
LRNPTR EQU 01H ; LEARN POINTER

; ********* PORTA BIT DEFINITIONS *******

RES0 EQU 0H ; RESERVED PIN
LRN EQU 5H ; LEARN BUTTON
LED EQU 3H ; LEARN INDICATOR LED OUTPUT - VALID SIGNAL
LED2 EQU 2H

; ********* PORTC BIT DEFINITIONS *******

S0 EQU 0H ; S0 OUTPUT
S1 EQU 1H ; S1 OUTPUT
S2 EQU 2H ; S2 OUTPUT
S3 EQU 3H ; S3 OUTPUT

DIO EQU 4H ; EEPROM DATA LINE
CLK EQU 5H ; EEPROM SERIAL CLOCK
CS EQU 6H ; EEPROM CHIP SELECT
RES1 EQU 7H ; RESERVED PIN

; ********* COMPILER DEFINES ******************
NBITS EQU 40H ; MAXIMUM TRANSMISSION BIT LENGTH 即64位
MIN EQU 560 ; TRANSMISSION HEADER MINIMUM LENGTH [鍿]
;TRISA EQU 0111B ; PORTA: TRI-STATE VALUE
WRCFG EQU 00000000B ; PORTC: EEPROM WRITE TRI-STATE VALUE
RDCFG EQU 00010000B ; PORTC: EEPROM READ TRI-STATE VALUE

;****** FLAGS DEFINITIONS **************
BITIN EQU 0H ; RF BIT VALUE
LRNF EQU 1H ; LEARN FLAG
SEC_CNT EQU 2H ; SECOND COUNTER IS BEING CHECKED
RELEARN EQU 3H ; RELEARNING A TRANSMITTER

;****** STATUS REGISTER BIT DEFINITIONS *****************
C EQU 0 ; CARRY
DC EQU 1 ; DIGIT CARRY
Z EQU 2 ; ZERO
PD EQU 3 ; POWER DOWN
TO EQU 4 ; TIMEOUT
PA0 EQU 5 ; NOT USED
PA1 EQU 6 ; NOT USED


;******************************************************************************
RESET_VECTOR CODE 0x0000
goto Start
MainProg CODE
;******************************************************************************
;Start of main program
;******************************************************************************

Start
RESET
;------------------------------------------------------------------------------
bsf STATUS,RP0 ;BANK1
;######### setup for OPTION_REG
movlw b'10000111'
movwf OPTION_REG ;
;######### 定义1区I/O口寄存器########
clrf PIE1
clrf WPUA
clrf IOCA
clrf INTCON ;允许外设中断
;######### 定义0区I/O寄存器口########
bcf STATUS,RP0 ;BANK0
clrf PIR1
clrf T1CON
movlw b'00000111'
movwf CMCON
movlw b'11111111'
movwf PORTA
movlw b'00000000'
movwf PORTC

bsf STATUS,RP0 ;BANK1
movlw b'00101111'
movwf TRISA ;PORTA 为输入
movlw b'00000000'
movwf TRISC ;PORTC 为输出
bcf STATUS,RP0 ;BANK0
CLRF FLAGS ; RESET FLAGS

CLRF CNT_LW ; RESET TIMER
CLRF CNT_HI
BTFSC MOPEN
BSF FLAGS,SEC_CNT
BTFSS MOPEN
BCF FLAGS,SEC_CNT

GOTO M_LOOP ; GOTO MAIN PROGRAM LOOP



;------------------------------------------------------------------------------
;
; FUNCTION : MOTO()
;
; DESCRIPTION :手动开关门
;
; NOTE :
;
;------------------------------------------------------------------------------
MOTO
BTFSC MOPEN
GOTO MOTO_H
MOTO_L
BTFSS FLAGS,SEC_CNT
RETLW 0
bcf STATUS,RP1
bcf STATUS,RP0 ;BANK0
BSF PORTC,LED2
CALL Delay250ms
CALL Delay250ms
BCF PORTC,LED2
BCF FLAGS,SEC_CNT
RETLW 0
MOTO_H
BTFSC FLAGS,SEC_CNT
RETLW 0
bcf STATUS,RP1
bcf STATUS,RP0 ;BANK0
BSF PORTC,LED
CALL Delay250ms
CALL Delay250ms
BCF PORTC,LED
BSF FLAGS,SEC_CNT
RETLW 0
;------------------------------------------------------------------------------
;
; FUNCTION : ROT_SHIFT()
;
; DESCRIPTION : RIGHT ROTATE 64 BIT RECEIVE SHIFT REGISTER
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------

ROT_SHIFT
RRF CSR7,F
RRF CSR6,F
RRF CSR5,F
RRF CSR4,F
RRF CSR3,F
RRF CSR2,F
RRF CSR1,F
RRF CSR0,F
RETLW 0

;------------------------------------------------------------------------------
;
; FUNCTION : TX_LOOKUP ()
;
; DESCRIPTION : TRANSMITTER ADDRESS CALCULATION
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------

TX_LOOKUP
MOVF TXNUM,W ; USE TRANSMITTER NUMBER TO CALCULATE
MOVWF ADDRESS ; ADDRESS OF TRANSMITER BLOCK
CLRC ; MULTIPLY BY 8
RLF ADDRESS,F
RLF ADDRESS,F
RLF ADDRESS,F

MOVLW 08H ; AND ADD 8
ADDWF ADDRESS,F
RETLW 0 ; RETURN


;------------------------------------------------------------------------------
;
; FUNCTION : TST_RTCC ()
;
; DESCRIPTION : UPDATE RTCC COUNTER
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------
TST_RTCC
CLRWDT ; RESET WATCHDOG TIMER
BTFSS RTCC,7 ; TEST FOR 32MS TIMEOUT ON RTCC MSB
RETLW 0 ; ... DO QUICK RETURN TO RECEIVE ROUTINE

; **** INCREASE 16 BIT CLOCK TIMER *******

BCF RTCC,7 ; CLEAR MSB OF RTCC
INCF CNT_LW,F ; INCREASE 16 COUNTER
SKPNZ ; INCREASE UPPER BYTE IF ZERO ( OVERFLOW )
INCF CNT_HI,F
RETLW 0

;------------------------------------------------------------------------------
;
; FUNCTION : TST_TIMER()
;
; DESCRIPTION : TEST 32MS TIMER AND UPDATE OUTPUTS IF REQUIRED
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;---------------------------------------------------

---------------------------

TST_TIMER
; ***** TEST FOR 500 MS TIMEMOUT ON OUTPUTS **********
BTFSS CNT_LW,4 ; TEST FOR 500 MS TIMEOUT
GOTO TST_30 ; ... IF NOT TEST 30S TIMEOUT

MOVLW 0F0H
ANDWF PORTC,F ; DOWN ALL PULSE OUTPUTS

; ********* TEST FOR 30 S LEARN TIMEOUT *************
TST_30
BTFSS FLAGS,LRNF
GOTO TST_END

BTFSC CNT_HI,2 ; TEST FOR LEARN TIMEOUT
GOTO RESET ; ... IF LEARN TIMEMOUT FORCE SOFT RESET

TST_END
RETLW 0H

;------------------------------------------------------------------------------
;
; FUNCTION : EEWRITE ()
;
; DESCRIPTION : WRITE 16 BIT VALUE TO EEPROM
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;例子:
; 写数据到EE的00H、01H单元内容,00H放TMP2的值,01H放TMP1的值
; BCF STATUS,RP0 ;BANK0
; MOVLW 00H
; MOVWF ADDRESS
; MOVLW 0F0H
; MOVWF TMP2 ;低位
; MOVLW 0FH
; MOVWF TMP1 ;高位
; CALL EEWRITE
;------------------------------------------------------------------------------

EEWRITE
;入:任意体
;出:体0
; ******* EEPROM WRITE ENABLE ******************
BCF STATUS,RP0 ;BANK0
MOVFW ADDRESS ; GET EEPROM ADDRESS
BSF STATUS,RP0 ;BANK1
MOVWF EEADR ;要写入EE的地址为ADDRESS

;************** 写TMP2低位 *******************
MOVFW TMP2
MOVWF EEDATA

CALL WRITE_EE ; SEND COMMAND TO EEPROM

;************** 写TMP1高位 *******************
BCF STATUS,RP0 ;BANK0
INCF ADDRESS
MOVFW ADDRESS ; GET EEPROM ADDRESS
BSF STATUS,RP0 ;BANK1
MOVWF EEADR ;要写入EE的地址为ADDRESS

MOVFW TMP1
MOVWF EEDATA

CALL WRITE_EE ; SEND COMMAND TO EEPROM

BCF STATUS,RP0 ;BANK0
INCF ADDRESS,F ; POINT TO NEXT EEPROM ADDRESS ( BY DEFAULT )

BCF STATUS,RP0 ;BANK0

RETLW 0H


;######### 写EE子程序 入:任意体 出为:体0 #########

WRITE_EE ;
clrwdt ;
bcf STATUS,RP0 ;BANK0
bcf PIR1,EEIF ;
bsf STATUS,RP0 ;BANK1
btfsc EECON1,WR ;上次写周期是否完成
goto $-.1 ;
bsf EECON1,WREN ;写使能
movlw 55H ;
movwf EECON2 ;
movlw 0AAH ;
movwf EECON2 ;
bsf EECON1,WR ;
bcf EECON1,WREN ;写禁止
bcf STATUS,RP0 ;BANK0
clrwdt ;
btfss PIR1,EEIF ;等待EE写完成
goto $-.3 ;
bcf PIR1,EEIF ;
bcf STATUS,RP0 ;BANK0
return ;
;------------------------------------------------------------------------------
;
; FUNCTION : EEREAD ()
;
; DESCRIPTION : READ 16 BIT VALUE FROM EEPROM
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;例子:
; 读00H、01H单元内容,结果:00H单元内容TMP0,01H单元内容放TMP1
; BCF STATUS,RP0 ;BANK0
; MOVLW 00H
; MOVWF ADDRESS
; CALL EEREAD
;------------------------------------------------------------------------------

EEREAD
CLRWDT


BCF STATUS,RP0 ;体0
MOVFW ADDRESS
BSF STATUS,RP0 ;体1
MOVWF EEADR
CLRWDT
BSF EECON1,RD
MOVFW EEDATA
BCF STATUS,RP0 ;体0
MOVWF TMP2 ;TMP2---低位

CLRWDT
BCF STATUS,RP0 ;体0
INCF ADDRESS
MOVFW ADDRESS
BSF STATUS,RP0 ;体1
MOVWF EEADR
CLRWDT
BSF EECON1,RD
MOVFW EEDATA
BCF STATUS,RP0 ;体0
MOVWF TMP1 ;TEP1---高位

CLRWDT
BCF STATUS,RP0 ;体0
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 89H
MOVWF KEY3
MOVLW 67H
MOVWF KEY4
MOVLW 45H
MOVWF KEY5
MOVLW 23H
MOVWF KEY6
MOVLW 01H ; LOAD FIXED 64 BIT KEY MSB
MOVWF KEY7

MOVLW 0CH ; OUTER LOOP 11+1 TIMES
MOVWF CNT1 ; OUTER LOOP 11+1 TIMES

DECRYPT_OUTER
MOVLW 30H ; 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 01H ; LAST 48 LOOPS RESTORE THE KEY
SKPNZ ; LAST 48 LOOPS RESTORE THE KEY
GOTO ROTATE_KEY ; LAST 48 LOOPS RESTORE THE KEY

CLRC ; CLEAR CARRY (FOR THE LEFT SHIFT)

MOVLW 01H ; INITIALISE MASK = 1
BTFSC HOP3,3 ; SHIFT MASK 4X IF BIT 2 SET
MOVLW 10H ; 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
RLF MASK

BTFSC HOP1,0 ; SHIFT MASK ANOTHER 1X IF BIT 0 SET
RLF MASK

; MASK HAS NOW BEEN SHIFTED 0-7 TIMES ACCORDING TO BITS 2:1:0

MOVLW 0 ; TABLE INDEX = 0
BTFSC HOP4,1
IORLW 02H ; IF BIT 3 SET ADD 2 TO THE TABLE INDEX
BTFSC HOP4,6
IORLW 04H ; IF BIT 4 SET ADD 4 TO THE TABLE INDEX

ADDWF PCL ; ADD THE INDEX TO THE PROGRAM COUNTER
; [ MUST BE IN LOWER HALF OF PAGE ]

TABLE
MOVLW 2EH ; BITS 4:3 WERE 00
GOTO TABLE_END ; END OF LOOKUP

MOVLW 74H ; BITS 4:3 WERE 01
GOTO TABLE_END ;

END OF LOOKUP

MOVLW 5CH ; BITS 4:3 WERE 10
GOTO TABLE_END ; END OF LOOKUP

MOVLW 3AH ; BITS 4:3 WERE 11

TABLE_END
ANDWF MASK ; ISOLATE THE CORRECT BIT
MOVLW 0 ; COPY THE BIT TO BIT 7
SKPZ ; COPY THE BIT TO BIT 7
MOVLW 80H ; 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 ; LEFT ROTATE MASK TO GET BIT 7 INTO CARRY

RLF HOP1 ; SHIFT IN THE NEW BIT
RLF HOP2
RLF HOP3
RLF HOP4

ROTATE_KEY
CLRC ; CLEAR CARRY
BTFSC KEY7,7 ; SET CARRY IF LEFTMOST BIT SET
SETC ; SET CARRY IF LEFTMOST BIT SET

RLF KEY0 ; LEFT-ROTATE THE 64-BIT KEY
RLF KEY1
RLF KEY2
RLF KEY3
RLF KEY4
RLF KEY5
RLF KEY6
RLF KEY7


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

DECFSZ CNT1 ; 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 RFIN ; INPUT LOW?
GOTO RMT_0 ; YES; RECEIVE ERROR

MOVLW .10 ; 10 ms TIMER
MOVWF CNT1
RCV0
MOVLW .200
MOVWF CNT0
RCV1
BTFSS 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 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 RFIN ; [2] Wait for rising edge
GOTO RCV11 ; [0] Edge found--Process
CLRWDT ; [1] Clear watchdog Timer
BTFSC 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 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 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 RFIN ; [2] INPUT LOW? THIRD SAMPLE
GOTO RMT0 ; [0] NO--RECEIVE ERROR


;BSF PORTC,LED2
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
;BCF PORTC,LED2

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 PORTC,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 PORTC,LED
BTFSS PORTA,LRN
GOTO LEARN ; TEST & HANDLE LEARN BUTTON
CALL MOTO
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
CALL EEREAD ; READ LOWER 16-BITS OF SER# FROM EPROM

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

MOVFW TMP2 ; COMPARE RX AND EEPROM VALUES
XORWF SER_0,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 EPROM

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

MOVFW TMP2 ; COMPARE RX AND EEPROM VALUES
XORWF SER_2,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 ************
M_CNT
CALL TX_LOOKUP ; POINT LOWER 16 BIT COUNTER
MOVLW 04H
ADDWF ADDRESS,F
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

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
GOTO M_UPDATE; GOTO M_LOOP ; ERROR - GOTO MAIN LOOP
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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
MOVLW 04H
ADDWF ADDRESS,F
CALL EEWRITE ; UPDATE FIRST 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

MOVLW 08H
XORWF FUNC,W
BTFSC STATUS,Z
GOTO HHH

MOVLW 04H
XORWF FUNC,W
BTFSC STATUS,Z
GOTO LLL
GOTO M_TZERO
GOTO M_TZERO
HHH
BTFSS MOPEN
GOTO M_TZERO
BCF STATUS,RP1
BCF STATUS,RP0 ;BANK0
BSF PORTC,LED2
CALL Delay250ms
CALL Delay250ms
BCF PORTC,LED2
BCF FLAGS,SEC_CNT
GOTO M_TZERO
LLL
BTFSC MOPEN
GOTO M_TZERO
BCF STATUS,RP1
BCF STATUS,RP0 ;BANK0
BSF PORTC,LED
CALL Delay250ms
CALL Delay250ms
BCF PORTC,LED
BSF FLAGS,SEC_CNT
GOTO M_TZERO

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
BSF PORTC,LED ; LED ON
CALL Delay250ms ;250MS后再判断,若仍是低则为学习,否则返回
BCF PORTC,LED ; LED ON
CALL Delay250ms ;250MS后再判断,若仍是低则为学习,否则返回

BSF PORTC,LED2 ; LED ON
CALL Delay250ms ;250MS后再判断,若仍是低则为学习,否则返回
BCF PORTC,LED2 ; LED ON

BTFSS PORTA,LRN ; TEST FOR BUTTON RELEASE
GOTO LEARN0 ; ENTER LEARN MODE
BCF PORTC,LED ; LED OFF
GOTO M_LOOP ;
LEARN0
CLRF CNT_LW ; RESET TIMER
CLRF CNT_HI
LEARN1
CALL TST_RTCC ; UPDATE TIMER
BTFSC PORTA,LRN ; TEST FOR BUTTON RELEASE
GOTO LEARN2 ; ENTER LEARN MODE
BTFSS CNT_LW,7 ; TEST FOR ERASE ALL 按学习键4秒擦除EE
GOTO LEARN1 ; LOOP BACK

; ******* EEPROM ERASE ALL ******************
BCF PORTC,LED
CALL Delay250ms
BSF PORTC,LED
CALL Delay250ms
BCF PORTC,LED
CALL Delay250ms
BSF PORTC,LED
CALL Delay250ms
BCF PORTC,LED ;清EE前LED闪2下
ERASE_ALL
CLRWDT ; CLEAR WATCHDOG TIMER
BTFSS PORTA,LRN ; WAIT FOR BUT

TON RELEASE
GOTO ERASE_ALL ; LOOP BACK
;************* 写0 *****************
BCF STATUS,RP0 ;BANK0
MOVLW 00H
MOVWF ADDRESS
ERASE_LOOP
MOVLW 0FFH
MOVWF TMP2 ;低位
MOVLW 0FFH
MOVWF TMP1 ;高位
CALL EEWRITE ;结果:TMP2---0FFH,TMP1---0FFH

MOVLW .128
XORWF ADDRESS,W

SKPZ
GOTO ERASE_LOOP
GOTO RESET ; START OVER
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++

LEARN2
BCF PORTC,LED ; CLEAR LED
BSF FLAGS,LRNF ; SET LEARN FLAG
LEARN3
CALL MOTO
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 SELF LEARN 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
MOVFW SER_1 ; GET LOWER 16 BIT OF SERIAL NUMBER
MOVWF TMP1
MOVFW SER_0
MOVWF TMP2
CALL EEWRITE ; ... AND WRITE TO EEPROM

MOVFW SER_3 ; GET UPPER 16 BIT OF SERIAL NUMBER
MOVWF TMP1
MOVFW SER_2
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 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 PORTC,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
;------------------------------------------------------------------------------

;######### 250ms延时程序 ########
Delay250ms
movlw .4 ;X
movwf tmpBuff2
_dly250ms_1


movlw .65
movwf tmpBuff1
_dly250ms_0
clrwdt
movlw .255 ;T=6+50120X
movwf tmpBuff
decfsz tmpBuff,f
goto $-.1
decfsz tmpBuff1,f
goto _dly250ms_0
decfsz tmpBuff2,f
goto _dly250ms_1
return
;----------------------------------------------------------------------------------------------
; ORG 1FFH
GOTO RESET

END

相关文档
最新文档