📄 tm_card_lock.asm
字号:
;***********************************************
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 + -