📄 tic4.asm
字号:
DEALPCOUT: LCALL SENDTOPC
DEALPCOUT1:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GETPARA_RE:
JNB FLAG1.6,GETPARA_RE1
CLR FLAG1.6
LCALL WRREADIC ;无法正确读出数据
SJMP GETPARA_RE2
GETPARA_RE1: LCALL RIREADIC ;读出正确数据
GETPARA_RE2: RET
;===========读2401中数据=============
GETPARA:
MOV TEMP0,#3EH ;判断参数是否有效
LCALL READ24C01
MOV A,TEMP2
CJNE A,#5AH,GSTART_0_1
LCALL READMAINPARA ;读主参数区数据
JNC GETPARA_OUT
LCALL READBAKPARA ;读备份参数区数据
JNC GETPARA_OUT
AJMP GSTART_0_3
GSTART_0_1:
CJNE A,#55H,GSTART_0_3
LCALL READBAKPARA ;备份参数区正确
JNC GETPARA_OUT
GSTART_0_3: SETB FLAG1.6
SJMP GETPARA_OUT1
GETPARA_OUT: CLR FLAG1.6
GETPARA_OUT1:
RET
;======================================
;从主记录区中得到参数
;======================================
READMAINPARA:
MOV R1,#DATACON3 ;单片机中地址
MOV R2,DATACON ;2401中地址
MOV R4,DATACON1 ;需读数据个数
LCALL PARAM1
LCALL ADDALL
MOV A,CHECKSUM
MOV CHECKIC,A
MOV R1,#DATACON3 ;单片机中地址
MOV R2,DATACON ;2401中地址
MOV R4,DATACON1 ;需读数据个数
LCALL PARAM1
LCALL ADDALL
MOV A,CHECKSUM
CJNE A,CHECKIC,READMAINPARA_1
CLR C
SJMP READMAINPARA_OUT
READMAINPARA_1:
SETB C
MOV TEMP0,#3EH
MOV TEMP2,#55H
LCALL WRITE24C01
READMAINPARA_OUT:
RET
;======================================
;从备份记录区中得到参数
;======================================
READBAKPARA:
MOV R1,#DATACON3 ;单片机中地址
MOV A,DATACON
ADD A,#40H
MOV R2,A ;2401中地址
MOV R4,DATACON1 ;需读数据个数
LCALL PARAM1
LCALL ADDALL
MOV A,CHECKSUM
MOV CHECKIC,A
MOV R1,#DATACON3 ;单片机中地址
MOV A,DATACON
ADD A,#40H
MOV R2,A ;2401中地址
MOV R4,DATACON1 ;需读数据个数
LCALL PARAM1
LCALL ADDALL
MOV A,CHECKSUM
CJNE A,CHECKIC,READBAKPARA_1
CLR C
SJMP READBAKPARA_OUT
READBAKPARA_1:
SETB C
MOV TEMP0,#3EH
MOV TEMP2,#0AAH
LCALL WRITE24C01
READBAKPARA_OUT:
RET
;=============2401校验和(读数据用)============
ADDALL:
CLR C
MOV R1,#DATACON3
MOV R2,DATACON1
MOV A,#00H
PARA:
ADD A,@R1
INC R1
DJNZ R2,PARA
MOV CHECKSUM,A
RET
;==========读指定区域的数据==========
PARAM1:
MOV A,R2 ;读出所有数据
MOV TEMP0,A
LCALL READ24C01
MOV A,TEMP2
MOV @R1,A
INC R1
INC R2
DJNZ R4,PARAM1
RET
;=========向2401中写数据==========
WRITESAVE :
MOV TEMP0,DATACON ;2401中的地址
MOV R0,#DATACON2 ;需向2401写的数据
MOV R1,DATACON1 ;需写数据个数
LCALL SENDDATA
MOV A,DATACON
ADD A,#40H
MOV TEMP0,A
MOV R0,#DATACON2
MOV R1,DATACON1
LCALL SENDDATA
MOV TEMP0,#3EH
MOV TEMP2,#5AH ;写标志
LCALL WRITE24C01
RET
;=========向2401写数据=============
SENDDATA:
MOV TEMP2,@R0
LCALL WRITE24C01
INC TEMP0
INC R0
DJNZ R1,SENDDATA
RET
;============校验和(写数据用)=========
ADDALL1:
CLR C
MOV R1,#DATACON2
MOV R2,DATACON1
MOV A,#00H
PARA1:
ADD A,@R1
INC R1
DJNZ R2,PARA1
MOV CHECKSUM,A
RET
;========读IC卡中数据============
READICCARD:
MOV R5,#08H ;(IN IC)上次写数据时是否拔卡
MOV R7,#01H ;
MOV R6,#CHECKIC ;(IN RAM)
LCALL READ_CARD
MOV A,CHECKIC
CJNE A,#55H,USER_CARD_1
MOV A, DATACON ;读备份区数据
ADD A,#90H
MOV R5,A ;(IN IC)
MOV R7,DATACON1 ; DATA LONG
MOV R6,#DATACON3 ;(IN RAM)
LCALL READ_CARD
LCALL ADDALL
MOV A,CHECKSUM
MOV CHECKIC,A
MOV A, DATACON ;读备份区数据
ADD A,#90H
MOV R5,A ;(IN IC)
MOV R7,DATACON1 ; DATA LONG
MOV R6,#DATACON3 ;(IN RAM)
LCALL READ_CARD
LCALL ADDALL
MOV A,CHECKSUM
CJNE A,CHECKIC,USER_CARD_2
LCALL TRIOUTIC ;读写数据时是否拔卡
CJNE A,#0FFH,USER_CARD_0
SJMP USER_CARD_2
USER_CARD_0:
MOV A, DATACON ;将数据写到卡主区
ADD A,#20H
MOV R5,A ;(IN IC)
MOV R7,DATACON1 ; DATA LONG
MOV R6,#DATACON3 ;(IN RAM)
LCALL WRITE_CARD
MOV R5,#08H ;(IN IC) 将卡更新标志
MOV R7,#01H ;21H
MOV R6,#0AAH ;(IN RAM)
LCALL WRITE_CARD
SJMP USER_CARD_4
USER_CARD_1:
MOV A, DATACON ;读主区数据
ADD A,#20H
MOV R5,A ;(IN IC)
MOV R7,DATACON1 ; DATA LONG
MOV R6,#DATACON3 ;(IN RAM)
LCALL READ_CARD
LCALL ADDALL
MOV A,CHECKSUM
MOV CHECKIC,A
MOV A, DATACON ;读备份区数据
ADD A,#20H
MOV R5,A ;(IN IC)
MOV R7,DATACON1 ; DATA LONG
MOV R6,#DATACON3 ;(IN RAM)
LCALL READ_CARD
LCALL ADDALL
MOV A,CHECKSUM
CJNE A,CHECKIC,USER_CARD_2
LCALL TRIOUTIC
CJNE A,#0FFH,USER_CARD_3
SJMP USER_CARD_2
USER_CARD_3:
MOV A, DATACON ;将数据写到卡备份区
ADD A,#90H
MOV R5,A ;(IN IC)
MOV R7,DATACON1 ; DATA LONG
MOV R6,#DATACON3 ;(IN RAM)
LCALL WRITE_CARD
SJMP USER_CARD_4
USER_CARD_2: SETB FLAG1.6
SJMP USER_CARD_OUT
USER_CARD_4: CLR FLAG1.6
USER_CARD_OUT: RET
;==========写IC卡中数据===========
WRITEICCARD: JNB TEMP1.1,WRITEIC_10
LCALL WRITEICKEY
WRITEIC_10: MOV CHECKIC,#55H
MOV R5,#08H ;(IN IC)
MOV R7,#01H ;21H
MOV R6,#CHECKIC ;(IN RAM)
LCALL WRITE_CARD
MOV A, DATACON ;将数据写到卡主区
ADD A,#20H
MOV R5,A ;(IN IC)
MOV R7,DATACON1 ; DATA LONG
MOV R6,#DATACON2 ;(IN RAM)
LCALL WRITE_CARD
MOV CHECKIC,#0AAH
MOV R5,#08H ;(IN IC)
MOV R7,#01H ;21H
MOV R6,#CHECKIC ;(IN RAM)
LCALL WRITE_CARD
MOV A, DATACON ;将数据写到卡备份区
ADD A,#90H
MOV R5,A ;(IN IC)
MOV R7,DATACON1 ; DATA LONG
MOV R6,#DATACON2 ;(IN RAM)
LCALL WRITE_CARD
RET
;======读写数据时是否拔卡===========
TRIOUTIC:
MOV A,#0FFH
MOV R0,DATACON1
MOV R1,#DATACON3
RIOUTIC: ANL A,@R1
INC R1
DJNZ R0,RIOUTIC
RET
;============加密解密使用================
PASSKEY: MOV A,DATAL
CJNE A,#01H,PASSKEY1
SJMP PASSKEY_OUT
PASSKEY1: MOV R0,#01H
MOV R1,#DATACON
CONGET: LCALL GETREAL ;得到加密结果
INC R0
INC R1
MOV A,R0
CJNE A,DATAL,CONGET
PASSKEY_OUT: RET
;===========得到加密解密结果=============
GETREAL:
MOV A, #6EH
ADD A, R0
MOV B,S2
MUL AB
ADD A,S1
MOV TEMPS1,A
MOV A, #6FH
ADD A, R0
MOV B,S2
MUL AB
ADD A,S1
MOV B,TEMPS1
MUL AB
XRL A,@R1
MOV @R1, A
RET
;====向PC送接收正确==========
RERIGHT: MOV DATAF,#0AAH
MOV DATAL,#01H
LCALL GENERALSEND
RET
;====向PC送接收错误==========
REWRONG: MOV DATAF,#0BBH
MOV DATAL,#01H
LCALL GENERALSEND
RET
;=======错卡(无效卡 )======
WRONGICSEND: MOV DATAF,#5AH
MOV DATAL,#01H
LCALL GENERALSEND
RET
;============卡已拔出========
OUTCARD: MOV DATAF,#58H
MOV DATAL,#01H
LCALL GENERALSEND
RET
;====插入本系统的卡==========
IN_IC: MOV DATAF,#57H
MOV DATAL,#01H
LCALL GENERALSEND
RET
;====插入新卡==========
IN_NEWIC: MOV DATAF,#5BH
MOV DATAL,#01H
LCALL GENERALSEND
RET
;========向PC送读到的数据========
RIREADIC: MOV DATACON2,#0AAH
MOV A,#04H
ADD A,DATACON1
MOV DATAL,A
LCALL GENERALSEND
RET
;========向PC送读写数据失败========
WRREADIC: MOV DATACON2,#55H
MOV DATAL,#04H
LCALL GENERALSEND
RET
;=======向PC送写数据成功========
RIGHTSAVE: MOV DATACON2,#0AAH
MOV DATAL,#04H
LCALL GENERALSEND
RET
;=======送数时的公共子程序============
GENERALSEND:
LCALL GETRANDOM
MOV A,#04H
ADD A,R
ADD A,DATAL
MOV DATALONG,A
MOV A,#R
ADD A,DATAL
MOV R0,A
MOV R1,#00H
LCALL GETWI
LCALL PASSKEY
LCALL SEDATAADD
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -