?? 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 + -