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

📄 main.asm

📁 MRFIC读写器-51汇编源程序及C51源程序.zip
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        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 + -