📄 12f629=keelog.asm
字号:
RCV6
CLRC
RRF CNT1
RRF CNT0
RRF CNT1
RRF CNT0
RRF CNT1
RRF CNT0 ; TOTAL: 7 us
; DIVIDE CNT1:CNT0 BY 8 (600/8=75)
MOVLW MIN/80
SUBWF CNT0,W
BTFSS STATUS,C ; NEGATIVE?
GOTO RMT_0 ; YES--HEADER SHORTER THAN MIN.
; ************* VALID HEADER RECEIVED *********************
RCV7
MOVLW NBITS ; VALID START MARKER WAS RECEIVED
MOVWF CNT1
MOVF CNT0,W
MOVWF CNT2 ; CNT2 = CNT0
MOVLW 5
SUBWF CNT2,1
GOTO DL1 ;清第一字节
;*************** 等待下一字节 ************************
RCV8 ; Timeout = 1BPW
MOVLW 1H ;补偿RTCC
SUBWF CNT0,0 ; and CSR processing
MOVWF CNT2
RCV9
BTFSC GPIO,RFIN ; (2) 等待下一个上升沿到来
GOTO RCV11 ; (0) 如果上升沿到取样
GOTO $+1 ; (2) 延时2MS
CLRWDT ; (1) 清WDT
DECFSZ CNT2 ; (1) 消耗时间
GOTO RCV9 ; (2) 回到循环
RCV9A
RLF CNT0,W
MOVWF CNT2 ; 6xCNT0x2 = 3/2(CNT2x8) = 1.5 Te
RCV10
BTFSC GPIO,RFIN ; (2) Check if clear - Data
GOTO RMT01 ; (0) 如果高-引导头
CLRWDT ; (1) 清WDT
DECFSZ CNT2,1 ; (1)消耗时间
GOTO RCV10 ; (2)回到循环
MOVLW 0FFH ;计时时间 = 1.18 Te(max)
MOVWF CNT2 ; Refer to explanation above
RCV10A
BTFSC GPIO,RFIN ; (2) 等待下一上升沿到来
GOTO RCV11 ; (0) 上升沿到--处理
DECFSZ CNT2,1 ; (1) 消耗时间
GOTO RCV10A ; (2) 回到循?
GOTO RMT01 ; (0) (5)计时时间--没有发现边沿
RCV11
MOVF CNT0,W ;校准计数器
MOVWF CNT2 ;
DECF CNT2
DECF CNT2
GOTO $+1
DL1
CLRWDT ; RESET WATCHDOG TIMER
DECFSZ CNT2 ;
GOTO DL1 ; CNT0 X 4 us
BTFSS GPIO,RFIN ; 输入高吗? 第一个样
GOTO RMT01 ; NO--ERROR
MOVF CNT0,W ; 校准计数器
MOVWF CNT2 ; (NOMINALLY 75 FOR 300 us PULSE)
DECF CNT2
CLRC ;
RLF CNT2 ; 乘2 FOR 600 us
GOTO $+1
DL2
CLRWDT ; RESET WATCHDOG TIMER
DECFSZ CNT2
GOTO DL2 ; CNT0 X 4 us
BCF FLAGS,BITIN ; CLEAR BIT POSITION
BTFSS GPIO,RFIN ; 输入高吗?
BSF FLAGS,BITIN ; MAKE 1 IF LINE LOW
MOVF CNT0,W ; CALIBRATION COUNTER
MOVWF CNT2 ; (NOMINALLY 75 FOR 300 us PULSE)
CLRC ; OPTIONAL--LITTLE DIFFERENCE
RLF CNT2 ; 乘2 FOR 600 us
MOVLW 5 ; [1]
SUBWF CNT2 ; [1]
BCF STATUS,C ; [1]
CALL ROT_SHIFT ; [10]+[2] CSR SHIFT + CALL
BTFSC FLAGS,BITIN ; [1]
BSF CSR7,7 ; [1]
DL3
CLRWDT ; RESET WATCHDOG TIMER
DECFSZ CNT2 ;
GOTO DL3 ; CNT0 X 4 us
BTFSC GPIO,RFIN ; 输入是低? 第三个取样
GOTO RMT0 ;NO--接收--错误
CALL TST_RTCC ; 检查 RTCC
DECFSZ CNT1 ; 最后的字节?
GOTO RCV8 ; 没有获得下一字节
GOTO RMT1
RMT_0
BSF CNT1,4 ;引道头错误, HEADER ERROR--FORCE COUNTER > 8
RMT0 ; HERE IF FAIL ON 3RD SAMPLE
DECF CNT1,1 ; COMPENSATE FOR ROTATE BEFORE DL3
RMT01 ; HERE IF FAIL ON 1ST SAMPLE
CALL TST_RTCC ; CHECK RTCC
MOVLW 9H ; TEST FOR NTQ106 TRANSMISSION
SUBWF CNT1,W ;如果进位标示设置(接收不 OK)
BTFSC STATUS,C
RETURN
RMT2
CALL ROT_SHIFT ; COMPLETE 64-BIT SHIFT
DECFSZ CNT1 ; 完成64位的移位,COMPLETE 64-BIT SHIFT
GOTO RMT2
CLRF SER_0 ;清序列?寄存器, CLEAR UPPER BYTE OF SERIAL NR
BSF FLAGS,NTQ106 ; INDICATE NTQ106 TX RECEIVED
RMT1
CLRC ; [ 接收 OK ]
MOVFW SREG
XORLW PASS2
SKPNZ ; DON'T CLR TXNUM CONTAINS LRN POS
RETLW 0
BTFSS FLAGS,OUT_500 ; TEST IF 500 MS TIMEOUT
BSF GPIO,LED ; ... IF SO SET LED ONvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
CLRC
RETLW 1 ; RETURN WITH 1
;-------------------------------------------------------------------------
; 功能 :学习测试()
; DESCRIPTION : TEST AND HANDLE LEARN BUTTON
;-------------------------------------------------------------------------
TST_LEARN1
CLRWDT ; 清WDT寄存器
BTFSC GPIO,LEARN ; 检查学习按钮是否按下
RETURN
CLRF CNT_HI ;有清寄存器高字节
CLRF CNT_LW ;清寄存器高字节
TST_LEARN2
CALL TST_RTCC ; 更新RTCC, CALL RTCC UPDATE ROUTINE
BTFSS CNT_HI,0 ; TEST FOR ERASE TIMEMOUT,8.2 SEC
GOTO TST_LEARN3 ; IF NOT WAIT FOR LEARN KEY LIFT
MOVLW PASS1 ; INDICATE FIRST STATE OF LEARN
MOVWF SREG
GOTO NTQ_ERASE ; ERASE ALL LEARNED TRANSMITTERS
TST_LEARN3
BSF GPIO,LED ; LED亮指示学习模式, ON TO INDICATE LEARN
BTFSS GPIO,LEARN ; 等侍按钮松开
GOTO TST_LEARN2 ; ... 如果没松开检查时间
MOVLW 2H ; 测试如果按下大干64MS
SUBWF CNT_LW,W
SKPC
RETURN
MOVLW PASS1 ; 指示第一次通过
MOVWF SREG
RETURN
;-------------------------------------------------------------------------
; 功能 : 学习成功 ()
; 描述 : LED闪亮3秒 [ 指示学习成功 ]
;-------------------------------------------------------------------------
LEARN_OK
CLRF CNT_HI ; RESET EVENT COUNTER
CLRF CNT_LW
LEARN_OK2
CLRWDT ; RESET WATCHDOG TIMER
BTFSS TMR0,7 ; TEST FOR 32MS TIMEOUT
GOTO LEARN_OK2 ; ... IF NOT WAIT
BCF TMR0,7 ; RESET TIMER0 CLOCK
INCF CNT_LW ; INCREASE 16 COUNTER
BTFSC STATUS,Z ; INCREASE UPPER BYTE IF ZERO
INCF CNT_HI
BTFSS CNT_LW,2
BCF GPIO,LED ; FLASH LED @ 4HZ
BTFSC CNT_LW,2
BSF GPIO,LED
BTFSS CNT_LW,7 ; WAIT FOR 3 SEK
GOTO LEARN_OK2
GOTO RESET ; RESET SYSTEM
;-------------------------------------------------------------------------
; CALLS TO FIRST PAGE
;-------------------------------------------------------------------------
EE_CLEAR1
CLRF TMP1 ;CLEAR UPPER 16 BITS
CLRF TMP2 ;... AND THEN WRITE TO EEPROM
GOTO EEWRITE ; CALL EEPROM WRITE ROUTINE
;-------------------------------------------------------------------------
; FUNCTION : CHK_PASS2 ()
; DESCRIPTION : CHECK FOR PASS2 VALUE IN SREG
;-------------------------------------------------------------------------
CHK_PASS2
MOVLW PASS2 ;TEST IF ON 2ND PASS OF SELFLEARN
XORWF SREG,W ;ZERO BIT WILL BE SET
RETURN
;-------------------------------------------------------------------------
; FUNCTION : WIPE_TX ()
; DESCRIPTION : WIPE CURRENT TX SERIAL NUMBER IN EEPROM
;-------------------------------------------------------------------------
WIPE_TX
CLRF TMP1 ; SET TO ZERO
CLRF TMP2
CALL TX_LOOKUP ; TO GET BASR ADDRESS OF TX
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
CALL EE_CLEAR1 ; CLEAR LOWER 16 BITS
CALL EE_CLEAR1 ; CLEAR UPPER 16 BITS
; ... DO 1SEC ERROR LED NEX
;-------------------------------------------------------------------------
; FUNCTION : ERROR_LED ()
; DESCRIPTION : LED ON FOR 1 SEC [ INDICATE ERROR ]
;-------------------------------------------------------------------------
ERROR_LED
CLRF CNT_HI
CLRF CNT_LW
ERROR_LED2
CLRWDT ; RESET WATCHDOG TIMER
BTFSS TMR0,7 ; TEST FOR 32MS TIMEOUT
GOTO ERROR_LED2 ; ... ELSE WAIT
BCF TMR0,7 ; RESET EVENT CLOCK
INCF CNT_LW ; INCREASE 16 COUNTER
BTFSC STATUS,Z ; INCREASE UPPER BYTE IF ZERO
INCF CNT_HI
BSF GPIO,LED ; LED ON TO INDICATE ERROR
BTFSS CNT_LW,5 ; WAIT FOR 1 SEK
GOTO ERROR_LED2
GOTO RESET ; RESET SYSTEM
;-------------------------------------------------------------------------
; FUNCTION : NTQ_KEYGEN ()
; DESCRIPTION : GENERATE A KEY USING MASTER KEY ( ADDR 40H IN ROM )
;-------------------------------------------------------------------------
NTQ_KEYGEN
MOVLW KEY7 ; POINT TO FIRST KEY BYTE
MOVWF FSR
MOVLW (MAS_KEY-KEYBASE+7) ; GET TABLE MSB OFFSET FOR M KEY
MOVWF CNT1
MOVLW 8H ; INDICATE 8 BYTE TO READ
MOVWF CNT0 ; BYTE COUNTER
NTQ_KEYGEN2
MOVFW CNT1
CALL KEY_LOOKUP ; GET BYTE FROM LOOKUP TABLE
MOVWF INDF ; STORE BYTE IN KEY BYTE
DECF FSR ; NEXT ENTRY IN CIRCULAR BUFFER
DECF CNT1 ; NEXT ENTRY IN KEY LOOKUP TABLE
DECFSZ CNT0 ; ALL BYTES READ
GOTO NTQ_KEYGEN2 ; ... NO THEN READ NEXT BYTE
MOVFW KEY0 ; SWAP KEY1 AND KEY0
MOVWF OUTBYT ; NOTE :THIS MUST BE DONE BECAUSE
MOVFW KEY1 ; THE TMP1 & TMP2 (KEY0 &
MOVWF KEY0 ; KEY1) REGISTERS IS ALSO
MOVFW OUTBYT ; USED DURING DECRYPTION
MOVWF KEY1 ; (KEYGEN)
CALL DECRYPT ; DECRYPT 32 BIT USING MASTER KEY
MOVFW HOP2 ; GET LOW 16BIT OF DECRYPTED WORD
MOVWF TMP1
MOVFW HOP1
MOVWF TMP2
CALL EEWRITE ; ... AND WRITE TO EEPROM
MOVFW HOP4 ; GET UP 16 BIT OF DECRYPTED WORD
MOVWF TMP1
MOVFW HOP3
MOVWF TMP2
CALL EEWRITE ; ... AND WRITE TO EEPROM
BTFSC ADDRESS,1 ; TEST IF FIRST 32BIT OF KEY GEN.
GOTO S_SEED2 ; ... IF SO GENERATE SECOND 32BITS
GOTO CALC_END ; ... ELSE KEYGEN COMPLETE
;-------------------------------------------------------------------------
; FUNCTION : CALC_KEY ()
; DESCRIPTION : 计算刚接收到的32位码
;-------------------------------------------------------------------------
CALC_KEY
MOVFW HOP1 ;存储32位码到临时寄存器
MOVWF ETMP1 ; EXTENDED TEMP BUFFER
MOVFW HOP2
MOVWF ETMP2
MOVFW HOP3
MOVWF ETMP3
MOVFW HOP4
MOVWF ETMP4
CALL TX_LOOKUP ; GET TRANSMITTER BASE ADDRESS
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
MOVFW SER_2 ; 获得下半部16位序列号
MOVWF TMP1
MOVFW SER_3
MOVWF TMP2
CALL EEWRITE ; ... 写入EE
MOVFW SER_0 ;获得上半部16位序列号,
MOVWF TMP1
MOVFW SER_1
MOVWF TMP2
CALL EEWRITE ; ...写入EE
S_SEED1
MOVLW 20H ; PATCH IF TX IS MCHIP HCS ENCODER
BTFSC FLAGS,NTQ106
MOVLW 2BH ; PATCH IF TX IS A NTQ106 ENCODER
IORWF SER_0,W
MOVWF DAT1
MOVFW SER_1 ; GET SERIAL NR FROM RX BUFFER
MOVWF DAT2
MOVFW SER_2
MOVWF DAT3
MOVFW SER_3
MOVWF DAT4
GOTO NTQ_KEYGEN ;?生最初32位?匙, FIRST 32 KEY BITS
S_SEED2
CALL TX_LOOKUP ; GET TRANSMITTER BASE ADDRESS
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
CALL EEREAD ; READ LOW 16BITS OF SER # FROM EE
MOVFW TMP1
MOVWF DAT3
MOVFW TMP2
MOVWF DAT4
INCF ADDRESS
CALL EEREAD ;?存?器?16位序列? READ UP 16BITS OF SER # FROM EE
MOVLW 60H ; PATCH IF TX IS MCHIP HCS ENCODER
BTFSC FLAGS,NTQ106
MOVLW 65H ; PATCH IF TRANSMITTER IS A NTQ106
IORWF TMP1,W
MOVWF DAT1
MOVFW TMP2
MOVWF DAT2
INCF ADDRESS ; POINT TO UPPER 32 BITS OF KEY
INCF ADDRESS
INCF ADDRESS
GOTO NTQ_KEYGEN ;?生第二?32位?匙 GENERATE SECOND 32 KEY BITS
CALC_END
MOVFW ETMP1 ; ???器恢复32位的?匙,RECOVER 32 BIT HOPCODE FROM
MOVWF HOP1 ; EXTENDED BUFFER
MOVFW ETMP2
MOVWF HOP2
MOVFW ETMP3
MOVWF HOP3
MOVFW ETMP4
MOVWF HOP4
CLRF CNT_HI ; RESET EVENT CLOCK
CLRF CNT_LW
GOTO M_HOP
;-------------------------------------------------------------------------
; FUNCTION : NTQ_ERASE ()
; DESCRIPTION : 擦除所有的?射机,ERASE ALL TRANSMITTERS
;-------------------------------------------------------------------------
NTQ_ERASE
BSF GPIO,LED ; LED亮
MOVLW 1H ; 指示??地址
MOVWF ADDRESS ;擦除
CALL EE_CLEAR1 ; NOTE: CURNT PAGE BIT SET TO #0
CLRF TXNUM ; 指向存?器第一??射机的位置POINT TO 1ST TX POSISTION IN EE
NTQ_ERASE2
CALL TX_LOOKUP ;?得?射机的地址, GET TX BASE ADRESS
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
CALL EE_CLEAR1 ; 清除低16位的序列?,CLEAR LOW 16BITS OF SERIAL NR
CALL EE_CLEAR1 ; 清除高16位的序列?,CLEAR UP 16BITS OF SERIAL NR
INCF TXNUM ;指向下存EE的下一位置.
MOVLW 6H ; TEST FOR LAST POSITION
SUBWF TXNUM,W
SKPC ; IF NOT UPDATE NEXT ENTRY
GOTO NTQ_ERASE2
BCF GPIO,LED ;LED熄灭所的擦除完成.
M_ERASE3
CLRWDT ; RESET WATCHDOG TIMER
BSF 3,5
MOVLW GPIOS ; UPDATE TRIS REGISTER FOR PORTA
MOVWF TRISIO
BCF 3,5
BTFSS GPIO,LEARN ; 等候按?松?,WAIT FOR BUTTON LIFT
GOTO M_ERASE3
GOTO MAIN2 ; THEN WAIT FOR NEXT TRANMISSION
;-------------------------------------------------------------------------
; FUNCTION : 读密匙 ()
; DESCRIPTION : 读存储器?64字节密匙 [CSR0:CSR7]
;-------------------------------------------------------------------------
READ_KEY
MOVLW 3H ; 指向密匙的高字节地址
ADDWF ADDRESS,1
MOVLW KEY7 ;指向64位的低字节移位寄存器
MOVWF FSR
MOVLW 3H ; 3x16字节值
MOVWF CNT2
READ_KEY2
CALL EEREAD ; ?低16字?
MOVFW TMP1 ; GET UPPER 8 BITS
MOVWF INDF ; STORE 1ST 8BITS IN 64BT SHIFT REG
DECF FSR ; POINT TO NEXT BYTE IN SHIFT REG
MOVFW TMP2 ; GET LOWER 8 BITS
MOVWF INDF ; STORE 2ND 8BITS IN 64BT SHFT REG
DECF FSR ; POINT TO NEXT BYTE IN SHIFT REG
DECF ADDRESS ; POINT TO NEXT EEPROM ADDRESS
DECFSZ CNT2 ; ALL THREE 16-BIT WORDS READ
GOTO READ_KEY2 ; ... IF NOT GET NEXT
CALL EEREAD ; READ LOWER 16 BITS
GOTO M_DEC ; 回到主循?
;-------------------------------------------------------------------------
; FUNCTION : ?存?器 ()
; DESCRIPTION : 加密16字?值并?入存?器
;用BANKSEL宏指令方便移植到任何CPU
;-------------------------------------------------------------------------
EEWRITE
CLRC
RLF ADDRESS,W ;因微芯原程序用的是93C46读写16字节的方试所以每次地址都要加2.
MOVWF ADDR
MOVF TMP2,W
MOVWF OUTBYT
CALL W_EE
BANKSEL EECON1
CLRWDT
BTFSC EECON1,WR ;WAIT FOR
GOTO $-2
BANKSEL ADDR
INCF ADDR,1
MOVF TMP1,W
MOVWF OUTBYT
CALL W_EE
BANKSEL EECON1
CLRWDT
BTFSC EECON1,WR ;WAIT FOR
GOTO $-2
BANKSEL ADDR
INCF ADDRESS,1
RETURN
W_EE
BANKSEL EECON1
CLRWDT
BTFSC EECON1,WR ;WAIT FOR
GOTO $-2 ;WRITE TO FINISH
BANKSEL EEADR
MOVF ADDR,W
MOVWF EEADR ;WRITE TO
MOVF OUTBYT,W ;DATA TO
MOVWF EEDATA ;WRITE
BANKSEL EECON1
BSF EECON1,WREN ;ENABLE WRITES
;ONLY DISABLE INTERRUPTS
BCF INTCON,GIE ;IF ALREADY ENABLED,OTHER DISCARD
MOVLW 0X55 ;WRITE 55H TO EECON2
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2 ;WRITE AAH TO EECON2
BSF EECON1,WR ;START WRITE OPERATION ONLY ENABLE INTERRUPTS
BCF EECON1,WREN ;DISABLE WRITES
BANKSEL GPIO
RETURN
;-------------------------------------------------------------------------
; 功能 : 读ee ()
; 描述 : ee
;-------------------------------------------------------------------------
R_EE
MOVF ADDR,W
BANKSEL EEADR
MOVWF EEADR ;TO READ FROM
BANKSEL EECON1
BSF EECON1,RD ;START READ OPERATION
BANKSEL EEDATA
MOVF EEDATA,W ;W=EEDATA
BANKSEL GPIO
MOVWF OUTBYT
RETURN
EEREAD
CLRC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -