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

📄 iccard.asm

📁 单片机汇编语言编写的IC卡读写程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
          CJNE  A, 1EH, CMPERR
	  MOV   A, R1
	  MOV   R0, A
	  MOV   A, R2
	  MOV   R4, A
	  MOV   A, #0FFH
  COMOP2: XRL   A, @R0
	  INC   R0
	  DJNZ  R4, COMOP2
	  CLR   C
	  DA    A
	  INC   R0
	  MOV   1EH, @R0
          CJNE  A, 1EH, CMPERR
          CLR   A              ;校验正确
	  RET
  CMPERR: MOV   A, #0FFH       ;校验出错
          RET
;获取校验字节子程序
;入口参数: R0, 存计算校验的起始地址;   R4, 存计算个数
;出口参数: 校验区的后两个字节
  GETOP:  MOV   A, R0
	  MOV   R1, A
	  MOV   A, R4
	  MOV   R2, A
	  MOV   A, #00H
  GETOP1: ADD   A, @R0
	  INC   R0
	  DJNZ  R4, GETOP1
	  CLR   C
	  DA    A
	  MOV   @R0, A
	  MOV   A, R1
	  MOV   R0, A
	  MOV   A, R2
	  MOV   R4, A
	  MOV   A, #0FFH
  GETOP2: XRL   A, @R0
	  INC   R0
	  DJNZ  R4, GETOP2
	  CLR   C
	  DA    A
	  INC   R0
	  MOV   @R0, A
	  RET
;检验IC 卡的正确性
;入口参数: 无                  ; 出口参数:  A=0 则正确
  TEST:   MOV   R2, #00H       ;检测SDV, CLK, RST线
          MOV   R3, #00H
          MOV   R4, #06H
          MOV   R0, #24H
          LCALL POSITION
          LCALL READ
          MOV   R0, #24H
          MOV   R4, #06H
  TEST1:  MOV   A, @R0
          CPL   A
          JNZ   TESTNEXT
          INC   R0
          DJNZ  R4, TEST1
 TESTNEXT:MOV   R2, #00H
          MOV   R3, #00H
          MOV   R4, #02H
          MOV   R0, #26H
          LCALL POSITION
          LCALL READ
          MOV   A, 24H
          XRL   A, 26H
          JNZ   TESTERR
          MOV   A, 25H
          XRL   A, 27H
          JNZ   TESTERR
  TESTE:  CLR   A
          RET
  TESTERR:LCALL POWOFF
          ANL   SCON, #0FCH
          SETB  EA
          MOV   A, #0FFH
          RET
; CPU从串口缓冲区读取操作命令子程序
; 入口参数: 无                    ; 出口参数: 无
; 所用寄存器: R0, R1, R2
 LOADORD: CLR   EA               ;前导码
	  LCALL TCL
	  SETB  EA
	  JNZ   LOADORD
	  MOV   A, R3
	  CJNE  A, #7FH, LOADORD
          MOV   DELERR, #0FFH
          MOV   TH0, #00H
          MOV   TL0, #00H
          SETB  TR0
          MOV   R0, #20H         ;长度
	  MOV   @R0, A
 SDIC1:   MOV   A, DELERR
          JZ    NOOPR
          CLR   EA
	  LCALL TCL
	  SETB  EA
	  JNZ   SDIC1
          MOV   A, R3
          XRL   A, #7FH
          JZ    SDIC1
          MOV   A, R3            ;接收命令内容
	  MOV   21H, A
	  MOV   R0, #22H
	  MOV   R4, A
 LOADOP:  MOV   A, DELERR
          JZ    NOOPR
          CLR   EA
	  LCALL TCL
	  SETB  EA
	  JNZ   LOADOP
	  MOV   A, R3
	  MOV   @R0, A
	  INC   R0
          DJNZ  R4, LOADOP
          CLR   TR0
          MOV   R0, #21H         ;校验
	  MOV   R4, 21H
	  MOV   A,  #00H
  ADDOP:  ADD   A, @R0
	  INC   R0
	  DJNZ  R4, ADDOP
	  XRL   A, @R0
	  JNZ   NOOPR
	  MOV   A, 22H
          CJNE  A, #01H, OPRT3
	  MOV   A, 23H
  OPRT1:  CJNE  A, #01H, OPRT2
          MOV   OPR, #02H
	  RET
  OPRT2:  CJNE  A, #02H, NOOPR
	  MOV   OPR, #01H
	  RET
  OPRT3:  CJNE  A, #02H, NOOPR
	  MOV   A, 23H
	  CJNE  A, #01H, NOOPR
	  MOV   OPR, #03H
	  RET
   NOOPR: MOV   OPR, #00H
	  RET
;CPU向串口发送信息子程序
;入口参数: 无                 ;出口参数: 无
;所用寄存器: R0, R1, R2, R5
   SEND:  MOV   DTT, #00H
	  MOV   A, 21H
	  ADD   A, #03H
	  MOV   DHT, A
	  MOV   R0, #21H
	  MOV   R4, 21H
	  MOV   A, #00H
   SEND1: ADD   A, @R0
	  INC   R0
	  DJNZ  R4, SEND1
	  MOV   @R0, A
	  INC   R0
	  MOV   @R0, #0FFH
   SEND3: MOV   R0, #DHT
	  MOV   1FH, @R0
	  SETB  TI
   SEND4: MOV   R1, #DTT
	  MOV   A, @R1
	  CJNE  A, 1FH, SEND4
	  RET
;发送一字节操作子程序
;入口参数: 无                   ;出口参数: 无
;所用寄存器: R0, R1
   TCL:   PUSH  0              ;向CPU芯片发送一字节
	  MOV   R0, #RXD
	  MOV   A, DTR
	  XRL   A, DHR
	  JZ    TCL1
	  MOV   A, DTR
	  ADD   A, R0
	  MOV   R0, A
	  MOV   A, @R0
	  MOV   R3, A
	  INC   DTR
	  MOV   A, DTR
	  XRL   A, #18H
	  JNZ   TCL0
	  MOV   DTR, #00H
   TCL0:  CLR   A
	  POP   0
	  RET
   TCL1:  MOV   A, #0FFH
	  POP   0
	  RET
   STL:   PUSH  0               ;通讯发送一字节
	  MOV   R0, #TXD
	  MOV   A, DTT
	  XRL   A, DHT
	  JZ    STL1
	  MOV   A, DTT
	  ADD   A, R0
	  MOV   R0, A
	  MOV   A, @R0
	  MOV   R3, A
	  INC   DTT
	  MOV   A, #00H
	  POP   0
	  RET
   STL1:  MOV   A, #0FFH
	  POP   0
	  RET
;接收一字节操作子程序
;入口参数: 无                  ;出口参数: 无
;所用寄存器: R0, R1
   SRL:   PUSH  0               ;通讯接收一字节
	  MOV   R0, #RXD
	  MOV   A, DHR
	  INC   A
	  XRL   A, DTR
	  JZ    SRL1
	  MOV   A, DHR
	  ADD   A, R0
	  MOV   R0, A
	  MOV   A, R3
	  MOV   @R0, A
	  INC   DHR
	  MOV   A, DHR
	  XRL   A, #18H
	  JNZ   SRL0
	  MOV   DHR, #00H
   SRL0:  CLR   A
	  POP   0
	  RET
   SRL1:  MOV   A, #0FFH
	  POP   0
	  RET
   RCL:   PUSH  0                       ;从CPU芯片接收一字节
	  MOV   R0, #TXD
	  MOV   A, #37H
	  CLR   C
	  SUBB  A, DHT
	  JC    RCL1
	  MOV   A, DHT
	  ADD   A, R0
	  MOV   R0, A
	  MOV   A, R3
	  MOV   @R0, A
	  INC   DHT
	  CLR   A
	  POP   0
	  RET
   RCL1:  MOV   A, #0FFH
	  POP   0
	  RET
   INT2:  MOV   DELERR, #00H
          RETI
   INT5:  PUSH  ACC              ;串行口通讯中断(第5号中断)程序
	  PUSH  PSW
	  PUSH  0
	  PUSH  1
	  PUSH  2
	  PUSH  3
   INT50: JB    TI, INT51
	  JB    RI, INT52
	  SJMP   INT5E
   INT51: CLR   TI
	  LCALL STL
	  JNZ   INT53
	  MOV   A,R3
	  MOV   SBUF, A
	  SJMP  INT5E
   INT52: CLR   RI
	  MOV   A, SBUF
	  MOV   R3, A
	  LCALL SRL
	  CLR   SM2
	  SJMP  INT5E
   INT53: SETB  REN
   INT5E: POP   3
	  POP   2
	  POP   1
	  POP   0
	  POP   PSW
	  POP   ACC
	  RETI
   ICIN:  JB    P3.3, ICINERR    ; IC卡是否插入
	  LCALL DELAY5M
          JB    P3.3, ICINERR
  ICINE:  RET
  ICINERR:MOV   A, #0FFH
	  SJMP  ICINE
   POWON: MOV   A, #00H          ;IC卡的上电子程序
	  LCALL ICIN
	  JNZ   POWONE
	  CLR   P1.6
	  CLR   P1.5
	  LCALL DELAY05M
	  CLR   P1.7
	  LCALL DELAY50M
	  CLR   P1.2
  POWONE: RET
   POWOFF:CLR   P1.2             ;IC卡的掉电子程序
	  CLR   P1.3
	  CLR   P1.4
	  CLR   P1.5
	  CLR   P1.6
	  LCALL DELAY05M
	  SETB  P1.7
	  RET
;IC 卡的复位子程序
;入口参数: 无                   出口参数: 无
   RESET: SETB  P1.6
	  SETB  P1.5
	  LCALL DELAY
	  CLR   P1.5
	  LCALL DELAY
	  CLR   P1.6
	  LCALL DELAY
	  RET
;定位子程序
;入口参数: R2,R3
;出口时CLK为低
   POSITION:  LCALL  RESET
      POS0:   CJNE   R3, #00H, POS2
	      CJNE   R2, #00H, POS1
	      RET
      POS1:   DEC    R2
      POS2:   DEC    R3
	      SETB   P1.5
	      LCALL  DELAY
	      CLR    P1.5
	      LCALL  DELAY
	      SJMP   POS0
;再次定位子程序
;入口参数: R2, R3
;出口参数: CLK为低
  REPOSI:   NOP
    POSI:   CJNE  R3, #00H, POSI2
	    CJNE  R2, #00H, POSI1
	    RET
    POSI1:  DEC    R2
    POSI2:  DEC    R3
	    SETB   P1.5
	    LCALL  DELAY
	    CLR    P1.5
	    LCALL  DELAY
	    SJMP   POSI
;读子程序
;入口参数:R0,R2,R3,R4         读若干字节放于R0所指单元中去
;出口时CLK为低
      READ: CLR    P1.6
            CLR    P1.3
	    SETB   P1.4
	    CLR    P1.5
	    LCALL  DELAY
       RD1: MOV    R5, #08H
       RD2: SETB   P1.2
	    LCALL  DELAY
	    MOV    C, P1.2
	    RLC    A
	    SETB   P1.5
	    LCALL  DELAY
	    CLR    P1.5
	    DJNZ   R5, RD2
	    MOV    @R0, A
	    INC    R0
	    DJNZ   R4, READ
	    LCALL  DELAY
	    RET
;写子程序
;入口参数: R0,R2,R3,R4         ;出口时CLK 为低
;所用寄存器: R6, R7
      WRITE:  CLR    P1.6
              SETB   P1.4
              MOV    A, @R0
	      MOV    R5, #08H
	WD1:  RLC    A
	      JNC    WD2
	      SJMP   WD4
	WD2:  SETB   P1.2
	      LCALL  DELAY
	      MOV    C, P1.2
	      JNC    WD4
        WD3:  SETB   P1.3
              CLR    P1.2
	      LCALL  DELAY
	      SETB   P1.5
	      LCALL  DELAY2M
	      CLR    P1.3
	      LCALL  DELAY3M
	      CLR    P1.5
              CLR    P1.3
	      LCALL  DELAY
              MOV    C, P1.2
              JC     WD3
	WD4:  SETB   P1.5
	      LCALL  DELAY
	      CLR    P1.5
	      DJNZ   R5, WD1
	      INC    R0
	      DJNZ   R4, WRITE
              LCALL  DELAY
	      RET
;擦除公共区子程序
;入口参数: R2, R3, R4
;出口时CLK 为低
      ERASE:  CLR    P1.6
              SETB   P1.4
	ER:   SETB   P1.3
	      SETB   P1.2
	      LCALL  DELAY
	      SETB   P1.5
	      LCALL  DELAY2M
	      CLR    P1.3
	      LCALL  DELAY3M
	      CLR    P1.5
	      LCALL  DELAY
	      MOV    R1, #08H
	ER1:  SETB   P1.5
	      LCALL  DELAY
	      CLR    P1.5
	      LCALL  DELAY
	      DJNZ   R1, ER1
	      DJNZ   R4, ER
              LCALL  DELAY
	      RET
;密码位比较子程序
;入口参数: R0, R2, R3, R4        ;出口时CLK 为高
;所用寄存器: R0, R2, R3, R4, R5
      COMP:  MOV   R5, #08H
      COM1:  SETB  P1.5
	     LCALL DELAY
	     MOV   A, @R0
	     RLC   A
	     MOV   @R0, A
	     MOV   P1.2, C
	     LCALL DELAY
	     CLR   P1.5
	     LCALL DELAY
	     DJNZ  R5, COM1
             MOV   A, @R0
             RLC   A
             MOV   @R0, A
	     INC   R0
	     DJNZ  R4, COMP
	     RET
;密码校验子程序
;入口参数: R0, R2, R3, R4         ;出口参数: PSW.CY,  CLK 为低
;所用寄存器: R5
    COMPARE: CLR    P1.6
             CLR    P1.3
             LCALL  POSITION
	     LCALL  COMP
	     MOV    R5, #08H
     COMPA1: SETB   P1.5
	     LCALL  DELAY
	     CLR    P1.5
             LCALL  DELAY
             SETB   P1.2          ;读出SCAC或ECAC中的第一位
	     LCALL  DELAY
	     MOV    C, P1.2
             JC     COMPA2        ;为'1'则密码正确
	     DJNZ   R5, COMPA1
	     LJMP   ERR
     COMPA2: SETB   P1.3          ;写该位为'0'
	     CLR    P1.2
	     LCALL  DELAY
	     SETB   P1.5
             LCALL  DELAY2M
	     CLR    P1.3
	     LCALL  DELAY3M
	     CLR    P1.5
             CLR    P1.3
             SETB   P1.2          ;校验是否写正确
	     LCALL  DELAY
	     MOV    C, P1.2
             JC     ERR
             SETB   P1.3          ;擦除SCAC或ECAC
	     SETB   P1.2
	     LCALL  DELAY
	     SETB   P1.5
	     LCALL  DELAY2M
	     CLR    P1.3
	     LCALL  DELAY3M
	     CLR    P1.5
	     LCALL  DELAY
             MOV    C, P1.2
	     RET
      ERR:   CLR    C             ;IC卡密码比较出错
	     RET
;所有的延时子程序
;延时8 US
     DELAY: MOV  R6, #06H
	    DJNZ R6, $
	    RET
;延时0.5MS
     DELAY05M:  MOV  R6, #0FAH
		DJNZ R6, $
		RET
;延时2MS
     DELAY2M: MOV  R6, #04H
	D2:   MOV  R7, #0FAH
	      DJNZ R7, $
	      DJNZ R6, D2
	      RET
;延时3MS
     DELAY3M: MOV  R6, #6H
	D3:   MOV  R7, #0FAH
	      DJNZ R7, $
	      DJNZ R6, D3
	      RET
;延时5MS
     DELAY5M: MOV  R6, #0AH
	D4:   MOV  R7, #0FAH
	      DJNZ R7, $
	      DJNZ R6, D4
	      RET
;延时50MS
     DELAY50M:  MOV  R6, #64H
	  D5:   MOV  R7, #0FAH
		DJNZ R7, $
		DJNZ R6, D5
		RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -