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

📄 sle4442.inc

📁 单片机用TDS-ICE仿真器的试验程序。
💻 INC
📖 第 1 页 / 共 2 页
字号:
;********************************************************************************************
;                    SLE4442 通用读写模块使用说明                            
;    ReadCard 读出从StartAdr开始的ByteNum字节,结果存放于ReadBuf中,读出正确,ACC中返回#0,
;返回#01表示无效卡或者卡损坏。
;    WriteCard从StartAdr开始写入ByteNum字节,待写入数据存放于WriteBuf中,写入正确ACC中返回#0,
;返回#01表示无效卡或者卡损坏。
;    ReadCard和WriteCard的ByteNum的最大值为16, 见下面的变量定义
;    写卡之前一定要调用CheckPassword核对密码,密码存放于PSWD开始的三个单元,ACC中返回#0表示核对正确,
;#01表示无效卡或者卡损坏,#02表示密码错,#03H表示卡已被锁闭,#04H表示该卡还有一次试验机会。
;    核对密码完成后,EC开始的4个单元返回错误计数值及密码。
;    若要对保护存储区进行写保护,请调用WriteProtect子程序,参数及返回值与WriteCard相同。
;读保护存储器调用ReadProtect,参数及返回值同ReadCard。                                          
;********************************************************************************************

 
;*************IC卡引脚位定义*************************
RST       BIT    P1.2	    ;复位
IO        BIT    P1.0	    ;数据
CLK       BIT    P1.1 	    ;脉冲

;*******************变量定义*********************
;Variabal
ReadBuf   EQU    30H	    ;读缓冲区,16个字节  
WriteBuf  EQU    40H	    ;写缓冲区,16个字节
EC        EQU    50H        ;4字节临时单元
PSWD      EQU    54H        ;3字节密码单元
ByteNum   EQU    57H	    ;读写的字节数
StartAdr  EQU    58H	    ;读写时的起始地址

;*************IC卡常数***************************
Idetify1    	EQU   	0A2H     ;此处为IC卡保护区00~03单元的值,用于识别卡
Idetify2    	EQU   	13H
Idetify3    	EQU   	10H
Idetify4    	EQU   	91H     
;************************************************

;****************************************
;函数名称: ReadCard
;功能描述: 从主存储器中读出数据块
;入口参数:RecBuf   --- 接收缓冲区地址
;	   ByteNum  --- 要求读的字节数
;	   StartAdr --- 主存储器的起始地址
;返回参数: A --- 为0读成功
;	   A --- 表示无效卡或者卡损坏
;*****************************************
ReadCard: LCALL Anrst
          JNZ   ReadExit    	;复位不成功,退出   		
          MOV   R0,#ReadBuf	;接收缓冲区地址
          MOV   R2,ByteNum	
          MOV   R5,StartAdr	
          LCALL  Remm		;调用读主存储器子程序
          MOV   A,#00H 
ReadExit: RET

;*********************************************
;函数名称: WriteCard
;功能描述: 向主存储器中写入数据块
;入口参数:WriteBuf --- 发送缓冲区地址
;	   ByteNum  --- 要写入的字节数
;	   StartAdr --- 写主存储器的起始地址
;返回参数: A --- 为0写成功
;	   A --- 表示无效卡或者卡损坏
;*********************************************
WriteCard: 
	   LCALL  Anrst
           JNZ    WriteExit 
           MOV    R0,#WriteBuf
           MOV    R2,ByteNum
           MOV    R5,StartAdr	;给出各个入口参数
WriteLoop:	
           MOV    A,@R0
           MOV    R6,A
           LCALL  Wrmm		;写入一个字节
           INC    R0
           INC    R5
           DJNZ   R2,WriteLoop  ;判断是否写入了指定的字节数
           MOV    A,#00H	;读成功,返回0
WriteExit:
           RET

;*******************************************************
;函数名称: ReadProtect
;功能描述: 从保护存储器中读出数据块
;入口参数:RecBuf   --- 接收缓冲区地址
;	   ByteNum  --- 要求读的字节数(取值1 - 4)
;	   StartAdr --- 保护存储器的起始地址(取值0 - 3)
;返回参数: A --- 为0读成功
;	   A --- 表示无效卡或者卡损坏
;*******************************************************
ReadProtect:
            LCALL Anrst
            JNZ   RpExit       
             
            MOV   R0,#ReadBuf
            MOV   R2,ByteNum
            MOV   R5,StartAdr	;给出各个入口参数
            LCALL Repm		;读保护存储器
            MOV   A,#00H	;读成功,返回0
RpExit: 
            RET

;**********************************************
;函数名称: WriteProtect
;功能描述: 保护保护数据区(32字节)中的数据块,
;    	   写入的数据必须与原数据相等
;入口参数:WriteBuf --- 发送缓冲区地址
;	   ByteNum  --- 要写入的字节数
;	   StartAdr --- 写主存储器的起始地址
;返回参数: A --- 为0写成功
;	   A --- 表示无效卡或者卡损坏
;***********************************************
WriteProtect: 
	     LCALL  Anrst
             JNZ    WpExit 
             MOV    R0,#WriteBuf
             MOV    R2,ByteNum
             MOV    R5,StartAdr	  ;给出各个入口参数
WpLoop:
       MOV    A,@R0
       MOV    R6,A
       LCALL  Wrpm	    ;写入一个字节
       INC    R0	    ;缓冲区地址加1
       INC    R5	    ;写入地址加1
       DJNZ   R2,WpLoop
       MOV    A,#00H	    ;写成功,返回0
WpExit:
       RET


;**************************************************
;函数名称: CheckPassword
;功能描述: 校验密钥
;入口参数:PSWD  --- 密钥值,3个字节
;返回参数: A --- 0: 核对密码成功
;	   A --- 1: 表示无效卡或者卡损坏
;	   A --- 2: 核对密码失败
;	   A --- 3: 卡已报废
;	   A --- 4: 只剩一定校验机会
;注    意: 该程序只允许两次重试,以避免卡损坏	
;***************************************************
CheckPassword:
          LCALL   Anrst
          JNZ     CheckExit

          LCALL   Rescm               ;读加密存储器,获取错误计数器值
          MOV     A,EC
          ANL     A,#07h
          JZ      IsBadCard           ;EC=0,卡已报废
          RRC     A
          JNC     ChkPsw1
          MOV     A,EC
          ANL     A,#06h              ;将EC的一位写"0"
          JZ      HaveOneChance       ;该卡还有一次试验机会
          SJMP    ChkPsw2
ChkPsw1:    
          RRC     A
          JNC     HaveOneChance       ;该卡还有一次试验机会
          MOV     A,EC
          ANL     A,#05H
          JZ      HaveOneChance       ;该卡还有一次试验机会 
ChkPsw2:  
          MOV     R5,#00H
          MOV     R6,A                
          LCALL   Wrscm               ;将EC写回卡
          MOV     R2,#3                
          MOV     R5,#01H             ;卡内密码首址
          MOV     R0,#PSWD            ;参考数据首址
ChkPswLoop:  
          MOV     A,@R0
          MOV     R6,A
          LCALL   Verda               ;开始核对密码
          INC     R0                  
          INC     R5                  
          DJNZ    R2, ChkPswLoop
          MOV     R5,#00H             
          MOV     R6,#0FFH
          LCALL   Wrscm               ;擦除错误计数器
          LCALL   Rescm               ;读错误计数器以检查核对是否成功
          MOV     A,EC
          ANL     A,#07H
          CJNE    A,#07H,IS_FAIL      ;错误计数器不能擦除,核对密码失败
          MOV     A,#00H              ;错误计数器正确擦除,核对密码成功
CheckExit:
          RET   

                  
IS_FAIL:                               ;核对密码失败
          MOV    A,#02H
          RET
IsBadCard:
          MOV    A,#03H		       ;卡已报废
          RET
HaveOneChance:
          MOV    A,#04H		       ;只剩下一次校验机会
          RET


;**************************************************
;函数名称: SendComm
;功能描述: 向卡发送命令,一个命令的长度为3个字节
;入口参数:R4 --- 控制字
;	   R5 --- 地址字
;	   R6 --- 数据字
;返回参数: 无
;***************************************************
SendComm:
          SETB    IO                     ;产生开始状态
          LCALL   Delay10uS            
          SETB    CLK
          LCALL   Delay5uS              
          CLR     IO                    
          LCALL   Delay5uS              
          CLR     CLK
                                         
          MOV      A,R4		
          LCALL    SendByte		 ;发送控制字
          MOV      A,R5
          LCALL    SendByte		 ;发送地址字
          MOV      A,R6
          LCALL    SendByte		 ;发送数据字
                                         
          CLR      IO   	 	 ;产生停止状态	                 
          LCALL    Delay5uS
          SETB     CLK
          LCALL    Delay5uS              

⌨️ 快捷键说明

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