📄 main.asm
字号:
XRL A,@R0
INC R0
DJNZ DataLength,XORCheckLoop
RET
;--------------------------------------------------------------------
; FUNCTION: Delay_10ms
; INPUT:
; OUTPUT:
;--------------------------------------------------------------------
Delay_10ms:
MOV TimeCount1,#200
Delay_10msLoop:
LCALL Delay_52us_NOP
DJNZ TimeCount1,Delay_10msLoop
RET
;--------------------------------------------------------------------
; FUNCTION: Delay_52us_NOP
; INPUT:
; OUTPUT:
;--------------------------------------------------------------------
Delay_52us_NOP:
MOV TimeCount2,#12
Delay_52usLoop:
NOP
DJNZ TimeCount2,Delay_52usLoop
RET
;--------------------------------------------------------------------
; FUNCTION: Delay_26us_NOP
; INPUT:
; OUTPUT:
;--------------------------------------------------------------------
Delay_26us_NOP:
MOV TimeCount2,#6
Delay_26usLoop:
NOP
DJNZ TimeCount2,Delay_26usLoop
RET
;--------------------------------------------------------------------
; % SUBROUTINE for SoftUART
;--------------------------------------------------------------------
;--------------------------------------------------------------------
; FUNCTION: Init_SoftUART
; INPUT:
; OUTPUT:
;--------------------------------------------------------------------
Init_SoftUART:
SETB UART_TX_BIT
SETB UART_RX_BIT
RET
;--------------------------------------------------------------------
; FUNCTION: SoftUART_PutByte
; INPUT: UARTData
; OUTPUT:
; USE: A
;--------------------------------------------------------------------
SoftUART_PutByte:
XCH A,UARTData
; generate START bit
CLR UART_TX_BIT
LCALL Delay_52us_NOP
; generate DATA bit
MOV UARTBitCount,#08H
SoftUART_PutByteLoop:
RRC A
MOV UART_TX_BIT,C
LCALL Delay_52us_NOP
DJNZ UARTBitCount,SoftUART_PutByteLoop
; generate STOP bit
SETB UART_TX_BIT
LCALL Delay_52us_NOP
RET
;--------------------------------------------------------------------
; FUNCTION: SoftUART_GetByte
; INPUT:
; OUTPUT: UARTData
; USE: A,C
;--------------------------------------------------------------------
SoftUART_GetByte:
; Wait for START bit
; 增加超时处理: 未连接/未上电/通讯错误等
JB UART_RX_BIT,$
LCALL Delay_52us_NOP
LCALL Delay_26us_NOP
; Get DATA bit
MOV UARTBitCount,#08H
SoftUART_GetByteLoop:
MOV C,UART_RX_BIT
RRC A
LCALL Delay_52us_NOP
DJNZ UARTBitCount,SoftUART_GetByteLoop
SETB UART_RX_BIT
MOV UARTData,A
RET
;--------------------------------------------------------------------
; % SUBROUTINE for Card Opration START
;--------------------------------------------------------------------
;--------------------------------------------------------------------
; FUNCTION: CardReady
; INPUT:
; OUTPUT: CardStatus,DataBuff1+2, ... ,DataBuff1+5
; CardStatus = 0 --> OK
; CardSNO: DataBuff1+2, ... ,DataBuff1+5
; USE: A,R1
;--------------------------------------------------------------------
CardReady:
MOV CardStatus,#01H
;--------------------------------------------------------------------
; Command: 0x60 0x04 0x01 0x61 0x00 0x00 BCC 0x03
; send 15 byte 7 * 2 + 1 = 15
;--------------------------------------------------------------------
;;;;;;
MOV DataBuff1 + 0,#60H
MOV DataBuff1 + 1,#04H
MOV DataBuff1 + 2,#01H
MOV DataBuff1 + 3,#61H
MOV DataBuff1 + 4,#00H
MOV DataBuff1 + 5,#00H
;;;;;;
MOV DataLength,#06H
LCALL XORCheck
MOV DataBuff1 + 6,A
;;;;;;
MOV DataLength,#07H
LCALL ChangeHexToDbb
;;;;;;
MOV CardDataCount,#15
MOV R1,#DataBuff2
CardReadyLoop1:
MOV UARTData,@R1
INC R1
LCALL SoftUART_PutByte
DJNZ CardDataCount,CardReadyLoop1
;;;;;;
;--------------------------------------------------------------------
; Right: 0x60 0x05 SNR0 …SNR3 0x00 BCC 0x03
; recieve 17 byte 8 * 2 + 1 = 17
; Error: 0x60 0x01 0x01 BCC 0x03
; recieve 9 byte 4 * 2 + 1 = 9
;--------------------------------------------------------------------
;;;;;;
MOV CardDataCount,#17
MOV R1,#DataBuff2
CardReadyLoop2:
LCALL SoftUART_GetByte
MOV @R1,UARTData
CJNE @R1,#03H,CardReadyLoop3
AJMP CardReadyLoop4
CardReadyLoop3:
INC R1
DJNZ CardDataCount,CardReadyLoop2
CardReadyLoop4:
XCH A,CardDataCount
CJNE A,#01H,CardReadyLoop5
MOV CardStatus,#00H
;;;;;;
MOV DataLength,#12
LCALL ChangeDbbToHex
CardReadyLoop5:
RET
;--------------------------------------------------------------------
; FUNCTION: ReadCard
; INPUT: CardKeyType
; CardBlockNo
; CardKey
; OUTPUT: CardStatus,DataBuff1+2, ... ,DataBuff1+17
; CardStatus = 0 --> OK
; CardData: DataBuff1+2, ... ,DataBuff1+17
; USE: A,R1
;--------------------------------------------------------------------
ReadCard:
MOV CardStatus,#01H
;--------------------------------------------------------------------
; Command: 0x60 0x0A 0x01 0x62 KEYTYPE BlockNo KEY0 … KEY5 BCC 0x03
; send 27 byte 13 * 2 + 1 = 27
;--------------------------------------------------------------------
;;;;;;
MOV DataBuff1 + 0,#60H
MOV DataBuff1 + 1,#0AH
MOV DataBuff1 + 2,#01H
MOV DataBuff1 + 3,#62H
MOV DataBuff1 + 4,CardKeyType
MOV DataBuff1 + 5,CardBlockNo
;;;;;;
MOV R1,#CardKey
MOV DataBuff1 + 6,@R1
INC R1
MOV DataBuff1 + 7,@R1
INC R1
MOV DataBuff1 + 8,@R1
INC R1
MOV DataBuff1 + 9,@R1
INC R1
MOV DataBuff1 + 10,@R1
INC R1
MOV DataBuff1 + 11,@R1
;;;;;;
MOV DataLength,#12
LCALL XORCheck
MOV DataBuff1 + 12,A
;;;;;;
MOV DataLength,#13
LCALL ChangeHexToDbb
;;;;;;
MOV CardDataCount,#27
MOV R1,#DataBuff2
ReadCardLoop1:
MOV UARTData,@R1
INC R1
LCALL SoftUART_PutByte
DJNZ CardDataCount,ReadCardLoop1
;;;;;;
;--------------------------------------------------------------------
; Right: 0x60 0x11 DATA0 … DATA15 0x00 BCC 0x03
; recieve 41 byte 20 * 2 + 1 = 41
; Error: 0x60 0x01 ERRNO BCC 0x03
; recieve 9 byte 4 * 2 + 1 = 9
;--------------------------------------------------------------------
;;;;;;
MOV CardDataCount,#41
MOV R1,#DataBuff2
ReadCardLoop2:
LCALL SoftUART_GetByte
MOV @R1,UARTData
CJNE @R1,#03H,ReadCardLoop3
AJMP ReadCardLoop4
ReadCardLoop3:
INC R1
DJNZ CardDataCount,ReadCardLoop2
ReadCardLoop4:
XCH A,CardDataCount
CJNE A,#01H,ReadCardLoop5
MOV CardStatus,#00H
;;;;;;
MOV DataLength,#36
LCALL ChangeDbbToHex
ReadCardLoop5:
RET
;--------------------------------------------------------------------
; FUNCTION: WriteCard
; INPUT: CardKeyType
; CardBlockNo
; CardKey
; CardData+0, ... , CardData+15
; OUTPUT: CardStatus
; CardStatus = 0 --> OK
; USE: A,R1
;--------------------------------------------------------------------
WriteCard:
MOV CardStatus,#01H
;--------------------------------------------------------------------
; Command: 0x60 0x1A 0x01 0x63 KEYTYPE BlockNo KEY0 … KEY5 DATA0 … DATA15 BCC 0x03
; send 59 byte 29 * 2 + 1 = 59
;--------------------------------------------------------------------
;;;;;;
MOV DataBuff1 + 0,#60H
MOV DataBuff1 + 1,#1AH
MOV DataBuff1 + 2,#01H
MOV DataBuff1 + 3,#63H
MOV DataBuff1 + 4,CardKeyType
MOV DataBuff1 + 5,CardBlockNo
;;;;;;
MOV R1,#CardKey
MOV DataBuff1 + 6,@R1
INC R1
MOV DataBuff1 + 7,@R1
INC R1
MOV DataBuff1 + 8,@R1
INC R1
MOV DataBuff1 + 9,@R1
INC R1
MOV DataBuff1 + 10,@R1
INC R1
MOV DataBuff1 + 11,@R1
;;;;;;
MOV R1,#CardData
MOV DataBuff1 + 12,@R1
INC R1
MOV DataBuff1 + 13,@R1
INC R1
MOV DataBuff1 + 14,@R1
INC R1
MOV DataBuff1 + 15,@R1
INC R1
MOV DataBuff1 + 16,@R1
INC R1
MOV DataBuff1 + 17,@R1
INC R1
MOV DataBuff1 + 18,@R1
INC R1
MOV DataBuff1 + 19,@R1
INC R1
MOV DataBuff1 + 20,@R1
INC R1
MOV DataBuff1 + 21,@R1
INC R1
MOV DataBuff1 + 22,@R1
INC R1
MOV DataBuff1 + 23,@R1
INC R1
MOV DataBuff1 + 24,@R1
INC R1
MOV DataBuff1 + 25,@R1
INC R1
MOV DataBuff1 + 26,@R1
INC R1
MOV DataBuff1 + 27,@R1
;;;;;;
MOV DataLength,#28
LCALL XORCheck
MOV DataBuff1 + 28,A
;;;;;;
MOV DataLength,#29
LCALL ChangeHexToDbb
;;;;;;
MOV CardDataCount,#59
MOV R1,#DataBuff2
WriteCardLoop1:
MOV UARTData,@R1
INC R1
LCALL SoftUART_PutByte
DJNZ CardDataCount,WriteCardLoop1
;;;;;;
;--------------------------------------------------------------------
; Right: 0x60 0x01 0x00 BCC 0x03
; recieve 9 byte 4 * 2 + 1 = 9
; Error: 0x60 0x01 ERRNO BCC 0x03
; recieve 9 byte 4 * 2 + 1 = 9
;--------------------------------------------------------------------
;;;;;;
MOV CardDataCount,#09
MOV R1,#DataBuff2
WriteCardLoop2:
LCALL SoftUART_GetByte
MOV @R1,UARTData
CJNE @R1,#03H,WriteCardLoop3
AJMP WriteCardLoop4
WriteCardLoop3:
INC R1
DJNZ CardDataCount,WriteCardLoop2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -