📄 12f629=keelog.asm
字号:
;序列号:04213496
;识别字:0496
;密码:5BD20B0AD945F5E2
;**************************************************************************
;不改变寄存器的分配,以防移植到寄存器不同的CPU,
;**************************************************************************
;-------------------------------------------------------------------------
; 微芯KEELOQ解码程序(正常学习模式)
;
;-------------------------------------------------------------------------
PROCESSOR PIC12F629
RADIX DEC
include <P12F629.inc>
__CONFIG _BODEN_ON&_CP_OFF&_PWRTE_ON&_WDT_ON&_CPD_OFF&_INTRC_OSC_NOCLKOUT&_MCLRE_OFF
__IDLOCS 0608H
;------------------------------------------------------------------------
ERRORLEVEL 0,-305,-302 ; Messages, Warnings and Errors Printed
; Ignore [305] => Using default dest of
; 1 file
; Ignore [302] => Register in operand not in bank 0
;用户寄存器
FLAGS EQU 20H ; USER FLAG REGISTER
ADDRESS EQU 21H ; ADDRESS REGISTER
TXNUM EQU 22H ; CURRENT TX
OUTBYT EQU 23H ; GENERAL DATA REGISTER
MASK EQU OUTBYT ; MASK REGISTER USED IN DECRYPTION
;计数寄存器
CNT0 EQU 24H ; LOOP COUNTERS
CNT1 EQU 25H
CNT2 EQU 26H
CNT_HI EQU 27H ; 16 位时钟计数器
CNT_LW EQU 28H
; 临时寄存器
TMP1 EQU 29H ; 临时寄存器
TMP2 EQU 2AH
TMP3 EQU 2BH
TMP4 EQU 2CH
; 循环缓冲寄存器
CSR4 EQU 2DH ; 64位接收移位寄存器
CSR5 EQU 2EH
CSR6 EQU 2FH
CSR7 EQU 30H
CSR0 EQU 31H
CSR1 EQU 32H
CSR2 EQU 33H
CSR3 EQU 34H
; 工作寄存器
OLD_BUT EQU 35H ;存早先的按键代码
RAM_HI EQU 36H ;16位随机存储计数寄存器( 使用同步)
RAM_LW EQU 37H
SREG EQU 38H ; 程序状态存储指示器寄存器
;********************************************************************
ADDR EQU 39H ;读写EE用
; **************解码重新映射寄存器图*******************
;
; 注意: 间接寻址使用, 不可改变寄存器分配
;
; ******************************************************************
KEY0 EQU TMP2 ;64BIT移位寄存器 WITH 解码钥匙
KEY1 EQU TMP1
KEY2 EQU TMP3
KEY3 EQU TMP4
KEY4 EQU CSR4
KEY5 EQU CSR5
KEY6 EQU CSR6
KEY7 EQU CSR7
HOP1 EQU CSR0 ; 32位跳码寄存器
HOP2 EQU CSR1
HOP3 EQU CSR2
HOP4 EQU CSR3
; 用户重新映射寄存器
DAT1 EQU CSR3 ; 32位数据寄存器
DAT2 EQU CSR2
DAT3 EQU CSR1
DAT4 EQU CSR0
; 注意: 这些寄存器用作密匙产生期的32位寄存器
ETMP1 EQU CNT2 ; 延伸32位寄存器
ETMP2 EQU OLD_BUT
ETMP3 EQU RAM_HI
ETMP4 EQU RAM_LW
; 接收固定的32字节
SER_0 EQU CSR7 ; 24/28 字节序列号
SER_1 EQU CSR6
SER_2 EQU CSR5
SER_3 EQU CSR4
; RECEIVED TRANSMISSION ENCRYPTED 32 BITS
FUNC EQU CSR3 ; 按键代码 &功能代码字节
DISC EQU CSR2 ; 识别值
CNTR_HI EQU CSR1 ; 16字节的接收计数器
CNTR_LW EQU CSR0
; ********* PORTA I/O口定? *******
RES0 EQU 0H ; 保留
RFIN EQU 5H ; RF输入
LEARN EQU 3H ; 学习按键
LED EQU 4H ; 学习指示,LED输出
; ********* GPIO I/O口定? *******
S0 EQU 0H ; S0 OUTPUT
S1 EQU 1H ; S1 OUTPUT
S2 EQU 2H ; S2 OUTPUT
S3 EQU 3H ; S3 OUTPUT
B_LRN EQU 2H ; 指示学习功能键
; ********* COMPILER DEFINES ******************
NBITS EQU 64 ;; 传输最大长度的字节
MIN EQU 540 ; TRANSMISSION HEADER MINIMUM LENGTH
MAX EQU 10800 ; TRANSMISSION HEADER MAXIMUM LENGTH
GPIOS EQU 00101000B ; PORTA: TRI-STATE VALUE
;****** NTQ106 FLAGS DEFINITIONS **************
BITIN EQU 0H ;保留
FLAG1 EQU 1H ;保留
FLAG2 EQU 2H ;保留
FLAG3 EQU 3H ;保留
TCHECK EQU 4H ; INDICATE ONLY 16 BIT COUNTER UPDATE
NTQ106 EQU 5H ; 指示标准的微芯HCS TX码
RESYNC EQU 6H ; 重新同步
OUT_500 EQU 7H ; 指示忙500MS溢出
;******* PROGRAM STATES ***********************
PASS1 EQU 0C9H ; 学习第一次通过标示
PASS2 EQU 0CAH ; 学习第二次通过标示
NORMAL EQU 05CH ; 正常程序标志.
BUSY EQU 0C7H ; 指示学习忙标示
;****** 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
OVF EQU 7 ; TIMER0 OVERFLOW
;-------------------------------------------------------------------------
ORG 00H
; BSF 3,5
;MOVWF OSCCAL ;振荡校正系数
GOTO RESET
ORG 4
RETFIE ;中断留下,防止改为有中断功能.
;-------------------------------------------------------------------------
;
; FUNCTION : RESET ()
;
; DESCRIPTION : PROGRAM RESET ROUTINE
;-------------------------------------------------------------------------
RESET
banksel OPTION_REG
MOVLW 000111B ; SETUP TIMER0 PRESCALER
MOVWF OPTION_REG ;预分频器(1:256)RTCC,内部指今周期
CLRW
MOVWF WPU
MOVWF IOC
MOVLW GPIOS
MOVWF TRISIO
BANKSEL CMCON
MOVLW 7
MOVWF CMCON ;关模似
CLRF GPIO ;GPIO口
CLRW
MOVWF INTCON ;关所有的中断,本程序没有用到中断.
CLRF FUNC ;RESET FUNCTION BYTE
CLRF OLD_BUT ;RESET OLD BUTTON CODE
CLRF FLAGS ;RESET FLAGS
CLRF CNTR_HI ;RESET CLOCK COUNTER
CLRF CNTR_LW
MOVLW NORMAL ; INDICATE NORMAL PROGRAM FLOW
MOVWF SREG ;正常程序标志
GOTO MAIN ;到主循环
;-------------------------------------------------------------------------
; FUNCTION : ROT_SHIFT()
; DESCRIPTION : RIGHT ROTATE 64 BIT RECEIVE SHIFT REGISTER
;-------------------------------------------------------------------------
ROT_SHIFT
RRF CSR7
RRF CSR6
RRF CSR5
RRF CSR4
RRF CSR3
RRF CSR2
RRF CSR1
RRF CSR0
RETURN
;-------------------------------------------------------------------------
; FUNCTION : NTQ_LP1 ()
; DESCRIPTION : WAIT FOR CNT1 TIMES 1 MS
; CNT2 = OSC/[4*6*1000] [ 1MS ]
;-------------------------------------------------------------------------
NTQ_LP1
MOVLW 200D ; DELAY COUNTER FOR 1 MS
MOVWF CNT2
NTQ_LP2
NOP ; [1] WASTE TIME
CLRWDT ; [1]
DECFSZ CNT2 ; [1]
GOTO NTQ_LP2 ; [2]
DECFSZ CNT1 ; [1]
GOTO NTQ_LP1 ; [2]
RETURN
;-------------------------------------------------------------------------
; FUNCTION : TX_LOOKUP ()
; DESCRIPTION : TRANSMITTER MEMORY LOOKUP TABLE
;-------------------------------------------------------------------------
TX_LOOKUP
CALL TX_LOOKUP2 ; GET VALUE FROM LOOKUP TBLE BELOW
MOVWF ADDRESS ; STORE VALUE IN ADDRESS REGISTER
RETURN
; ****** LOOKUP TABLE WITH BASE ADDRESS OF TRANSMITTERS ************
TX_LOOKUP2
MOVFW TXNUM ; 得到当前发射机.
ADDWF PCL,1
RETLW 10H ;0号发射机的基地址
RETLW 18H ;1号发射机的基地址
RETLW 20H ;2号发射机的基地址
RETLW 28H ;3号发射机的基地址
RETLW 30H ;4号发射机的基地址
RETLW 38H ;5号发射机的基地址
;-------------------------------------------------------------------------
; 功能 : 按钮查找 ()
;
; 描述 : 发射机按钮查找表
;-------------------------------------------------------------------------
BUT_LOOKUP
MOVFW TXNUM ; 获得当前发射机
ADDWF PCL,1
RETLW 02H ; TX0 按钮代码地址
RETLW 03H ; TX1 .
RETLW 08H ; TX2 .
RETLW 09H ; TX3 .
RETLW 0AH ; TX4 .
RETLW 0BH ; TX5 按钮代码地址
;-------------------------------------------------------------------------
; ?匙?存影射?
;-------------------------------------------------------------------------
KEY_LOOKUP
ADDWF PCL,1 ; ADD OFFSET TO PROGRAM COUNTER
KEYBASE EQU $ ; BASE ADDRESS 40H
MAS_KEY EQU $ ; MASTER KEY BASE ADDRESS
RETLW 0EFH ; MKEY_0 LSB ;64位工厂代码
RETLW 0CDH ; MKEY_1
RETLW 0ABH ; MKEY_2
RETLW 089H ; MKEY_3
RETLW 067H ; MKEY_4
RETLW 045H ; MKEY_5
RETLW 023H ; MKEY_6
RETLW 001H ; MKEY_7 MSB
EN_KEY EQU $ ; ENVELOPE KEY BASE ADDRESS
RETLW 0FFH ; EN_KEY_0 LSB
RETLW 0FFH ; EN_KEY_1 MSB
EE_KEY EQU $ ; EEPROM KEY BASE ADDRESS ;加密才用到
RETLW 088H ; EKEY_0 LSB
RETLW 077H ; EKEY_1
RETLW 066H ; EKEY_2
RETLW 055H ; EKEY_3
RETLW 044H ; EKEY_4
RETLW 033H ; EKEY_5
RETLW 022H ; EKEY_6
RETLW 011H ; EKEY_7 MSB
;-------------------------------------------------------------------------
; FUNCTION : TST_RTCC ()
; DESCRIPTION : TEST TIMER0 COUNTER AND UPDATE OUTPUT IF REQUIRED
;-------------------------------------------------------------------------
TST_RTCC
CLRWDT ; 清WDT,,,RESET WATCHDOG TIMER
MOVFW STATUS
XORWF TMR0,W
ANDLW 080H
BTFSS STATUS,Z
GOTO TST_RTCC_2 ;测试32MS溢出时间
RETURN ; 迅速的回到接收程序
; **** INCREASE 16 BIT CLOCK TIMER *******
TST_RTCC_2
BCF STATUS,OVF
MOVFW TMR0
ANDLW 080H
IORWF STATUS
INCF CNT_LW ; INCREASE 16 COUNTER
BTFSC STATUS,Z ;计数器溢出否(OVERFLOW)
INCF CNT_HI
BSF 3,5
MOVLW GPIOS ; UPDATE TRIS REGISTER FOR PORTA
MOVWF TRISIO
BCF 3,5
BTFSS TMR0,7 ; TEST FOR 32MS TIMEOUT
RETURN ; 迅速的回到接收程序
; *********** UPDATE LED IF REQUIRED ********
TST_LED
MOVLW PASS1 ; TEST IF IN 1ST PASS OF SELFLEARN
XORWF SREG,W
SKPZ ; ... IF NOT BYPASS
GOTO TST_500
BSF GPIO,LED ; INDICATE 1ST VALID TX RECEIVED
; ***** TEST FOR 500 MS TIMEMOUT ON OUTPUTS **********
TST_500
BTFSS CNT_LW,4 ; TEST FOR 500 MS TIMEOUT
GOTO TST_30 ; ... IF NOT TEST 30S TIMEOUT
BCF FLAGS,OUT_500 ; RESET 500 MS OUTPUT INICATION
;BCF GPIO,B_LRN ; RESET LEARN BUTTON CODE,629里对学习指示有冲突故屏蔽掉.
MOVLW 0F0H
ANDWF GPIO,1 ; DOWN ALL PULSE OUTPUTS
CLRF OLD_BUT
; ********* TEST FOR 30 S LEARN TIMEOUT *************
TST_30
MOVLW NORMAL ; TIMEOUT USE ONLY WITH LEARN
XORWF SREG,W
SKPNZ
GOTO TST_END ; ... IF NOT RETURN
BTFSC CNT_HI,2 ; TEST FOR LEARN TIMEOUT
GOTO RESET ; IF TIMEMOUT FORCE SOFT RESET
TST_END
RETURN
;-------------------------------------------------------------------------
; 功能 :解码 ()
; 描述 : 解32位跳码[HOP1:HOP4] USING [CSR0:CSR7])
;-------------------------------------------------------------------------
DECRYPT
MOVLW 11+1 ; 外循环11+1 次
MOVWF CNT1 ;
DECRYPT_OUTER
MOVLW 48 ;外循环 48 次
MOVWF CNT0 ;
DECRYPT_INNER
CLRWDT ;清看门狗
MOVFW CNT1 ;最后48次循环恢复密匙
XORLW 1 ;
SKPNZ ;
GOTO ROTATE_KEY ;
; 查表程序压缩成4字节以节省空间(以运算的方法代替查表)
; 这部分设计的原因是避免常规查表程序导致的堆栈增加
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
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 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 PCL ; 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 ; ISOLATE THE CORRECT BIT
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 ; 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 ; 清除C
BTFSC KEY7,7 ; 置C,若最左边位为1
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 ; 内循环48次
GOTO DECRYPT_INNER ;
DECFSZ CNT1 ; 外循环12次(最后一次还原KEY)
GOTO DECRYPT_OUTER ; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY)
RETURN
;-------------------------------------------------------------------------
; 功能:接收程序 ()
; 描述 : 接收到HCS发射信程序,(RECEIVE ROUTINE FOR NTQ106/HCS TRANSMITTERS)
;-------------------------------------------------------------------------
RECEIVE
;********等待数据头;调整 *******************
BCF FLAGS,NTQ106 ;清除发送标志
BTFSS GPIO,RFIN ; 输入是低?
GOTO RMT_0 ; 是;接收错误
MOVLW 10 ; 不是,待10 ms
MOVWF CNT1
RCV0
MOVLW 200
MOVWF CNT0
RCV1
BTFSS GPIO,RFIN ; 输入是高?
GOTO RCV2 ; 不是, 跳过循环
DECFSZ CNT0 ; 是, 继续循环
GOTO RCV1 ; 5 us X CNT0
DECFSZ CNT1 ; 1MS
GOTO RCV0
RCV2
CLRF CNT0 ; 清计数器低字节
CLRF CNT1 ; 清计数器高字节
RCV3
BTFSC GPIO,RFIN ; [2][2] 输入是高?
GOTO RCV6 ; [0][0] YES--END CALIBRATION
MOVLW ((MAX+2559)/10/256) ; [1][1] LOAD W WITH TIMEOUT VALUE
INCF CNT0 ; [1][1] LOW BYTE OF COUNTER
BTFSS STATUS,Z ; [1][2] OVERFLOW IN LOW BYTE?
GOTO RCV5 ; [2][0] NO-DON'T UPDATE HIGH BYTE
RCV4
INCF CNT1 ; [0][1] YES--INCREMENT HIGH BYTE
SUBWF CNT1,W ; [0][1] COUNTER > MAX.?
BTFSC STATUS,C ; [0][2] COUNTER > MAX.?
GOTO RMT_0 ; [0][0] YES--HEADER TOO LONG
RCV5
CLRWDT ; [1][1]
GOTO RCV3 ; [2][2] LOOP BACK
; TOTAL 10/13us (WTH/WTHOUT CARRY)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -