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

📄 tm_card_lock.asm

📁 tm card doorlock soure code
💻 ASM
📖 第 1 页 / 共 2 页
字号:

;***********************************************
SETSC:   JSR   CLRSC               ; Set SETCARD,Clear 24C16
         WD24L ROMSN,8,SETCNO      ; Write SETCARD SNO
         LD    B,#RDBUF
         LD    [B+],#H(EXSETC)
         LD    [B-],#L(EXSETC)
         LD    R1,#2
         LD    R3,#L(SETFLG)
         JP    M24WDL              ; Write SETCARD Exist Flag

;===============================================
.SECT DETECT,ROM,REL

;***********************************************
PVDET:   SBIT  MOTE,PORTLD         ; Voltage Detect
         JSR   DLY10
         SBIT  VDET,PORTFD
         JSR   DLY10
         RBIT  FPVFLAG,FLG1
         IFBIT VDET,PORTFP
         SBIT  FPVFLAG,FLG1        ;
         RBIT  VDET,PORTFD
         RBIT  MOTE,PORTLD
         RET

;***********************************************
KSDET:   IFBIT KEYOPEN,PORTLP      ; Key Status Detect
         RET
         JSR   DLY10
         IFBIT KEYOPEN,PORTLP
         RET
         RETSK

;===============================================
.SECT MOTOR,ROM,REL
;***********************************************
DOPEN:   SBIT  MOTE,PORTLD        ; Enable Open Door
         SBIT  MOTORR,PORTD
         SBIT  FDOPEN,FLG1
         JP    MOTOF
;***********************************************
DCLOSE:  SBIT  MOTE,PORTLD        ; Disable Open Door
         SBIT  MOTF,PORTD
         RBIT  FDOPEN,FLG1
  MOTOF: JSR   DLY100
         RBIT  MOTORR,PORTD
         RBIT  MOTF,PORTD
  MENOF: RBIT  MOTE,PORTLD
         RET

;===============================================
.SECT BZLED,ROM,REL

;***********************************************
BPDLY:   PUSH  A                   ; Beep Delay
         LD    A,R0
  BPDLP: DRSZ  R0
         JP    BPDLP
         X     A,R0
         POP   A
         RET

;***********************************************
BEEP:    LD    R0,#27              ; Beep One
         JP    BEEPS
BEEPL:   LD    R0,#67
  BEEPS: LD    A,#250
  BPLP:  SBIT  BUZZER,PORTLD
         JSR   BPDLY
         RBIT  BUZZER,PORTLD
         JSR   BPDLY
         DEC   A
         IFNE  A,#0
         JP    BPLP
         JSR   DLY100
         RET

;***********************************************
LEDBEEPL:JSR   GRLEDON             ; Turn on Red or Green,Beep
         JSR   BEEPL               ; Long Beep One
         JP    GRLEDOF
;***********************************************
LEDBEEP: JSR   GRLEDON             ; Turn on Red or Green,Beep
         JP    BEEPOFF
;***********************************************
YLLBEEP: SBIT  LRED,PORTD          ; Turn on Yellow,Beep
GREBEEP: SBIT  LGRN,PORTD
BEEPOFF: JSR   BEEP
GRLEDOF: RBIT  LRED,PORTD          ; Turn off Red and Green
GLEDOFF: RBIT  LGRN,PORTD
         RET

;***********************************************
; LED Blank
BLANK:   IFBIT FLBLANK,FLG1
         JP    BLANKO
         SBIT  FLBLANK,FLG1
         JP    GRLEDOF             ; LED Off
  BLANKO:RBIT  FLBLANK,FLG1        ; LED On
;***********************************************
; Led Light Red or Green
GRLEDON: SBIT  LGRN,PORTD          ; Turn on Red or Green
         IFBIT FPVFLAG,FLG1
         RET
         SBIT  LRED,PORTD
         JP    GLEDOFF
;         RBIT  LGRN,PORTD
;         RET

;===============================================

.SECT TM,ROM,REL

;***********************************************
; A -- Value
TMIB:    LD    A,#X'FF             ; MCU Shift in One Byte from 24C16
TMOB:    LD    R0,#8               ; MCU Shift out One Byte to 24C16
  TMSFT: RRC   A
         SBIT  TMBUS,PORTLC        ; Out L
         IFC
         RBIT  TMBUS,PORTLC        ; Out H
         NOP
         NOP
         NOP
         NOP
         NOP
         RC
         IFBIT TMBUS,PORTLP        ; Get Line
         SC
         PUSH  A
         X     A,R0
         LD    R0,#6
  TMDLP: DRSZ  R0
         JP    TMDLP
         X     A,R0
         POP   A
         RBIT  TMBUS,PORTLC
         DRSZ  R0
         JP    TMSFT
         RRC   A
         RET

;***********************************************
; DATAP -- Data Pointer
TMRDSNO: JSR   DETTM               ; Read TM ROM,Has TM ?
         RET                       ; No RET
         LD    A,#X'33             ; Yes
         JSR   TMOB                ; Send Read ROM Command
         LD    R1,#8               ; Length = 8
         LD    B,#ROMSN            ; Buffer = ROMSN
  RSNOLP:JSR   TMIB                ; Read
         X     A,[B+]              ; Save Data
         DRSZ  R1                  ; End ?
         JP    RSNOLP              ; No,Continue
  CRCSNO:LD    CRC8,#X'00          ; Yes, Do CRC8,Clear CRC8
         LD    R1,#8
         LD    B,#ROMSN
  CRCSLP:LD    A,[B+]
         PUSH  A                   ; Byte Do CRC8( X^8+X^5+X^4+1 )
         LD    R0,#8
  CRC8LP:XOR   A,CRC8
         RRC   A
         LD    A,CRC8
         IFNC
         JP    CRCZO
         XOR   A,#X'18
  CRCZO: RRC   A
         X     A,CRC8
         POP   A
         RC
         RRC   A
         PUSH  A
         DRSZ  R0
         JP    CRC8LP
         POP   A
         DRSZ  R1
         JP    CRCSLP
         IFEQ  CRC8,#X'00          ; ROM SNO Right ?
         JP    DETTM               ; Yes,Detect TM
         RET                       ; No,Error RET
;***********************************************
; HAS TM -- RETSK, No or Error -- RET
DETTM:                             ; Detect TM
         SBIT  TMBUS,PORTLC        ; OUT 0
         LD    R0,#64
  RSTLP: DRSZ  R0
         JP    RSTLP               ; Delay 480us ( 64 * 6 * 1.25 )
         RBIT  TMBUS,PORTLC        ; OUT 1,RD
         LD    R0,#6
  WREC:  IFBIT TMBUS,PORTLP        ; Wait High ( 6 * 9 * 1.25 )
         JP    WAITL
         DRSZ  R0
         JP    WREC
         RET                       ; Short
  WAITL: LD    R0,#7               ; ( 6 * 12 * 1.25 )
  WLLP:  DRSZ  R0                  ; Wait Presence Pulse ( L )
         JP    CHKL
         RET
  CHKL:  IFBIT TMBUS,PORTLP
         JP    WLLP
         LD    R0,#64              ; Delay ( 64 * 6 * 1.25 )
  WHLP:  DRSZ  R0
         JP    WHLP
         IFBIT TMBUS,PORTLP
         RETSK
         RET

;===============================================

.SECT M24C16,ROM,REL
;***********************************************
M24START:SBIT  MSCL,PORTLD         ; Send Start,SCL Out H
         RBIT  MSDA,PORTFC         ; SDA Out H
         SBIT  MSDA,PORTFC         ; SDA Out L
         JP    SCLOH
;***********************************************
M24SACK: SBIT  MSDA,PORTFC         ; MCU Respond ACK to 24C16
         JP    SSCL9
M24NACK:                           ; MCU not Respond ACK to 24C16
M24RACK: RBIT  MSDA,PORTFC         ; MCU Recieve ACK from 24C16
  SSCL9: SBIT  MSCL,PORTLD         ; SCL Out H
  SCLOH: RBIT  MSCL,PORTLD         ; SCL Out L
         RET

;***********************************************
; A -- Value
M24IB:   LD    A,#X'FF             ; MCU Shift in One Byte from 24C16
M24OB:   LD    R0,#8               ; MCU Shift out One Byte to 24C16
  SFTLP: RLC   A
         RBIT  MSDA,PORTFC         ; Out 1
         IFNC
         SBIT  MSDA,PORTFC         ; Out 0, SDA Line Out 0 OR 1
         RC
         SBIT  MSCL,PORTLD         ; SCL Out H
         NOP
         IFBIT MSDA,PORTFP         ; Read Line
         SC
         RBIT  MSCL,PORTLD         ; SCL Out L
         DRSZ  R0
         JP    SFTLP               ; Out Data,Vaild Before Rising Edge
         RLC   A                   ; In Daat,Vaild After Falling Edge
         RET

;***********************************************
; R2 -- High Address , R3 -- Low Address
M24SADDR:JSR   M24START            ; Send Start
         LD    A,R2
         RC
         RLC   A
         OR    A,#M24WOP           ; Send Device High Address and Write Command
         JSR   M24OB               ; Send Device Address
         JSR   M24RACK             ; Recive ACK
         LD    A,R3                ;
         JSR   M24OB               ; Send Low Address
         JSR   M24RACK             ; Recive ACK
         RET

;***********************************************
; B  -- Data Pointer , R1 -- Length
; R2 -- High Address , R3 -- Low Address
M24RDL8: LD    R2,#0               ; High Address = 0
M24RD8:  LD    R1,#8               ; Length = 8
M24RD:   JSR   M24SADDR            ; Read Data From 24C16,Send High and Low Address
         LD    B,#RDBUF            ; Data Buffer Is RDBUF
         JSR   M24START            ; Send The Second Start
         LD    A,R2
         RC
         RLC   A
         OR    A,#M24ROP           ; Send Device Address and Read Command
         JSR   M24OB               ;
         JSR   M24RACK
  M24RNT:DRSZ  R1                  ; Is The Last Byte ?
         JP    M24RLP              ; No,Continue Read
         JSR   M24IB               ; Yes,Read The Last Byte
         X     A,[B]               ; Save The Last Byte
         JSR   M24NACK             ; Not Send ACK
         LD    A,RDBUF             ; Get The First Byte To A
;***********************************************
M24STOP: SBIT  MSDA,PORTFC         ; 24C16 Stop; Send Stop
         SBIT  MSCL,PORTLD         ;
         RBIT  MSDA,PORTFC         ;
         RET                       ;
  M24RLP:JSR   M24IB               ; Read Data
         X     A,[B+]              ; Save To Buffer
         JSR   M24SACK             ; Send ACK
         JP    M24RNT              ;

;***********************************************
; B  -- Data Pointer , R1 -- Length
; R2 -- High Address , R3 -- Low Address
M24WD1:  LD    R1,#1               ; Length Is 1
M24WDR:  LD    B,#RDBUF            ; Data Is RDBUF
M24WDL:  LD    R2,#0               ; High Address Is 0
M24WD:   RBIT  MWP,PORTLD          ; Write Data to 24C16
         JSR   M24SADDR            ; Send Device High and Low Address
  M24WLP:LD    A,[B+]
         JSR   M24OB               ; Send Data
         JSR   M24RACK             ; Recive ACK
         DRSZ  R1                  ; End ?
         JP    M24CAD              ; No,Calculate The Next Address
         JSR   M24STOP             ; Yes,Send Stop
         JSR   DLY10               ; Delay 10ms
         JSR   DLY10               ; Delay 10ms 
         JSR   DLY10               ; Delay 10ms
         SBIT  MWP,PORTLD          ; Write Protect
         RET                       ; Return
  M24CAD:LD    A,R3
         INC   A
         X     A,R3                ; Low Address + 1,Save Low Address
         LD    A,R3                ; Get Low Address
         IFNE  A,#0                ; Low Address = 0 ?
         JP    LANOV               ; No,
         X     A,R2                ; Yes,Save Low,      ::::::
         INC   A                   ; High Address + 1   ::::::
         X     A,R2                ; Save High,Get Low  ::::::
  LANOV: ANDSZ A,#X'0F             ; Low Four Bit = 0000 ?
         JP    M24WLP              ; No,Continue
         JSR   M24STOP             ; Yes,Page Over,Send Stop
         JSR   DLY10               ; Delay 10ms
         JSR   DLY10               ; Delay 10ms
         JSR   DLY10               ; Delay 10ms
         JP    M24WD               ; Write The Next Page

;===============================================

.SECT GENERAL,ROM,REL
;***********************************************
DLY100:  LD    A,#100              ; Delay 100ms
         JP    DELAY
DLY10:   LD    A,#10               ; Delay 10ms
DELAY:   IFEQ  A,#0                ; Delay A ms
         RET
         LD    R0,#133
  DLYLP: DRSZ  R0
         JP    DLYLP               ; ( 3+3 )*133*1.25
         DEC   A
         JP    DELAY

;***********************************************
; B,X -- Data Pointer, R1 -- Length
; B = X RETSK, B <> X RET
CMPSETTM:LD    X,#SETSN           ; SETSN Compare with ROMSN
CMP7SNO: LD    B,#ROMSN           ; Str1 = ROMSN
STR7CMP: LD    R1,#7              ; Length Is 7
STRNCMP: LD    A,[X+]             ; Compare Data
         IFNE  A,[B]
         RET
         LD    A,[B+]
         DRSZ  R1
         JP    STRNCMP
         RETSK

;***********************************************
; B SRC,X DES -- Data Pointer, R1 -- Length
SNOTOTP: LD    X,#TEMP           ; SNO Copy To TEMP
CPY8SNO: LD    B,#ROMSN          ; SRC Is SNO
STR8CPY: LD    R1,#8             ; Length Is 8
STRNCPY: LD    A,[B+]            ; Copy Data
         X     A,[X+]
         DRSZ  R1
         JP    STRNCPY
         RET

;***********************************************
; B -- Data Pointer, R1 -- Length
TEMPFL0: LD    B,#TEMP           ; TEMP Fill 0
         JP    STR8FL0           ;
RDBUFL0: LD    B,#RDBUF          ; RDBUF Fill 0
STR8FL0: LD    R1,#8             ; Length Is 8
STRNFL0: LD    [B+],#0           ; RAM Fill 0
         DRSZ  R1
         JP    STRNFL0
         RET

.END START

⌨️ 快捷键说明

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