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

📄 tm_card_lock.asm

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

;Constant
  M24WOP  = X'A0:BYTE            ; Write 24C16 Command
  M24ROP  = X'A1:BYTE            ; Read  24C16 Command

  ICYCLE  = R0                   ; Inner Cycle
  OCYCLE  = R4                   ; Outer Cycle
  LENGTH  = R1                   ; Length
  HADDR   = R2                   ; 24C16 High Address
  LADDR   = R3                   ; 24C16 Low Address
  TMRECO  = R5                   ; TM Key Pointer
  TMNUM   = R6                   ; TM Key Number
  HCOUNT  = R7                   ;
  NCOUNT  = R8                   ;
  TMKSER  = R9                   ;
  CRC8    = RA
  FLG1    = RB

;.SECT ECON,CONF
;          .DB  X'7C
;          .DB  'DAVID'
;.ENDSECT

.SECT DATA,RAM,ABS=0
  RDBUF:   .DSB 8                ; 24C16 Read Buffer
  ROMSN:   .DSB 8                ; TM ROM Read Buffer
  SETSN:   .DSB 8                ; SETCARD SNO
  TEMP:    .DSB 8                ;
.ENDSECT

; FLAG
  FTMWAKE = 0                    ; TM Wake PND Flag
  FKEYOPN = 4                    ; Key Wake PND Flag

; FLG1
  FLBLANK = 1                    ; LED On,Off
  FPVFLAG = 2                    ; Voltage, 1 H,0 L
  FSETCTI = 3                    ;
  FDOPEN  = 5                    ; Open Door Flag

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

.SECT CODE,ROM,ABS=0
START:   RPND
         LD    FLG1,#0
         LD    SP,#STACK
         JSR   INIT                ; Init Port
         JSR   PVDET               ; Voltage Detect
         JSR   LEDBEEP
         JSR   CDLON               ; Close Door,Clear For Ever Flag
         LD    B,#SETSN
         LD    [B+],#X'55
         LD    [B],#X'AA
         WD24L SETSN,2,MCHECK
         RD24L MCHECK
         MSCMP SETSN,RDBUF,2       ; Check 24C16
         JP    M24ERR
  MAINLOOP:
         LD    SP,#STACK
         JSR   RDDLON
         IFEQ  A,#USABLE
         JP    DNTOFF
         IFBIT FDOPEN,FLG1
         JSR   DCLOSE
  DNTOFF:JSR   INIT
  WAITTO:LD    R2,#5               ; Wait TM Out
  WATOLP:JSR   TMRDSNO             ; Read TM
         JP    WTNEXT
         JP    WAITTO
  WTNEXT:DRSZ  R2
         JP    WATOLP
         LD    WKPND,#0
         SBIT  7,PORTGD            ; HALT
         NOP
         NOP
         NOP
         LD    SP,#STACK
                                   ;  L7  L6  L5  L4  L3  L2  L1  L0
                                   ;  MF  ON  RD  KO 24C 24W  BZ  TM
         LD    PORTLD,#B'01111100  ;  0   1   1   1   1   1   0   0
         LD    PORTLC,#B'10001110  ;  1   0   0   0   1   1   1   0
                                   ;  NO  NO  NO  NO 24D  VDT LR  LG
         LD    PORTFD,#B'00000100  ;  0   0   0   0   0   1   0   0

         CLR   A
         X     A,WKPND
         IFBIT FTMWAKE,A
         JP    TMWAKEUP
         IFBIT FKEYOPN,A
         JP    KOWAKEUP
         JP    MAINLOOP

NTMKEY:  JSR   YLLBEEP
M24ERR:  JSR   YLLBEEP             ; 24C16 Error
         JSR   YLLBEEP             ; Yellow LED,BEEP 3
         JP    MAINLOOP

;***********************************************
; Initialize Port
INIT:    RPND
                                   ;  D7  D6  D5  D4  D3  D2  D1  D0
                                   ;  NO  NO  NO  NO  LG  LR  MR  ME
         LD    PORTD, #B'00000000  ;  0   0   0   0   0   0   0   0
                                   ;  G7  G6  G5  G4  G3  G2  G1  G0
                                   ;  HT  GD  NU  NU  NU  SA  NU  NU
         LD    PORTGD,#B'00000100  ;  0   0   0   0   0   1   0   0
         LD    PORTGC,#B'00111011  ;  1   0   1   1   1   0   1   1
                                   ;  F7  F6  F5  F4  F3  F2  F1  F0
                                   ;  NO  NO  NO  NO 24D  VDT LR  LG
         LD    PORTFD,#B'00000000  ;  0   0   0   0   0   0   0   0
         LD    PORTFC,#B'11110000  ;  1   1   1   1   0   0   0   0
                                   ;  L7  L6  L5  L4  L3  L2  L1  L0
                                   ;  MF  ON  RD  KO 24C 24W  BZ  TM
         LD    PORTLD,#B'00011100  ;  0   0   0   1   1   1   0   0
         LD    PORTLC,#B'11101110  ;  1   1   1   0   1   1   1   0
                                   ; PW7 PW6 PW5 PW4 PW3 PW2 PW1 PW0
                                   ;  HC  C  T1P T1E EIP BSY EIE GIE
         LD    PSW,   #B'00000000  ;  0   0   0   0   0   0   0   0
                                   ; IT7 IT6 IT5 IT4 IT3 IT2 IT1 IT0
                                   ;     LEN T0P T0E UWP UWE T1P T1E
         LD    ICNTRL,#B'00000000  ;  0   0   0   0   0   0   0   0
                                   ; CT7 CT6 CT5 CT4 CT3 CT2 CT1 CT0
                                   ; T13 T12 T11 T10 MSL EID SL1 SL0
         LD    CNTRL, #B'00000000  ;  0   0   0   0   0   0   0   0
         LD    WKEN,  #B'00000000  ;  L7  L6  L5  L4  L3  L2  L1  L0
         LD    WKEDG, #B'11111111  ;  1   1   1   1   1   1   1   1  Negative Edge
         LD    WKPND, #B'00000000  ;              KO              TM
         LD    WKEN,  #B'00010001  ;  0   0   0   1   0   0   0   1
         RET
;=========================================================
;***********************************************
;
KOWAKEUP:JSR   DLY100
         JSR   KSDET               ; Detect Key Status
         JP    MAINLOOP            ; Key Release,return
         JSR   LEDBEEP             ; BEEP ONE
         JSR   PVDET               ; Voltage Detect
         JSR   GRLEDON             ; LED ON
  KONOTM:MSFL8 SETSN               ; NO TM
  KODETK:JSR   DLY100              ; Delay 100ms
         JSR   KSDET               ; Detect Key Status
         JP    MAINLOOP            ; Key Release,return
         JSR   TMRDSNO             ; Read TM
         JP    KONOTM              ; No TM
         MSCM7 SETSN
         JP    KOSETS              ; New TM
         JP    KODETK
  KOSETS:CPSNO SETSN               ; Copy TMSNO
         JSR   SETSC               ; SET SETCARD
         JSR   BEEP                ; BEEP ONE
         JP    KODETK              ; Continue,Wait Key Release
;============================================================
;************ CHECK IS TM IN OR KEY ***********************

TMWAKEUP:LD    R4,#X'FF            ; Touch TM
  TWRSLP:DRSZ  R4
         JP    TWDETK
         JP    MAINLOOP            ; No TM,Return
  TWDETK:JSR   KSDET               ; Detect Key Status,Open?
         JP    TWRSN1              ; No,Detect TM
         JP    KOWAKEUP            ; Yes
  TWRSN1:JSR   TMRDSNO             ; Read TM,Has ?
         JP    TWRSLP              ; No,Continue Read
         RD24L SETFLG              ; Yes,Read SETCARD Exist Flag
         IFEQ  RDBUF,#H(EXSETC)    ; Comp EXSETC High Byte
         JP    CSETFL
  TSETSC:JSR   SETSC               ; No SETCARD,SET SETCARD
         JSR   BEEP
         JP    TMWAKEUP
  CSETFL:IFEQ  RDBUF+1,#L(EXSETC)  ; Comp EXSETC Low Byte
         JP    THASSC              ; Has SETCARD
         JP    TSETSC

;====   ===     ===     ===     ===     ===     ===
;****** TM PROCESS *********

  THASSC:RD24L SETCNO              ; Read SETCARD SNO
         MSCP8 SETSN,RDBUF         ; Copy SETCARD SNO To SETSN
         JSR   SNOTOTP             ; Copy TM SNO To TEMP
         LD    FLG1,#0
         LD    NCOUNT,#0
         LD    HCOUNT,#1
         JSR   PVDET
         JSR   CMPSETTM            ; Is SETCARD ?
         JP    NSETSC              ; No
         LD    B,#FLG1             ; Is SETCARD
         SBIT  FLBLANK,[B]
         SBIT  FSETCTI,[B]         ; Set FLAG
         JSR   BEEP                ; Beep One

;===    ===     ===     ===     ===     ===     ===
  WDOTM: IFBIT FSETCTI,FLG1
         JSR   BLANK
         JSR   DLY100
  OSDET: IFBIT NOROPEN,PORTLP      ; Open Status Detect,Door Open ?
         JP    WDORTM              ; No,Detect TM
         JSR   DLY10               ; Yes,Delay 10ms,Second Detect
         IFBIT NOROPEN,PORTLP
         JP    WDORTM
         JP    MAINLOOP            ; Door Open,Return

;===    ===     ===     ===     ===     ===     ====
  WDORTM:JSR   TMRDSNO             ; Read TM,Has ?
         JP    WDOTMN              ; NO
         LD    NCOUNT,#0           ; Yes,Clear NCOUNT
         MSCM7 TEMP                ; Compare TMSNO, = ?
         JP    WTMNEW              ; No,is New; To New TM Handle
         LD    A,HCOUNT            ; Yes,Old TM
         IFGT  A,#30    ;#45               ; HCOUNT > 70 ?
         JP    TMGT70              ; Yes
         INC   A                   ; No, HCOUNT+1
         X     A,HCOUNT            ; Save HCOUNT
         LD    A,12     ;#20
         IFGT  A,HCOUNT            ; HCOUNT > 30 ?
         JP    WDOTM               ; No,Continue Wait TM In and Open Door

         IFBIT FSETCTI,FLG1        ; Yes,Is Set Status ?
         JP    SCGT30              ; Yes
         IFEQ  HCOUNT,#18    ;#21          ; No,HCOUNT = 31,Beep One
         JP    BEEPT1
         IFEQ  HCOUNT,#24    ;#34          ; HCOUNT = 51,Beep One
         JP    BEEPT1
  SCGT30:JSR   CMPSETTM            ; Is SETCARD ?
         JP    WDOTM               ; No,Continue

;===    ===     ===     ===     ===     ===     ===     ===     =
;*********
  BEEPT1:JSR   BEEP                ; Is SETCARD,Beep One,Continue
         JP    WDOTM
  TMGT70:IFBIT FSETCTI,FLG1        ; HCOUNT > 70,Is Set Status ?
         JP    SCGT70              ; Yes
         JSR   WCDLON              ; No,Clear Or Set Forever Flag
         JP    BPLRET              ; Long Beep One,Return
  SCGT70:JSR   CMPSETTM            ; Is SETCARD ?
         JP    WDOTM               ; No,Continue
         JSR   CLRSC               ; Is SETCARD,Clear SETCARD
  BPLRET:JSR   BEEPL               ; Long Beep One,Return
         JP    MAINLOOP

  WTMNEW:LD    HCOUNT,#0           ; New TM,Clear HCOUNT
         JSR   SNOTOTP             ; Copy SNO To TEMP
         IFBIT FSETCTI,FLG1        ; Is Set status ?
         JP    SCTMNE              ; Yes

;===    ===     ===     ===     ===     ===     ===
;******** KEY CARD ************
  NSETSC:JSR   FKREC               ; No,Find Key ?
         JP    NTMKEY              ; No,
         IFBIT REVLOCK,PORTLP
         JP    DOOROP
         JSR   GREBEEP
         JSR   DLY100
         JSR   GREBEEP
         JP    MAINLOOP
DOOROP:  JSR   GRLEDON             ; Yes,LED On
         JSR   DOPEN               ; Enable Open Door
         JP    BEEPT1              ; Beep One,Continue

  SCTMNE:JSR   CMPSETTM            ; Is SETCARD ?
         JSR   KSCREC              ; No, Set Or Clear Key
         JP    BEEPT1              ; Yes,Continue
;===    ===     ===     ===     ===     ===
;*******
  WDOTMN:LD    A,NCOUNT            ; No TM
         INC   A                   ; NCOUNT+1
         IFGT  A,#60               ; NCOUNT > 60 ?
         JP    MAINLOOP            ; Yes, Return
         X     A,NCOUNT            ; No,Save NCOUNT
         LD    A,NCOUNT
         IFNE  A,#5                ; NCOUNT = 5 ?
         JP    WDOTM               ; No,Continue Wait TM In and Open Door
         LD    HCOUNT,#0           ; Yes,Clear HCOUNT
         IFBIT FSETCTI,FLG1        ; Is Set Status ?
         JSR   TEMPFL0             ; Yes,Clear TEMP
         JP    WDOTM               ; No,Continue Wait TM In and Open Door

;***********************************************
RDDLON:  LD    R3,#L(LONGON)
         JP    M24RDL8

;***********************************************
WCDLON:  JSR   RDDLON
         IFNE  A,#USABLE
         JP    SDLON
CDLON:   JSR   DCLOSE              ; Clear For Ever Flag
         LD    RDBUF,#0
         JP    WRDLON
SDLON:   LD    RDBUF,#USABLE       ; Set For Ever Flag
WRDLON:  LD    R3,#L(LONGON)
         JP    M24WD1

;***********************************************
M24RWREC:LD    A,R9
         ADD   A,#(KEYCNO/8)
CALSADDR:RC
         RLC   A
         RLC   A
         RLC   A
         X     A,R2
         LD    A,R2
         RLC   A
         AND   A,#X'07
         X     A,R2
         AND   A,#X'F8
         X     A,R3                ; * 8
         LD    R1,#8
         RET

;***********************************************
; Set Or Clear TM Key
KSCREC:  JSR   FKREC               ; Find Key ?
         JP    SETUPK              ; No,Set Key
         LD    A,R5                ;
         X     A,R9
         JSR   CKREC               ; Yes,Delete Key
  KBEEP1:JSR   BEEP
         RET
  SETUPK:LD    A,R5                ; Set Key
         X     A,R9
         IFEQ  R5,#MAXNUM
         JP    KBEEP2
         JSR   WKREC
         RET
  KBEEP2:JSR   BEEP
         JP    KBEEP1

;***********************************************
CKREC:   JSR   RDBUFL0             ; Delete TMKEY Record
         LD    B,#RDBUF
         JP    WCKREC
;***********************************************
WKREC:   LD    ROMSN+7,#USABLE     ; Write TMKEY Record
         LD    B,#ROMSN            
  WCKREC:JSR   M24RWREC
         JP    M24WD

;***********************************************
; R5 Record No., Find RETSK; No Find, RET
FKREC:   LD    R6,#MAXNUM          ; Load Loop Times
         LD    R9,#0
         LD    R5,#X'FF
  FKLP:  JSR   M24RWREC            ; Calculate Start Address
         JSR   M24RD               ; Read TMKEY Record,RKREC
         IFEQ  RDBUF+7,#USABLE     ; Is Used Key ?
         JP    FDUSEK              ; Yes,Find Using TMKEY Record
  FKSDRN:LD    A,R9                ; No,Find Deleted TMKEY Record
         IFEQ  R5,#X'FF            ; Is The First Record ?
         X     A,R5                ; Yes,Save The First Deleted Recno
         IFEQ  R6,#0               ; End ?
         RET                       ; Yes
  FKNEXT:LD    A,R9                ; No,Read Next
         INC   A
         X     A,R9
         DRSZ  R6
         JP    FKLP
         JP    FKSDRN              ; Not Find TMKEY Record
  FDUSEK:MSCM7 RDBUF               ; Find Using TMKEY Record
         JP    FKNEXT
         LD    A,R9                ; Find TMKEY Record
         X     A,R5                ; Save Recno
         JSR   RDBUFL0             ; RDBUF Fill 0
         RETSK

;***********************************************
CLRSC:   JSR   WCDLON              ; Clear SETCARD,Clear Forever Open Flag
         JSR   RDBUFL0             ; RDBUF Fill 0
         CLR   A
  CLRSLP:PUSH  A
         JSR   CALSADDR
         LD    B,#RDBUF
         JSR   M24WD              ; Clear 24C16
         POP   A
         INC   A
         IFGT  A,#( MAXNUM + KEYCNO/8 + 1 )
         RET
         JP    CLRSLP

⌨️ 快捷键说明

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