📄 wg34l.asm
字号:
;---------------------------------------------------------------
; Reader : ID Tag for TaiWan Linghang
;---------------------------------------------------------------
; Wiegand 34 Format Out Card COde Number Byte = 4 Bytes
;===============================================================
; I/O Line/Port Define
Read_Speed equ 20h
; WDI bit P1.6
; Buzer bit P3.5
; RED_LED bit P1.0
; GRN_LED bit P3.7 ;
; EEPROM_CS bit P1.7
; EEPROM_SK bit P1.6
EEPROM_IO bit P1.4
; TxD_Enable bit P1.3 ; RD
; WGD0 bit P1.2
; WGD1 bit P1.1
;=======================================================
WDI bit P1.7;P1.7 ;P1.6 ;long;fang
Buzer bit P3.0;P1.0 ;P3.5 ; No Use
RED_LED bit P3.7 ; Using, Have Card is Off, Normal On
GRN_LED bit P1.1 ; No Use
EEPROM_CS bit P1.3
EEPROM_SK bit P1.2
EEPROM_DI bit P1.1
EEPROM_DO bit P1.0
TxD_Enable bit P3.5 ; RD
WGD0 bit P1.1
WGD1 bit P1.2
WGHD bit P1.4
;========
; SRAM source table, Register define
CardCodeNumber equ 04h ; Define Send to Host Card Code Bytes number
RS_RBuf equ 3eh ; Receive buffer start address = 3eh (buffer: 3eh -> 51h)
MAX_SERIAL_BUFFER equ 14h
Baud_Rate equ 0fah ; Fosc = 22.11843MHz, Baud Rate = 9600
Module_Type equ 'A' ; 41h
RS_SOH equ 's' ;09h
RS_EOH equ 'n' ;0dh
SerialBufPoint data 52h
RS_BCC data 53h
SerialFlag data 54h
RecFlag data 55h
HaveValidCard data 25h
LinkingFlag data 3bh
LoopTimes data 29h ; Speed of Read Card parament
LoopCounterLo data 28h
LoopCounterHi data 27h ; 1000
CardData_Buf equ 2Ah ; Card Buffer : 2AH(Lowest) -> 2DH(Highest)
Module_ID data 08h
AscHigh data 0eh
AscLow data 0fh
EEPROM_ADDR data 38h
EEPROM_DATA data 38h
HexCode data 39h
;---------------------------------------------------------------
ORG 0000H
LJMP Main
ORG 0003H
LJMP INT0_VCT
ORG 000BH
LJMP Timer0_VCT
ORG 0013H
LJMP INT1_VCT
ORG 0023H
reti
; LJMP UART_VCT
;---------------------------------------------------------------
;---------------------------------------------------------------
; Name : CharToAscii
; Input : HexCode(39h)
; Output : AscHigh(0EH),AscLow(0FH)
; Using : Acc,PSW
ORG 0026H
CharToAscii:
MOV A,39H
MOV 3AH,A
SWAP A
ANL A,#0FH
MOV 0EH,A
CLR C
SUBB A,#0AH
JC CharToAscii1
MOV A,0EH
ADD A,#37H
MOV 0EH,A
SJMP CharToAscii2
CharToAscii1:
MOV A,0EH
ADD A,#30H
MOV 0EH,A
CharToAscii2:
MOV A,39H
MOV 3AH,A
ANL A,#0FH
MOV 0FH,A
CLR C
SUBB A,#0AH
JC CharToAscii3
MOV A,0FH
ADD A,#37H
MOV 0FH,A
RET
CharToAscii3:
MOV A,0FH
ADD A,#30H
MOV 0FH,A
RET
;---------------------------------------------------------------
; Name : PutStart
; Input : None
; Output : None
; Description : Send Start Char ( SOH,Type,ID,FCMD)
PutStart:
MOV IE,#90H
CLR TR0
SETB TxD_Enable
MOV R7,#03H
LCALL VariableDelay
MOV A,#RS_SOH ; Slave ACK "SOH" Byte
LCALL PutChar
MOV 53H,#00H
MOV A,#Module_Type ; Slave ACK Module Type
LCALL PutChar
MOV A,08h ; Slave ACK ID
LCALL PutChar
MOV A,40h ; Slave ACK FCMD
LCALL PutChar
; MOV R7,#03H
; MOV R0,#3EH
;PutStart1:
; MOV A,@R0
; LCALL PutChar
; INC R0
; DJNZ R7,PutStart1
RET
;---------------------------------------------------------------
; Name : PutNoFCMDStart
; Input : None
; Output : None
; Description : Send Start Char ( SOH,Type,ID, 'U' )
PutNoFCMDStart:
MOV IE,#90H
CLR TR0
SETB TxD_Enable
MOV R7,#03H
LCALL VariableDelay
MOV 53H,#00H
MOV A,#RS_SOH ; Slave ACK "SOH" Byte
LCALL PutChar
MOV R7,#02H
MOV R0,#3EH
PutNoFCMDStart1:
MOV A,@R0
LCALL PutChar
INC R0
DJNZ R7,PutNoFCMDStart1
mov A,#'U'
lcall PutChar
RET
;---------------------------------------------------------------
; Name : PutHexCode
; Input : Bcc Code save in 39H
; Output : None
PutHexCode:
LCALL CharToAscii
MOV A,0EH
LCALL PutChar
MOV A,0FH
LCALL PutChar
RET
;---------------------------------------------------------------
; Name : PutStop
; Input : None
; Output : None
; Description : Send ("BCCHi BCCLo EOH") to Host
PutStop:
MOV 39H,53H
LCALL PutHexCode
MOV A,#RS_EOH
LCALL PutChar
MOV A,#0dh
LCALL PutChar
MOV R7,#03H
LCALL VariableDelay
CLR TxD_Enable
MOV IE,#97H
SETB TR0
MOV 24H,#00H
RET
;---------------------------------------------------------------
Send_Error:
lcall PutNoFCMDStart
mov A,#'1'
lcall PutChar
ljmp PutEnd
;---------------------------------------------------------------
; Name : RemoveBcc
; Description : Calculate BCC in Receive Operation, Remove this bcc code
;RemoveBcc:
; DEC 52H ; Receive Data Buffer Pointer
; MOV A,52H
; ADD A,#3EH ; Receive Data Buffer Start Address
; MOV R0,A
; MOV A,@R0
; XRL 53H,A
; RET
;---------------------------------------------------------------
; Name : CheckBCC
; Input : Receive Buffer, RS_BCC
; Output : Acc = 0, Check OK; Acc = 1, Check Failed
;CheckBCC:
; LCALL RemoveBcc
; LCALL RemoveBcc
; MOV 39H,53H
; LCALL CharToAscii
; MOV A,52H
; ADD A,#3EH
; MOV R0,A
; MOV A,@R0
; XRL A,0EH
; JNZ CheckBCC1
; INC 52H
; MOV A,52H
; ADD A,#3EH
; MOV R0,A
; MOV A,@R0
; XRL A,0FH
; JNZ CheckBCC1
; MOV A,#01H
; RET
;CheckBCC1:
; CLR A
; RET
;---------------------------------------------------------------
; Name : GetSRAM
;GetSRAM:
; lcall PutNoFCMDStart
; push 00h
; push 03h
; mov R0,#10h
; mov R3,#10h
;GetSRAM1:
; mov A,@R0
; MOV 39H,A
; LCALL PutHexCode
; inc R0
; djnz R3,GetSRAM1
; clr WDI
; setb WDI
; mov R0,#56h
; mov R3,#(64h-55h)
;GetSRAM2:
; mov A,@R0
; MOV 39H,A
; LCALL PutHexCode
; inc R0
; djnz R3,GetSRAM2
; pop 03h
; pop 00h
; lcall PutStop
; ret
;---------------------------------------------------------------
; Name : ReadFactoryCode
; Input : None
; Output : None
; Description : Host Get This Module Factory Serial Number ACK (FCMD = 'B')
; Slave ACK : " SOH Type ID FCMD 99001201 BCCHi BCCLo EOH "
; Start Factory Stop
ReadFactoryCode:
LCALL PutStart
MOV R5,#09H
push DPL
push DPH
mov DPTR,#Factory_SNR
ReadFactoryCode1:
CLR A
MOVC A,@A+DPTR
LCALL PutChar
INC DPL
DJNZ R5,ReadFactoryCode1
pop DPH
pop DPL
SJMP PutEND
;---------------------------------------------------------------
; Name : CheckFactoryCode
; Input : Factory Code (Save in 41H - 49H)
; Output : Acc = 0, Check OK; or not Acc = 1, Check Failed
CheckFactoryCode:
MOV R7,#09H
MOV R1,#41H
push DPL
push DPH
mov DPTR,#Factory_SNR
CheckFactoryCode1:
CLR A
MOVC A,@A+DPTR
XRL A,@R1
JNZ CheckFactoryCode2
INC DPL
INC R1
DJNZ R7,CheckFactoryCode1
pop DPH
pop DPL
LCALL PutStart
CLR A
ret
CheckFactoryCode2:
pop DPH
pop DPL
RET
;---------------------------------------------------------------
; Name : HostSetting_ID
; Input : None
; Output : None
HostSetting_ID:
LCALL CheckFactoryCode
JNZ HostRead_ID1
LCALL EEPROM_WrEnable
MOV 38H,#00H ; ID address
MOV 08H,4AH ; New ID
MOV R7,08H ; Save New ID
LCALL EEPROM_Byte_Write
LCALL EEPROM_Disable
SJMP PutEND
;---------------------------------------------------------------
; Name : HostRead_ID
; Input : None
; Output : None
HostRead_ID:
LCALL CheckFactoryCode
JNZ HostRead_ID1
MOV A,08H ; Put ID
LCALL PutChar
PutEND:
LCALL PutStop
HostRead_ID1:
RET
;---------------------------------------------------------------
; Name : HostGet_CardData
; Description : if Have Card, then Send Card Data to Host
; " SOH Type ID FCMD CardType Card Code BccHi BccLo EOH "
; Start '0' 4 bytes Stop
HostGet_CardData:
LCALL PutStart
MOV A,25H
MOV 26H,A
JZ HostGet_CardData2
MOV A,#30H ; Tag Type is '0' [SYRIS 32 bits R/O Card]
LCALL PutChar ; '0'
MOV R5,#04H
HostGet_CardData1:
MOV A,R5
ADD A,#29H ; Card data buffer [2AH(Lowest) -> 2DH(Highest)]
MOV R0,A
MOV 39H,@R0
LCALL PutHexCode
DJNZ R5,HostGet_CardData1
HostGet_CardData2:
LCALL PutStop
MOV 25H,#00H
MOV 3BH,#01H
CLR RED_LED
SETB GRN_LED
RET
;---------------------------------------------------------------
Init_8052:
MOV C,T0
MOV TMOD,#25H ; [Gate1 C/T M1 M0 Gate0 C/T M1 M0]
MOV TH1,#Baud_Rate ; Fosc = 11.0592MHz, BPS = 9600
MOV TL1,#Baud_Rate
MOV TCON,#55H ; [TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0]
MOV SCON,#50H ; [SM0 SM1 SM2 REN TB8 RB8 TI RI]
MOV PCON,#00h ; SMOD = 0, Double Baud Rate Bit Disable
MOV IP,#10H ; [- - - PS PT1 PX1 PT0 PX0]
CLR TxD_Enable
CLR EEPROM_CS
SETB WDI ; WatchDOG
LCALL GreenLed_ON
MOV R7,#0C8H
LCALL VariableDelay
LCALL GreenLed_ON
CLR WDI
MOV 08H,#'1' ; if [Module ID Number] < 1 or [Module ID Number] > 9, Then [Module ID Number] = 1
MOV IE,#80H ; [EA - - ES ET1 EX1 ET0 EX0]
ret
;---------------------------------------------------------------
; Main Program Start
;---------------------------------------------------------------
Main:
MOV SP,#64H
setb WGD0
setb WGD1 ; init Wiegand DATA line
lcall Init_8052
clr A
MOV 3BH,A ; LinkingFlag = 0
MOV 25H,A ; CardIsValidFlag = 0
MOV 24H,A
MOV 09H,A
Main_Loop:
; { // Check LoopCounter -> [(27H)(28H)] > 1000
MOV R6,27H
INC 28H
MOV A,28H
JNZ Main3
INC 27H
; [(27H)(28H)] + 1
Main3:
DEC A ; Judge [(27H)(28H)] < 1000 ?
SETB C
SUBB A,#0E8H ;
MOV A,R6
SUBB A,#03H
JC Main4 ;
; [(27H)(28H)] > 1000
CLR A
MOV 27H,A
MOV 28H,A
; [(27H)(28H)] = 0000
; } // Check LoopTimes -> [(29H)] > 5 ?
MOV R7,29H
INC 29H
MOV A,R7
CLR C
SUBB A,#05H ; (29H) > 5 ?
JC Main4
; (29H) > 5
CLR Buzer
; setb Buzer
MOV A,R7
CLR C
SUBB A,#Read_Speed ; Old Value (=20H), Change the Value Read Card Speed can be Fast
JC Main4
; (29H) > 20H
CLR A
MOV 29H,A
; Clear Old Card buffer
MOV 31H,A
MOV 32H,A
MOV 33H,A
MOV 34H,A
;
MOV 35H,A
MOV 0AH,A
Main4:
MOV A,24H
JZ Main5
LCALL S069C ; Check Card Code
SJMP SerialProc
Main5:
MOV A,3BH
JZ Main6
MOV A,25H
DEC A
JNZ Main6
MOV A,#01H
MOV 29H,#00H
SJMP Main7
Main6:
CLR A
Main7:
JNZ SerialProc
MOV A,09H
JZ Main8
MOV 24H,#01H
SJMP SerialProc
Main8:
MOV IE,#87H ; [EA - - ES ET1 EX1 ET0 EX0]
SETB TR0
SerialProc:
MOV A,54H ; Check "SerialFlag" wasn't Valid
JZ Main9
lcall HostAccessedACK
Main9:
SETB WDI
CLR WDI
DEC 3DH
MOV A,3DH
JNZ Main10
DEC 3CH
MOV A,3CH
JNZ Main10
; setb Buzer
CLR Buzer ; Buzer
MOV A,3BH ; if LinkingFlag = 1, Then Green Led Don't Care
JNZ Main10
CLR RED_LED ; LED of RED
SETB GRN_LED ; LED of GRN
Main10:
LJMP Main_Loop
;---------------------------------------------------------------
; Name : HostAccessedACK
; Description : ACK to Host
HostAccessedACK:
; Receive Buffer Data Format: Type ID FCMD DATA BCCHi BCCLo
; 3EH 3FH 40H
; LCALL CheckBCC ; Check Bcc of Receive buffer
; JZ SerialProcOK
; MOV R7,40H ; FCMD = (40H)
; MOV A,3FH ; Module_ID
; XRL A,08H ; Isn't this Module ID Number?
; JNZ SerialProc3
; MOV A,R7
; XRL A,#'F' ; FCMD = 'F' ?
; JNZ SerialProc1
; LCALL HostGet_CardData
; SJMP SerialProcOK
;SerialProc1:
; MOV A,R7
; XRL A,#'B' ; FCMD = 'B' ?
; JNZ SerialProc30
; LCALL ReadFactoryCode
; SJMP SerialProcOK
;SerialProc30:
; lcall Send_Error
; sjmp SerialProcOK
;SerialProc3:
; MOV A,3FH ; Module_ID
; XRL A,#'0' ; Isn't Comm Module ID Number?
; JNZ SerialProcOK
; MOV A,R7
; XRL A,#'D' ; FCMD = 'D' ?
; JNZ SerialProc4
; LCALL HostRead_ID
; SJMP SerialProcOK
;SerialProc4:
; MOV A,R7
; XRL A,#'C' ; FCMD = 'C' ?
; JNZ SerialProcOK
; LCALL HostSetting_ID
;SerialProcOK:
MOV 54H,#00H ; Set "SerialFlag" is Unvalid
mov 3EH,#00h
mov 3FH,#00h
mov 40H,#00h
ret
; Timer0 Vctor Program
;---------------------------------------------------------------
Timer0_VCT:
PUSH ACC
CLR A
MOV TH0,A
MOV TL0,A
MOV 0AH,A
POP ACC
RETI
;---------------------------------------------------------------
;---------------------------------------------------------------
INT0_VCT:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -