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

📄 sle4442.a51_1

📁 按触式IC读卡程序 汇编代码 成功安例
💻 A51_1
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;SLE 4442 IC卡读写程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



$INCLUDE  (REG52.H)
 CCRST   EQU   P1.3;
 CCCLK   EQU   P1.4;
 CCIO    EQU   P1.5;
 SCL     EQU   P1.6
 SDA     EQU   P1.7




; RdMainMem   EQU  30H        ; outgoing data
; UpdMainMem  EQU  38H        ; processing 
; RdPrtMem    EQU  34H        ; outgoing data
; WrPrtMem    EQU  3CH        ; processing
; RdSecMem    EQU  31H        ; outgoint data
; UpdSecMem   EQU  39H        ; processing
; CmpVerDat   EQU  33H        ; processing

 SEC_BIT        BIT    22H.6 
 
  ACK     BIT    22H.7
  SUBA    DATA   5EH
  NUMBYTE DATA   5FH
 
 IC_WADDR       DATA   6AH   ;IC卡待写地址
 IC_WDATA       DATA   6BH   ;IC卡待写数据
 IC_NLEN        DATA   6CH   ;IC卡读取字节个数
 IC_ADDRFROM    DATA   6DH   ;IC卡EEPROM 起址地址
 IC_CMD1        DATA   6EH   ;IC卡命令字节1  
 IC_CMD2        DATA   6FH   ;IC卡命令字节2 
 IC_CMD3        DATA   70H   ;IC卡命令字节3 
 IC_BUFFER      EQU    71H   ;IC卡缓冲区
 IC_RDPROTEBUF  EQU    76H   ;IC卡读保护区缓冲
 IC_RDSCEBUF    EQU    7BH   ;IC卡读密码区缓冲
 IC_WBUFFER     DATA   80H   ;IC卡写缓冲区
; IC_WBUFFER2    DATA    81H
; IC_WBUFFER3    DATA    82H


PUBLIC IC_ADDRFROM,IC_NLEN,IC_BUFFER,IC_WADDR,IC_WDATA


PUBLIC SEC_BIT
PUBLIC IC_RESET,IC_READMAINMEMORY
PUBLIC UPDATAMAINMEMORY
PUBLIC COMPAREVERIDATA


CSEG AT 2200H    ;;;定位
 
;;短延時 
;;入口函數:ACC 
;;占用函数:ACC R7
IC_DELAY:
         MOV R7,A
IC_DELAY_LOOP:        
          NOP 
          NOP
          DJNZ R7,IC_DELAY_LOOP
          RET 

;IC卡時鍾信號
;调用函数:IC_DELAY(ACC,R7)
;
IC_ONEPLUS:
      SETB  CCCLK
      MOV  A,#14H
      LCALL IC_DELAY
      CLR   CCCLK
      LCALL IC_DELAY
      RET

;*reads 8 bits from the sle4442 & stores value in 'rd_data'  *
;IC卡讀8位
;读取字节子程序
;读出的值在ACC  R2暂存8BIT  R6计数
;;调用函数:IC_DELAY(ACC,R7)
 IC_READBYTE:
     MOV R6,#08H
 IC_RLP:
    ; SETB CCIO
    ; NOP
     SETB CCCLK     
     MOV C,CCIO 
     MOV A,#0AH
     LCALL IC_DELAY    
     CLR  CCCLK
     LCALL IC_DELAY
     MOV A,R2
     RRC A              ;低位在前
     MOV R2,A
     ;NOP 
     NOP
     NOP
     DJNZ R6,IC_RLP
     RET


;*6. sends 8 bit 'byte' to the sle4442       */
;;发送字节子程序
;;字节数据放入ACC   R6计数

IC_SENDBYTE:
    MOV R6,#08H
IC_WLP:
    RRC  A            ;低位在前
    JC   IC_WR_1
    SJMP  IC_WR_0
IC_WLP1:
    DJNZ R6,IC_WLP
    NOP
    RET
IC_WR_1:
    SETB CCIO      ;发送1
    NOP
    NOP
    NOP
    NOP 
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP 
    NOP
    NOP
    NOP
    NOP
    SETB CCCLK
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    CLR CCCLK
    NOP
    NOP
    NOP
    NOP 
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP 
    NOP
    NOP
    NOP
    NOP
    SJMP IC_WLP1
IC_WR_0:
    CLR CCIO     ;发送0
    NOP
    NOP
    NOP
    NOP 
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP 
    NOP
    NOP
    NOP
    NOP
    SETB CCCLK
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    CLR CCCLK
    NOP
    NOP
    NOP
    NOP 
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP 
    NOP
    NOP
    NOP
    NOP
    SJMP IC_WLP1     


;;;sle4442 Reset   reset and answer-to-reset read*/
;;RST后读EEPORM 前4个字节
;;调用函数:IC_DELAY(ACC,R7)  R3计字节数 R1地址累加
;;出口函数:IC_BUFFER 四字节
IC_RESET:
    CLR   CCCLK
    CLR   CCRST
    SETB  CCIO
    MOV A,#0FFH 
    LCALL IC_DELAY 
    LCALL IC_DELAY
    LCALL IC_DELAY
    SETB   CCRST
    MOV A,#0AH
    LCALL IC_DELAY
    SETB   CCCLK
    LCALL IC_DELAY
    CLR    CCCLK
    MOV A, #32H
    LCALL IC_DELAY
    CLR   CCRST
    MOV A,#0AH
    LCALL IC_DELAY
    MOV R3,#04H
    MOV R1,#IC_BUFFER
    
IC_RESET_READBYTE:
     LCALL IC_READBYTE
     MOV @R1,A   
     INC R1
     DJNZ R3,IC_RESET_READBYTE
     RET

 
 /* 发送命令至SLE442   3字节 */  
;;调用函数:IC_DELAY(ACC,R7) IC_SENDBYT(ACC,R6)
;;入口函数:IC_CMD1 IC_CMD2 IC_CMD3 
IC_SENDCOMMAND:
     ;;start condition  当时钟线为高的时候,IO线从1到0
     CLR  CCCLK   
     SETB CCIO
     MOV A,#04H
     LCALL IC_DELAY
     SETB  CCCLK
     MOV A,#08H
     LCALL IC_DELAY
     CLR    CCIO  
     LCALL IC_DELAY
     CLR   CCCLK
     MOV A,#05H
     LCALL IC_DELAY
     ;;start condition
     ;IC卡在时钟的上升沿读取数据
     MOV A,IC_CMD1
     LCALL IC_SENDBYTE
     MOV A,IC_CMD2
     LCALL IC_SENDBYTE
     MOV A,IC_CMD3
     LCALL IC_SENDBYTE
     ;;stop condition
     ;;当时钟线为高的时候, IO从0到1
     CLR CCIO
     MOV A,#0AH
     LCALL IC_DELAY
     SETB CCCLK
     LCALL IC_DELAY
     SETB  CCIO   ;命令发送结束
     LCALL IC_DELAY
     RET


;;读主存储器
;;调用函数:IC_DELAY(ACC,R7) IC_SENDCOMMAND(ACC,R7,R6) IC_READBYTE(R2,R6) IC_ONEPLUS  
;;         R1地址累加   R3计数
;;入口函数:  IC_ADDRFROM  IC_NLEN
;;出口函数:  IC_BUFFER
IC_READMAINMEMORY:
     MOV IC_CMD1,#30H         ;RdMainMem   0x30 
     MOV IC_CMD2,IC_ADDRFROM  ; 主存储器待读部分的起始地址
     MOV IC_CMD3,#00H
     LCALL IC_SENDCOMMAND     ;发送命令至SLE442  3字节 
     ;开始读取数据
     CLR CCCLK
     MOV A,#0AH
     LCALL IC_DELAY
     MOV A,#0FFH
     CLR C 
     SUBB A,IC_ADDRFROM
     MOV  R4,A              ;LEN 从ADDRFROM 到256                  
     MOV R3,IC_NLEN         ;NLEN 实际要读的个数
     MOV R1,#IC_BUFFER      ;R1地址累加
IC_READMAINMEMORY_READBYTE:               ;读主存从ADDRFROM 读到256 
    CJNE R3,#00H,TURE_MIANMEMROYREADBYTE  ;判断有没有读完有用的数
    SJMP FLUSE_MIANMEMROYREADBYTE         ;不想读的数
TURE_MIANMEMROYREADBYTE :     
     LCALL IC_READBYTE
     MOV @R1,A
     INC R1
     DJNZ R3,IC_READMAINMEMORY_READBYTE
     SJMP FLUSE_MIANMEMROYREADBYTE 
FLUSE_MIANMEMROYREADBYTE :
     LCALL IC_READBYTE                   ;要给脉冲,但丢弃数据
     DJNZ R4,IC_READMAINMEMORY_READBYTE 
     LCALL IC_ONEPLUS                    ;给个结束标志
     RET   
     

;;读取保护存储器(32字节)内容,一共32位,4个字节
;调用函数:IC_DELAY(ACC,R7) IC_SENDCOMMAND(ACC,R7,R6) IC_ONEPLUS R3计数 R1地址累加
;;;入口函数:无
;;出口函数:  IC_RDPROTEBUF 四字节
IC_READPROTECTEDMEM:
      MOV IC_CMD1,#34H     ;//RdPrtMem    0x34  
      MOV IC_CMD2,#00H
      MOV IC_CMD3,#00H
      LCALL IC_SENDCOMMAND     ;* 发送命令至SLE442  3字节
      ;;开始读取数据
      CLR CCCLK
      MOV A,#0AH
      LCALL IC_DELAY
      MOV R3,#04H              ;4字节
      MOV R0,#IC_RDPROTEBUF
IC_READPROTECTBYTE:
      LCALL IC_READBYTE
      MOV @R0,A
      INC R0
      DJNZ R3, IC_READPROTECTBYTE
      LCALL IC_ONEPLUS          ;// 给个结束标志
      RET



  ;//更新主存储器的内容
  ;调用函数:IC_DELAY(ACC,R7) IC_SENDCOMMAND(ACC,R7,R6) IC_ONEPLUS  R3计数
  ;;;入口函数:IC_WADDR IC_WDATA
  ;出口函数:无
UPDATAMAINMEMORY:
      MOV IC_CMD1,#38H    ;//UpdMainMem  0x38   
      MOV IC_CMD2,IC_WADDR
      MOV IC_CMD3,IC_WDATA
      LCALL IC_SENDCOMMAND     ;* 发送命令至SLE442  3字节
      ;给脉冲
      CLR CCCLK
      MOV A,#0AH
      LCALL IC_DELAY
      CLR CCIO
      LCALL IC_DELAY
      MOV R3,#0FEH
ERASEMAINMEMORY:
      LCALL IC_ONEPLUS
      DJNZ R3,ERASEMAINMEMORY  
      SETB CCIO
      MOV A,#0AH
      LCALL IC_DELAY
      LCALL IC_ONEPLUS
      RET


;更新保护存储器(32字节)中的内容
;调用函数:IC_DELAY(ACC,R7) IC_SENDCOMMAND(ACC,R7,R6) IC_ONEPLUS  R3计数
;;;入口函数:IC_WADDR IC_WDATA
;出口函数:无
WRITEPROTECTEMEM:
      MOV IC_CMD1,#3CH        ;//WrPrtMem    0x3C   
      MOV IC_CMD2,IC_WADDR
      MOV IC_CMD3,IC_WDATA
      LCALL IC_SENDCOMMAND     ;* 发送命令至SLE4442    
      ;给脉冲
      CLR CCCLK
      MOV A,#03H
      LCALL IC_DELAY
      CLR CCIO
      MOV A,#0AH
      LCALL IC_DELAY
      MOV R3,#0FEH             ;;;;;????????????????????
ERASEPROTECTMEMORY:
      LCALL IC_ONEPLUS
      DJNZ R3,ERASEPROTECTMEMORY 
      SETB CCIO
      MOV A,#0AH
      LCALL IC_DELAY
      LCALL IC_ONEPLUS
      RET

;;读取安全区的内容
;调用函数:IC_DELAY(ACC,R7) IC_SENDCOMMAND(ACC,R7,R6) IC_READBYTE(R2,R6)IC_ONEPLUS 
;;        R3计数   R1 地址累加
;;;入口函数:IC_WADDR IC_WDATA
;出口函数

⌨️ 快捷键说明

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