📄 hcs635.asm
字号:
CALL EEREAD ; READ BYTE FROM EEPROM
MOVWF INDF ; COPY INTO REQUIRED BUFFER
DECF FSR,F ; POINT TO NEXT BYTE IN BUFFER
BTFSC FSR,0 ; IF NOT YET AT A
BTFSS FSR,1 ; . 4 BYTE BOUNDARY
GOTO BLK_NEXT ; ... THEN READ NEXT BYTE
RETLW 0
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION : EEREAD ()
;
; DESCRIPTION : READ 8 BIT VALUE FROM INTERNAL EEPROM
;
; PAGE : 1
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
EEREAD1
BTFSC FLAGS,TX_NUM ; IF SECOND TRANSMITTER IS SELECTED
IORLW 80H ; ... THEN MARK OFFSET REQUIRED FLAG
EEREAD0
BSF STATUS,RP0 ; Select Bank 1
MOVWF EEADR ; SET EEPROM ADDRESS POINTER
MOVLW 96H ; GET EEPROM OFFSET + 80H FOR SECOND TRANSMITTER
BTFSC EEADR,7 ; IF OFFSET REQUIRED
ADDWF EEADR,F ; ... THEN ADD OFFSET AND CLEAR OFFSET FLAG
EEREAD
BSF STATUS,RP0 ; Select Bank 1
BSF EECON1,RD ; Command read
INCF EEADR,F ; POINT TO NEXT ENTRY IN EEPROM
MOVFW EEDATA ; GET THE VALUE READ FROM EEPROM
BCF STATUS,RP0 ; Select Bank 0
RETURN ; RETURN
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION : EEWRITE ()
;
; DESCRIPTION : WRITE 8 BIT VALUE TO INTERNAL EEPROM
;
; PAGE : 1
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
EEWRITEI
BSF STATUS,RP0 ; Select Bank 1
BSF FSR,5 ; POINT TO DATA EEPROM
MOVFW INDF ; GET DATA AT INDIRECT POINTER
DECF EEADR,F ; FIX EEPROM ADDRESS FROM LAST INCREMENT
EEWRITE
BSF STATUS,RP0 ; Select Bank 1
MOVWF EEDATA ; STORE NEW VALUE IN EEPROM DATA REGISTER
BSF EECON1,WREN ; Command Write Enable
MOVLW 55H
MOVWF EECON2 ; Write 55H
MOVLW 0AAH
MOVWF EECON2 ; Write AAH
BSF EECON1,WR ; Command Write
WR_WAIT
CLRWDT
BTFSC EECON1,WR ; Wait for write to complete
GOTO WR_WAIT
BCF EECON1,WREN ; Disable writes
INCF EEADR,F ; POINT TO NEXT ADDRESS IN EEPROM
BCF STATUS,RP0 ; Select Bank 0
RETLW 0H
IFDEF NoEncryption
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION : Get2ndSerialNumber ()
;
; DESCRIPTION : Replace KeeLoq hopping code with value at KEY1 in EEPROM
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Get2ndSerialNumber
bsf STATUS,RP0 ; select Bank 1
bcf STATUS,RP1
movlw EE_KEY ; GET OFFSET OF SEED IN EEPROM
movwf EEADR
movlw NSR0 ; OFFSET TO Last BYTE KeyLoq buffer
movwf FSR
G2SN_0
bsf EECON1,RD ; EE read
movfw EEDAT
movwf INDF ; move KEY to Transmission Buffer
incf EEADR ; point to next EE byte
incf FSR ; point to next Trans Buffer
btfss FSR,2
goto G2SN_0 ; loop
bcf STATUS,RP0 ; select Bank 0
bcf STATUS,RP1
movfw CNT2
xorlw 0x70 ; if buttons S0,S1, and S2 are not pressed,
btfsc STATUS,Z ; then,
goto Send2ndSerialNumber ; send a 32-bit auxilary serial number
Send12bitVariable
movfw UserDefined
movwf NSR2
movfw UserDefined+1
andlw 0x0F
iorwf CNT2,w
movwf NSR3
Send2ndSerialNumber
RETLW 0H
ELSE
#include Encrypt.inc
ENDIF
IFDEF NoEncryption
CNTR_READ
retlw 0
ELSE
#include CounterCode.inc
ENDIF
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION : DEBOUNCER ()
;
; DESCRIPTION : LOAD SYSTEM CONFIG, DEBOUNCE INPUTS, LOAD TRANSMITTER CONFIG
;
; PAGE : 1
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
DEBOUNCER
; ****** LOAD SYSTEM CONIGURATION FROM EEPROM *********************************
MOVLW EE_CFG2 ; OFFSET OF LOWER BYTE OF SYSTEM CONFIG #1
CALL EEREAD0 ; READ BYTE FROM EEPROM
ANDLW 3FH ; MASK OUT LOWER 6 BITS
MOVWF SYSCFG1 ; LOAD SYSTEM CONFIGURATION OPTIONS #1
MOVLW EE_CFG0 ; OFFSET OF LOWER BYTE OF SYSTEM CONFIG #0
CALL EEREAD0 ; READ BYTE FROM EEPROM
ANDLW 3FH ; MASK OUT LOWER 6 BITS
MOVWF SYSCFG0 ; LOAD SYSTEM CONFIGURATION OPTIONS #0
; ***** SETUP FUNCTION CODE BUTTON MASK REGISTER ***********
BTFSS RFENSEL ; IF RFEN SELECTED
goto $+3
bsf STATUS,RP0
bcf RFENtris ; ... THEN MAKE RFEN AN OUTPUT
bsf STATUS,RP0
movfw TRISA
bcf STATUS,RP0
BTFSC INDSEL ; IF SHIFT INPUT ENABLED
ANDLW B'00111011' ; ... THEN REMOVE SHIFT INPUT FROM BUTTON MASK
IFDEF P16F639
andlw b'00111101' ; take LFData Interrupt out of mask
ENDIF
MOVWF B_MASK ; LOAD BUTTON MASK REGISTER
; ****** CHECK FOR 20MS DEBOUNCE TIME ********
MOVLW 3FH ; COMPENSATE FOR WAKEUP TIME & OVERHEAD = 6x8 = 48us
MOVWF TMR1H ; LOAD RTCC COUNTER WITH 3636H
MOVWF TMR1H ; TO SIMPLIFY 20MS TEST AT 4000H WITH ONLY .2% ERROR
; ****** DEBOUNCE BUTTON INPUTS *****************************************
DEBOUNCE1
CALL EEREAD ; DELAY WHILE UPDATING DC/DC OUTPUTS
BTFSS TMR1H,6 ; CHECK IF WE REACHED 20MS BUTTON DEBOUNCE TIMEOUT
GOTO DEBOUNCE1 ; ... NO, THEN CONTINUE WAITING
CLRF FLAGS ; START WITH ALL FLAGS CLEARED
IFDEF pullup
BTFSS SHIFT
ELSE
BTFSC SHIFT ; IF SHIFT BUTTON PRESSED
ENDIF
BSF FLAGS,TX_NUM ; ... THEN SAVE SELECTION
BTFSS RFENSEL ; IF RFEN OUTPUT ENABLED
BTFSS INDSEL ; . OR NOT DUAL TRANSMITTER
BCF FLAGS,TX_NUM ; ... THEN FORCE TO FIRST TRANSMITTER
IFDEF pullup
comf PORTA,w
ELSE
MOVFW PORTA ; [1/1] READ GENERAL I/O PORT
ENDIF
ANDWF B_MASK,W ; MASK OUT THE FUNCTION CODE, SET Z IF NO BUTTON
MOVWF BUTTON ; STORE BUTTON CODE IN TEMP REGISTER
; ****** LOAD SYSTEM CONIGURATION FROM EEPROM *********************************
MOVLW EE_DISC ; OFFSET OF LOWER BYTE OF TX0'S CONFIGURATION
CALL EEREAD1 ; READ BYTE FROM EEPROM
bsf STATUS,RP0
RRF EEDATA,F ; ROTATE BYTE READ FROM EEPROM
RRF EEDATA,W ; ROTATE BYTE READ FROM EEPROM
bcf STATUS,RP0
ANDLW 03FH ; MASK OUT LOWER 6 BITS FROM BYTE
MOVWF TX_CFG0 ; LOAD TRANSMITTER CONFIGURATION OPTIONS #1
MOVLW EE_CFG0 ; OFFSET OF LOWER BYTE OF TX0'S CONFIGURATION
BTFSC FLAGS,TX_NUM ; CHECK IF SECOND TRANSMITTER IS SELECTED
MOVLW EE_CFG2 ; ... YES, THEN USE TX1'S CONFIGURATION
CALL EEREAD0 ; READ BYTE FROM EEPROM
ANDLW 0C0H ; MASK OUT UPPER 2 BITS FROM BYTE
IORWF TX_CFG0,F ; COPY INT TRANSMITTER CONFIGURATION OPTIONS #0
MOVLW EE_CFG3 ; OFFSET OF LOWER BYTE OF TX0'S CONFIGURATION
BTFSC FLAGS,TX_NUM ; CHECK IF SECOND TRANSMITTER IS SELECTED
MOVLW EE_CFG1 ; ... YES, THEN USE TX1'S CONFIGURATION
CALL EEREAD0 ; READ BYTE FROM EEPROM
MOVWF TX_CFG1 ; LOAD TRANSMITTER CONFIGURATION OPTIONS #1
MOVLW EE_SEED ; OFFSET OF UPPER BYTE OF SEED TRANSMISSION
CALL EEREAD1 ; READ BYTE FROM EEPROM
IFDEF P16F639
btfss ValidLFIFF ; if AFE initialsed OK, check data out pin
goto NoLFIFactive
bcf ValidLFIFF
movlw PKE_Code ; offset to PKE function code
CALL EEREAD0 ; READ BYTE FROM EEPROM
andlw 0x3C ; mask out all but PKE code
movwf BUTTON
goto XmitNOW ; else, ignore it
NoLFIFactive
ENDIF
MOVFW BUTTON ; GET BUTTON PRESSED
ANDWF B_MASK,W ; MASK OUT THE FUNCTION CODE, SET Z IF NO BUTTON
BTFSC STATUS,Z ; IF NO BUTTON PRESSED
GOTO M_SLEEP ; ... THEN RETURN TO SLEEP MODE
; ***** CHECK IF A SEED TRANSMISSION IS REQUIRED ***********
XmitNOW
bsf STATUS,RP0
SWAPF EEDATA,W ; GET BYTE READ FROM EEPROM
bcf STATUS,RP0
ANDLW 0FH ; MASK SEED BITS OUT OF BUTTON CODE
XORWF BUTTON,W ; COMPARE WITH BUTTON PRESSED
MOVLW 0F0H ; GET SEED OPTIONS MASK
BTFSS STATUS,Z ; IF NOT CORRECT BUTTON PRESS
ANDWF TX_CFG1,F ; ... THEN CLEAR SEED OPTIONS
BTFSC STATUS,Z ; ELSE
BSF FLAGS,SEEDNOW ;... SET SEND SEED TRANSIMISSION NOW FLAG
BTFSS SDTM0 ; IF DELAYED SEED ENABLED WITH EITHER
BTFSC SDTM1 ; . OF THE DELAY SEED BITS
BCF FLAGS,SEEDNOW ; ... THEN STOP SEED TX NOW
BTFSC SDMD ; IF PRODUCTION SEED MODE ENABLED
BCF FLAGS,SEEDNOW ; ... THEN STOP SEED TX NOW
BSF FLAGS,BUT_DWN ; SET BUTTON PRESSED FLAG
BSF FLAGS,VLOWBAT ; DISABLE LED UNTIL AFTER VLOW TEST
clrf QUEUE
GOTO MAIN ; START MAIN LOOP
IFDEF P16F639
;--------------
; SGAFE Specific
ClampON equ 0x00
ClampOFF equ 0x20
EnterSLEEP equ 0x40
AGCPresON equ 0x60
AGCPresOFF equ 0x80
SoftRESET equ 0xA0
ReadCommand equ 0xC0
WriteCommand equ 0xE0
GeneralOptions equ 0x00
LCXtune equ 0x02
LCYtune equ 0x04
LCZtune equ 0x06
LCXLCYsens equ 0x08
LCZsensMOD equ 0x0A
ColParity equ 0x0C
AFEStatus equ 0x0E
;******************************************************************************************
; Analogue Front End Configuration Table
;******************************************************************************************
; SGAFE Default Register Values
; Default Mode:Wake-up filter disabled. MODSIG= 0, Enable Ch-X only. 25% mod depth.
; Register 0: 1010-0001 - 0 (parity)
#define AFEConfig0 b'101000001' ; filter=enabled --> 2ms+2ms
; Register 1: 0000-0000 - 1 (parity)
#define AFEConfig1 b'000000001'
; Register 2: 0000-0000 - 1 (parity)
#define AFEConfig2 b'000000001'
; Register 3: 0000-0000 - 1 (parity)
#define AFEConfig3 b'000000001'
; Register 4: 0000-0000 - 1 (parity)
#define AFEConfig4 b'000000001'
; Register 5: 0001-0000 - 0 (parity)
#define AFEConfig5 b'000100000' ; modulation depth, default = 75%
; Register 6: 0100-1111 - 0 (Parity) ; column parity bits
#define AFEConfig6 b'010011110' ; column parity at defalt mode (75%)
ORG ((HIGH $)+1)*256
;--------------------------------------------------------------------------------------------------
Check_LFDATA_Pin
BCF STATUS,RP0
bcf ValidLED ; turn on LED
CLRF TMR1H
CLRF TMR1L
BSF T1CON, TMR1ON
First_LFDATA_Hi
btfss LFDATA ; Is the LFDATA input pin high ?
goto timeout_hi
goto First_Lo_time_check
timeout_hi
BTFSS TMR1H,4 ; SKIP IF GREATER THAN 6.5 msec long ?
goto First_LFDATA_Hi
bsf ValidLED ; turn off LED
retlw 0x07 ; time expired. Exit this loop
;-----------------------------------------
First_Lo_time_check
CLRF TMR1H
CLRF TMR1L
BSF T1CON, TMR1ON
First_LFDATA_Lo
btfsc LFDATA ; yes, it was hi, now looking for lo (less than 4ms)
goto check_time_out
goto HIGH4ms
check_time_out
BTFSS TMR1H,4 ; SKIP IF GREATER THAN 6.5 msec long ?
goto First_LFDATA_Lo
bsf ValidLED ; turn off LED
retlw 0x08 ; time expired. Exit this loop
HIGH4ms
Validate500uSLOW
;--------------------------------
CLRF TMR1H
CLRF TMR1L
BSF T1CON, TMR1ON
;--------------------------------
movlw .8
movwf TEMP2
; movlw .18 ; 1 cycle 50us loop
movlw .07 ; 1 cycle 50us loop
movwf TEMP1 ; 1 cycle
; time=((X*5)+7)*(1/(Fosc/4))
btfsc LFDATA ; 2 cycles
goto RecvLF_FAIL500us ; 2 cycles
decfsz TEMP1, f ; 1 cycle
goto $-3 ; 2 cycles
decfsz TEMP2,f
goto $-7
Val_500uSLOW_hi
btfss LFDATA ; 2 cycles, wait for rising edge
goto check500us_timeover
goto Validate2mSheaderHIGH
check500us_timeover
BTFSS TMR1H,4 ; SKIP IF GREATER THAN 6.5 msec long ?
goto Val_500uSLOW_hi
goto RecvLF_FAIL500us ; 2 cycles
Validate2mSheaderHIGH
;--------------------------------
CLRF TMR1H
CLRF TMR1L
BSF T1CON, TMR1ON
;--------------------------------
movlw .37
movwf TEMP2
movlw .07 ; 1 cycle 50us loop
movwf TEMP1 ; 1 cycle
; time=((X*5)+7)*(1/(Fosc/4))
btfss LFDATA ; 2 cycles
goto RecvLF_FAIL2msH ; 2 cycles
decfsz TEMP1, f ; 1 cycle
goto $-3 ; 2 cycles
decfsz TEMP2,f
goto $-7
wait_2msHd_low
btfsc LFDATA ; 2 cycles, wait for falling edge
goto check2msHi_timeover
goto Validate2mSheaderLOW
check2msHi_timeover
BTFSS TMR1H,4 ; SKIP IF GREATER THAN 6.5 msec long ?
goto wait_2msHd_low
goto RecvLF_FAIL2msH ; 2 cycles
Validate2mSheaderLOW
;--------------------------------
CLRF TMR1H
CLRF TMR1L
BSF T1CON, TMR1ON
;--------------------------------
movlw .37
movwf TEMP2
movlw .05 ; 1 cycle 50us loop
movwf TEMP1 ; 1 cycle
; time=((X*5)+7)*(1/(Fosc/4))
btfsc LFDATA ; 2 cycles
goto RecvLF_FAIL2msL ; 2 cycles
decfsz TEMP1, f ; 1 cycle
goto $-3 ; 2 cycles
decfsz TEMP2,f
goto $-7
wait_startbit_hi
btfss LFDATA ; 2 cycles, wait for rising edge
goto check_2msLo_timeover
goto now_for_next_bits
check_2msLo_timeover
BTFSS TMR1H,4 ; SKIP IF GREATER THAN 6.5 msec long ?
goto wait_startbit_hi
goto RecvLF_FAIL2msL
now_for_next_bits
clrf RXTX_REG ; clear receive register
movlw .4 ; number of bits to receive
movwf COUNTER ; load number of bits into counter register
call ReceiveNext
movfw RXTX_REG
andlw 0xF0
xorlw 0x50
btfsc STATUS,Z
goto Its_Correct_Data
bsf ValidLED ; turn off D5
retlw 0x07
Its_Correct_Data
bcf LED ; turn on LED for correct LFDATA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -