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

📄 iccard.asm

📁 单片机汇编语言编写的IC卡读写程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
          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 + -