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

📄 gdm.txt

📁 滚动码接收源程序,用于HCS300/301
💻 TXT
📖 第 1 页 / 共 3 页
字号:
;  MICROCHIP KEELOQ CODE HOPPING SIMPLE DECODER
;
;   一步学习; 单一键
;---------------------------------------------------------
; 配置控制:
; 
;  -VERSION 1.1  S. DAWSON
;
;           FILE:        SIMDEC11.ASM.        
;           DATE:        8 SEPTEMBER 1998 
;           VER.:        1.1
;            FUSES:        RC,WDT=ON,CP=ON.
;           ASM.:         MPASM VERSION 2.13 USED.
;            INCL:        NONE
;
;---------------------------------------------
        LIST P=16C54,R=DEC
;---------------------------------------------

MAX_USERS        EQU        15
; 这是系统的最大数,因此系统能记住(1 to 15).   
;---------------------------------------------
IND        EQU        00H                
RTCC        EQU        01H                
PC        EQU        02H                
STATUS        EQU        03H            
FSR        EQU        04H                
PORTA   EQU     05H                
PORTB   EQU     06H                
;----------------------
FLAGS        EQU        07H                
ADDRESS        EQU        08H                
TXNUM        EQU        09H                
OUTBYT        EQU        0AH                
MASK        EQU        OUTBYT                
TMP_CNT        EQU        OUTBYT                

CNT0    EQU     0BH                ; ;计数        
CNT1    EQU        0CH                
CNT2    EQU     0DH                

CNT_HI        EQU        0EH                ; 16位时钟
CNT_LW        EQU        0FH                

CSR0    EQU     10H                    ; 64 位接收移位寄存器
CSR1    EQU     11H            
CSR2    EQU     12H            
CSR3    EQU     13H            
CSR4    EQU     14H                    
CSR5    EQU     15H            
CSR6    EQU     16H            
CSR7    EQU     17H            

TMP1        EQU        18H                
TMP2        EQU        19H                
REG        EQU        1AH                ; 
REG1        EQU        1BH                ; 临时寄存器
;
KEY0        EQU        1CH                ; 64 BIT KEY SHIFT REGISTER
KEY1        EQU        1DH
KEY2        EQU        1EH
KEY3        EQU        1FH
KEY4        EQU        CNT2
KEY5        EQU        CSR5
KEY6        EQU        CSR6
KEY7        EQU        CSR7
;
HOP1        EQU        CSR0                ; 32 BIT 
HOP2        EQU        CSR1
HOP3        EQU        CSR2
HOP4        EQU        CSR3
; 
SER_0        EQU        CSR7                ; 28 BIT 串行数
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
RFIN        EQU        1H                ; RF INPUT
LRN        EQU        2H                ; LEARN BUTTON
LED        EQU        3H                ; LEARN INDICATOR LED OUTPUT - VALID SIGNAL

; ********* PORTB 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     64              ; MAXIMUM TRANSMISSION BIT LENGTH
MIN     EQU     560                    ; TRANSMISSION HEADER MINIMUM LENGTH [鍿]
TRISA        EQU        0111B                ; PORTA: TRI-STATE VALUE
WRCFG        EQU        00000000B        ; PORTB: EEPROM WRITE TRI-STATE VALUE
RDCFG        EQU        00010000B        ; PORTB: 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 -------------------
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 


        ORG 00H
;=========================================

RESET        
        MOVLW        000111B                        ; SETUP RTCC PRESCALER
        OPTION

        CLRF        PORTA                        ; RESET PORTA
        CLRF        PORTB                        ; RESET PORTB

        MOVLW        TRISA                        ; SETUP PORTA
        TRIS        PORTA
        MOVLW        WRCFG                        ; SETUP PORTB
        TRIS         PORTB

        CLRF        FLAGS                        ; RESET FLAGS

        GOTO        M_LOOP                        ; GOTO MAIN PROGRAM LOOP

;---------------------------------------------------------------------------
;
; 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 4 
        RLF        ADDRESS,F
        RLF        ADDRESS,F
        MOVLW        04H                        ; AND ADD 4
        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
        MOVLW        TRISA                        ; UPDATE TRI-STATE REGISTER FOR PORTA
        TRIS        PORTA

        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        PORTB,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             : SENDC ()                                      
;
; DESCRIPTION          : SEND EEPROM COMMAND 
;
; NOTE                : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------
SENDC
        CLRWDT                                ; RESET WATCHDOG TIMER

        BCF     PORTB,CS                ; RESET CS STATE
        BCF     PORTB,CLK               ; RESET CLK STATE
        BCF     PORTB,DIO               ; RESET DIO STATE

        MOVLW   WRCFG
        TRIS    PORTB                   ; DIO = OUTPUT
        GOTO    $+1                     ; WAIT FOR OUTPUTS TO SETTLE
        BSF     PORTB,CS                ; SELECT EEPROM
        SETC                            ; START BIT = 1
        MOVLW   9D                         ; START BIT + 8 DATA BITS
        MOVWF        CNT1

SENDC2
        SKPC                            ; TEST BIT
        BCF     PORTB,DIO               ; WRITE TO DIO
        SKPNC                           ; TEST BIT
        BSF     PORTB,DIO               ; WRITE TO DIO
        GOTO    $+1                     ; WAIT 2 US
        RLF     OUTBYT,F                ; GET NEXT BIT INTO CARRY
        BSF     PORTB,CLK               ; CLOCK HIGH
        GOTO    $+1                     ; WAIT 2 US
        GOTO    $+1                     ; WAIT 2 US
        BCF     PORTB,CLK               ; CLOCK LOW
        DECFSZ        CNT1,F                        ; LOOP COUNTER
        GOTO        SENDC2
        BCF     PORTB,DIO               ; AVOID CONTENTION WITH READ
        RETLW   0

;------------------------------------------------------------------------------
;
; FUNCTION             : EEWRITE ()                                      
;
; DESCRIPTION          : WRITE 16 BIT VALUE TO EEPROM 
;
; NOTE                : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------

EEWRITE

; ******* EEPROM WRITE ENABLE ******************

WRITE0  MOVLW        30H                        ; WRITE ENABLE COMMAND
        MOVWF   OUTBYT                       
        CALL    SENDC                        ; SEND COMMAND TO EEPROM
        BCF     PORTB,CS                ; END COMMAND, DESELECT

; ******** WRITE 16-BIT WORD TO EEPROM *********

WRITE1  MOVFW   ADDRESS                        ; GET EEPROM ADDRESS
        MOVWF        OUTBYT
        BSF     OUTBYT,6                ; WRITE COMMAND
        CALL    SENDC                   ; SEND COMMAND TO EEPROM

        MOVLW        16D                        ; 16 DATA BITS
        MOVWF   CNT1                        

WRITE2
        BTFSS   TMP1,7                        ; TEST MSB OF 16 BIT WORD
        BCF     PORTB,DIO                ; SET DATA BIT
        BTFSC   TMP1,7                        ; ... ELSE 
        BSF     PORTB,DIO               ; CLEAR DATA BIT
        GOTO    $+1                     ; WAIT 2 US
        RLF     TMP2,F                  ; SHIFT LO BYTE
        BSF     PORTB,CLK               ; CLOCK HIGH
        GOTO    $+1                     ; WAIT 2 US
        RLF     TMP1,F                  ; SHIFT HI BYTE
        BCF     PORTB,CLK               ; CLOCK LOW
        DECFSZ        CNT1,F
        GOTO        WRITE2                     ; LOOP COUNTER

WAITACK
               BCF     PORTB,CS                ; END OF WRITE COMMAND, DESELECT

        MOVLW   RDCFG
        TRIS    PORTB                   ; DIO = INPUT
        BSF     PORTB,CS                ; CS HIGH TO WAIT FOR ACK
WRITE5         
        BTFSC        PORTB,DIO                ; CHECK FOR ACK
        GOTO        WRITE6                        ; WDT RESET ON NO ACK
        GOTO        WRITE5

⌨️ 快捷键说明

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