📄 iccard.asm
字号:
ORG 00H
LJMP START
ORG 0BH ;定时器0 中断
LJMP INT2
ORG 23H ;串行口通讯中断
LJMP INT5
RXD DATA 58H ;接收缓冲区
TXD DATA 20H ;发送缓冲区
SCER DATA 08H ;密码比较出错标志
EKER DATA 09H
DELERR DATA 0AH ;超时出错标志
OPR DATA 0BH ;操作码
DTR DATA 0CH ;通讯接收指针
DHR DATA 0DH
DTT DATA 0EH ;通讯发送指针
DHT DATA 0FH
SC1 DATA 10H ;密码字节1
SC2 DATA 11H ;密码字节2
ICNO DATA 12H ;IC卡的卡型
FUSE DATA 13H ;卡的熔丝标志
CASHREST EQU 01H ;存款余额校验出错标志
ADDCASH EQU 02H ;累计金额校验出错标志
START: MOV IE,#00H
MOV SP,#70H
MOV R0,#70H
STAR1: MOV @R0, #0 ;初始化内部RAM
DJNZ R0, STAR1
MOV R1, #0
SSE1: MOV R2, #0 ;延时以待稳定电平
SSE2: NOP
NOP
NOP
DJNZ R2, SSE2
DJNZ R1, SSE1
INIT: MOV TCON, #41H
MOV SCON, #50H
MOV TMOD, #21H
MOV TH1, #0FDH ;波特率为9600bps(晶振为11.0592MHz)
MOV IE, #92H ;8051的初始化
MOV IP, #12H
SETB P1.7
LCALL POWOFF
BEGIN: MOV DTR, #00H
MOV DHR, #00H
MOV DTT, #00H
MOV DHT, #00H
LCALL LOADORD ;将串口接收的命令装入CPU
MOV A, OPR
JZ BEGIN
LCALL POWON
JNZ BEGIN
OPRATE: CLR EA
MOV DPTR, #ORDTAB ;判断该执行何种操作
MOV R1, OPR
MOV A, R1
ADD A, R1
MOV R0, A
MOVC A, @A+DPTR
XCH A, R0
INC A
MOVC A, @A+DPTR
MOV DPL, A
MOV DPH, R0
CLR A
JMP @A+DPTR
ORDTAB:DW ORDEND ;错误操作
DW ICNUMBER ;获取IC卡的卡号
DW RDICCASH ;获取IC卡的金额
DW WTICCASH ;写IC卡金额及购物累计额
ORDEND: LCALL POWOFF
ANL SCON, #0FCH
SETB EA
SJMP BEGIN
ERR1: MOV 22H, #0FH ;无卡(密码出错, 校验出错, 非法卡)
SJMP ERROR
ERR2: MOV 22H, #0EH ;写金额出错
SJMP ERROR
ERR3: MOV 22H, #0BH ;写累加出错
ERROR: MOV 20H, #7FH
MOV 21H, #02H
ANL SCON, #0FCH
SETB EA
LCALL SEND
SJMP ORDEND
;读IC卡卡号子程序
;入口参数:无
;出口参数:24--2B, 存IC卡号(双备份)
ICNUMBER: LCALL TEST ;判IC卡是否正常接触
JNZ ERR1
MOV R2, #00H ;读卡号
MOV R3, #10H
MOV R0, #24H
MOV R4, #04H
LCALL POSITION
LCALL READ
MOV R0, #24H
MOV R4, #04H
ICNUM1: MOV A, @R0 ;卡号是否合法
CLR C
SUBB A, #0A0H
JNC ERR1
ANL A, #0FH
CLR C
SUBB A, #0AH
JNC ERR1
INC R0
DJNZ R4, ICNUM1
MOV R0, #24H ;双备份卡号
MOV R1, #28H
MOV R4, #04H
COPYNO: MOV A, @R0
MOV @R1, A
INC R0
INC R1
DJNZ R4, COPYNO
MOV 20H, #7FH
MOV 21H, #0BH
MOV 22H, #01H
MOV 23H, #02H
ANL SCON, #0FCH
SETB EA
LCALL SEND
LJMP ORDEND
;读IC卡余额子程序
;入口参数: 24--25, 存IC卡密码
;出口参数: 24--2F, 存IC卡余额(双备份); 30--31, 存折扣率
RDICCASH:MOV A, SCER ;是否是上次出错的密码
XRL A, #0FFH
JNZ NEXT
MOV A, SC1
XRL A, 24H
JNZ NEXT
MOV A, SC2
XRL A, 25H
JNZ NEXT
LJMP ERR1
NEXT: MOV R2, #00H ;错误计数是否有3次
MOV R3, #60H
MOV R0, #1FH
MOV R4, #01H
LCALL POSITION
LCALL READ
MOV R0, #00H
MOV A, 1FH
ERRADD: RLC A
JC NEXT1
INC R0
CJNE R0, #03H, ERRADD
LJMP ERR1
NEXT1: MOV SC1, 24H ;保存和比较主密码
MOV SC2, 25H
MOV R2, #00H
MOV R3, #4FH
MOV R0, #24H
MOV R4, #02H
LCALL COMPARE
JC NEXTC1
MOV SCER, #0FFH
LJMP ERR1
NEXTC1: MOV SCER, #00H
MOV R2, #00H ;判IC卡是否被烧掉FUSE
MOV R3, #50H
MOV R0, #24H
MOV R4, #02H
LCALL POSITION
LCALL READ
MOV A, 24H
XRL A, #0FFH
JNZ NEXTC2
MOV A, 25H
XRL A, #0FFH
JNZ NEXTC2
MOV 24H, SC1 ;IC卡的FUSE被烧
MOV 25H, SC2
MOV R2, #00H ;比较一区安全密码(1604)
MOV R3, #0A7H
MOV R0, #24H
MOV R4, #02H
LCALL COMPARE
JNC ERR10
MOV R2, #00H ;比较一区擦除密码(1604)
MOV R3, #0BFH
MOV R0, #24H
MOV R4, #02H
LCALL COMPARE
JNC ERR10
NEXTC2: MOV R2, #01H ;读取存款余额信息
MOV R3, #78H
MOV R0, #24H
MOV R4, #09H
LCALL POSITION
LCALL READ
MOV R2, #00H ;读取累计金额,卡级别与备份金额
MOV R3, #58H
MOV R4, #11H
LCALL REPOSI
LCALL READ
MOV R2, #01H ;读取备份累计金额
MOV R3, #0B8H
MOV R0, #3FH
MOV R4, #08H
LCALL REPOSI
LCALL READ
CLR CASHREST
CLR ADDCASH
MOV R0, #24H ;校验存款余额
MOV R4, #06H
LCALL COMOP
JZ CASNEX
SETB CASHREST
CASNEX: MOV R0, #36H ;校验备份存款余额
MOV R4, #06H
LCALL COMOP
JZ CASNEX1
JB CASHREST, ERR10
MOV R2, #02H ;将存款余额写入备份区
MOV R3, #60H
MOV R4, #08H
LCALL POSITION
LCALL ERASE
MOV R2, #02H
MOV R3, #60H
MOV R0, #24H
MOV R4, #08H
LCALL POSITION
LCALL WRITE
SJMP CASNEX2
ERR10: LJMP ERR1
CASNEX1:JNB CASHREST, CASNEX2
MOV 3EH, 2CH
MOV R2, #01H ;用备份刷清存款余额
MOV R3, #78H
MOV R4, #09H
LCALL POSITION
LCALL ERASE
MOV R2, #01H
MOV R3, #78H
MOV R0, #36H
MOV R4, #09H
LCALL POSITION
LCALL WRITE
MOV R0, #24H ;将存款余额移入发送区
MOV R1, #36H
MOV R4, #06H
COPYREST:MOV A, @R1
MOV @R0, A
INC R0
INC R1
DJNZ R4, COPYREST
CASNEX2:MOV R0, #2DH ;校验累计金额
MOV R4, #06H
LCALL COMOP
JZ CASNEX3
SETB ADDCASH
CASNEX3:MOV R0, #3FH ;校验备份累计金额
MOV R4, #06H
LCALL COMOP
JZ CASNEX4
JB ADDCASH, ERR10
MOV R2, #04H ;将累计金额写入备份区
MOV R3, #58H
MOV R4, #08H
LCALL POSITION
LCALL ERASE
MOV R2, #04H
MOV R3, #58H
MOV R0, #2DH
MOV R4, #08H
LCALL POSITION
LCALL WRITE
SJMP CASNEXE
CASNEX4:JNB ADDCASH, CASNEXE
MOV R2, #02H ;将备份累计与卡级别写回
MOV R3, #18H
MOV R4, #05H
LCALL POSITION
LCALL ERASE
MOV 47H, 35H
MOV R2, #02H
MOV R3, #18H
MOV R0, #3FH
MOV R4, #09H
LCALL POSITION
LCALL WRITE
CASNEXE: MOV A, 35H ;根据卡级别读取折扣率
CJNE A, #01H, CLS2
MOV R2, #03H ;第一级别
MOV R3, #0B0H
MOV R0, #30H
MOV R4, #02H
LCALL POSITION
LCALL READ
LJMP RDCASHE
CLS2: CJNE A, #02H, CLS3
MOV R2, #03H ;第二级别
MOV R3, #0F0H
MOV R0, #30H
MOV R4, #02H
LCALL POSITION
LCALL READ
LJMP RDCASHE
CLS3: MOV R2, #04H ;第三级别
MOV R3, #30H
MOV R0, #30H
MOV R4, #02H
LCALL POSITION
LCALL READ
RDCASHE: MOV R0, #24H ;双备份金额
MOV R1, #2AH
MOV R4, #06H
COPYCAS:MOV A, @R0
MOV @R1, A
INC R0
INC R1
DJNZ R4, COPYCAS
MOV 20H, #7FH ;发送正确回送信息
MOV 21H, #11H
MOV 22H, #01H
MOV 23H, #01H
ANL SCON, #0FCH
SETB EA
LCALL SEND
LJMP BEGIN
;写IC卡余额与金额累计子程序
;入口参数: 24--25,存IC卡密码; 26--2B,IC卡余额; 2C--31,存消费额.
;出口参数: 无
ERR11: LJMP ERR1
WTICCASH:MOV R2, #01H ;读IC卡原购物次数
MOV R3, #0B8H
MOV R0, #32H
MOV R4, #05H
LCALL POSITION
LCALL READ
MOV R2, #00H ;读IC卡原累计金额
MOV R3, #38H
MOV R0, #37H
MOV R4, #09H
LCALL REPOSI
LCALL READ
MOV R2, #01H ;读IC卡的折扣率与折扣金额
MOV R3, #50H
MOV R0, #40H
MOV R4, #14H
LCALL REPOSI
LCALL READ
MOV R0, #37H ;校验原累计金额
MOV R4, #06H
LCALL COMOP
JZ WTICNEX
MOV R2, #00H ;校验出错后读备份累计金额
MOV R3, #08H
MOV R0, #37H
MOV R4, #08H
LCALL REPOSI
LCALL READ
MOV R0, #37H
MOV R4, #06H
LCALL COMOP
JNZ ERR11
WTICNEX:MOV R0, #40H ;校验折扣率与折扣金额
MOV R4, #12H
LCALL COMOP
JNZ ERR11
ADDMON: MOV R0, #31H ;累加购物累计金额
MOV R1, #3CH
MOV R4, #06H
CLR C
ADDMO: MOV A, @R0
ADDC A, @R1
DA A
MOV @R1, A
DEC R0
DEC R1
DJNZ R4, ADDMO
MOV R0, #37H ;获取累计金额校验
MOV R4, #06H
LCALL GETOP
MOV R0, #26H ;获取卡余额校验
MOV R4, #06H
LCALL GETOP
MOV R0, #34H ;购物次数自加
MOV R1, #30H
MOV R4, #03H
SETB C
ADDNUM: MOV A, @R0
ADDC A, #00H
DA A
MOV @R1, A
DEC R0
DEC R1
DJNZ R4, ADDNUM
ADDNUM1:MOV R0, #2EH ;获取购物次数校验
MOV R4, #03H
LCALL GETOP
MOV R2, #01H ;写IC卡余额与购物次数
MOV R3, #78H
MOV R4, #0DH
LCALL POSITION
LCALL ERASE
MOV R2, #01H
MOV R3, #78H
MOV R0, #26H
MOV R4, #0DH
LCALL POSITION
LCALL WRITE
MOV R2, #01H ;校验所写卡余额
MOV R3, #78H
MOV R0, #2EH
MOV R4, #08H
LCALL POSITION
LCALL READ
MOV R0, #26H
MOV R1, #2EH
MOV R4, #08H
CASCMP: MOV A, @R0
XRL A, @R1
JNZ ERR20
INC R0
INC R1
DJNZ R4, CASCMP
WTCLASS: MOV R0, #37H ;根据累计额判卡级别
MOV R1, #42H
MOV R4, #06H
CLSCMP0:CLR C
MOV A, @R0
MOV 3FH, @R1
CJNE A, 3FH, CLSCMP1
INC R0
INC R1
DJNZ R4, CLSCMP0
MOV 3FH, #02H
LJMP CLSCMPE
ERR20: LJMP ERR2
ERR30: LJMP ERR3
CLSCMP1:JNC CLSCMP2
MOV 3FH, #01H
LJMP CLSCMPE
CLSCMP2:MOV R0, #37H
MOV R1, #4AH
MOV R4, #06H
CLSCMP3:CLR C
MOV A, @R0
MOV 3FH, @R1
CJNE A, 3FH, CLSCMP4
INC R0
INC R1
DJNZ R4, CLSCMP3
LJMP CLSCMP5
CLSCMP4:JNC CLSCMP5
MOV 3FH, #02H
LJMP CLSCMPE
CLSCMP5:MOV 3FH, #03H
CLSCMPE:MOV R2, #00H ;写IC卡累计金额与卡级别
MOV R3, #60H
MOV R4, #09H
LCALL REPOSI
LCALL ERASE
MOV R2, #02H
MOV R3, #18H
MOV R4, #09H
MOV R0, #37H
LCALL POSITION
LCALL WRITE
MOV R2, #02H ;校验所写累计金额
MOV R3, #18H
MOV R4, #08H
MOV R0, #2EH
LCALL POSITION
LCALL READ
MOV R0, #2EH
MOV R1, #37H
MOV R4, #08H
CASCMP1:MOV A, @R0
XRL A, @R1
JNZ ERR30
INC R0
INC R1
DJNZ R4, CASCMP1
WTCASH2: MOV R2, #00H ;写备份卡余额与累计金额
MOV R3, #08H
MOV R4, #08H
LCALL REPOSI
LCALL ERASE
MOV R2, #01H
MOV R3, #0B8H
MOV R4, #08H
LCALL REPOSI
LCALL ERASE
MOV R2, #02H
MOV R3, #60H
MOV R4, #08H
MOV R0, #26H
LCALL POSITION
LCALL WRITE
MOV R2, #01H
MOV R3, #0B8H
MOV R4, #08H
MOV R0, #37H
LCALL REPOSI
LCALL WRITE
MOV 20H, #7FH
MOV 21H, #03H
MOV 22H, #02H
MOV 23H, #01H
ANL SCON, #0FCH
SETB EA
LCALL SEND
LJMP ORDEND
;校验区是否合法子程序(双重校验)
COMOP: MOV A, R0
MOV R1, A
MOV A, R4
MOV R2, A
MOV A, #00H
COMOP1: ADD A, @R0
INC R0
DJNZ R4, COMOP1
CLR C
DA A
MOV 1EH, @R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -