📄 sle4442.lst
字号:
A51 MACRO ASSEMBLER SLE4442 09/17/2004 11:09:32 PAGE 1
MACRO ASSEMBLER A51 V7.09
OBJECT MODULE PLACED IN SLE4442.OBJ
ASSEMBLER INVOKED BY: C:\KEIL\C51\BIN\A51.EXE SLE4442.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;This is the program for SLE4442 IC_Card.
2
3 ;注意:单片机的晶振频率选用11.0592MHZ
4 ;各变量的定义请见SLE4442.INC文件,并注意读缓冲区与写缓冲区的大小.
5
0000 6 ORG 0000H
0000 2100 7 AJMP MAIN
8
0100 9 ORG 0100H
0100 10 MAIN:
0100 758160 11 MOV SP,#60H ;设置栈底
12
0103 13 Read_Insert_Card:
14
0103 755708 15 MOV ByteNum,#08H
0106 755800 16 MOV StartAdr,#00H ;从主存储区的0地址读8个字节
17
0109 12010E 18 LCALL ReadCard
19
010C 80F5 20 JMP Read_Insert_Card ;请在此设置断点,观察读缓冲区内容
21
22 ;$include (SLE4442.INC) ;包含SLE4442驱动程序
+1 23 ;******************************************************************************************
**
+1 24 ; SLE4442 通用读写模块使用说明
+1 25 ; ReadCard 读出从StartAdr开始的ByteNum字节,结果存放于ReadBuf中,读出正确,ACC中返回#0,
+1 26 ;返回#01表示无效卡或者卡损坏。
+1 27 ; WriteCard从StartAdr开始写入ByteNum字节,待写入数据存放于WriteBuf中,写入正确ACC中返回#0,
+1 28 ;返回#01表示无效卡或者卡损坏。
+1 29 ; ReadCard和WriteCard的ByteNum的最大值为16, 见下面的变量定义
+1 30 ; 写卡之前一定要调用CheckPassword核对密码,密码存放于PSWD开始的三个单元,ACC中返回#0表示核
对正确,
+1 31 ;#01表示无效卡或者卡损坏,#02表示密码错,#03H表示卡已被锁闭,#04H表示该卡还有一次试验机会。
+1 32 ; 核对密码完成后,EC开始的4个单元返回错误计数值及密码。
+1 33 ; 若要对保护存储区进行写保护,请调用WriteProtect子程序,参数及返回值与WriteCard相同。
+1 34 ;读保护存储器调用ReadProtect,参数及返回值同ReadCard。
+1 35 ;******************************************************************************************
**
+1 36
+1 37
+1 38 ;*************IC卡引脚位定义*************************
0092 +1 39 RST BIT P1.2 ;复位
0090 +1 40 IO BIT P1.0 ;数据
0091 +1 41 CLK BIT P1.1 ;脉冲
+1 42
+1 43 ;*******************变量定义*********************
+1 44 ;Variabal
0030 +1 45 ReadBuf EQU 30H ;读缓冲区,16个字节
0040 +1 46 WriteBuf EQU 40H ;写缓冲区,16个字节
0050 +1 47 EC EQU 50H ;4字节临时单元
0054 +1 48 PSWD EQU 54H ;3字节密码单元
0057 +1 49 ByteNum EQU 57H ;读写的字节数
0058 +1 50 StartAdr EQU 58H ;读写时的起始地址
+1 51
+1 52 ;*************IC卡常数***************************
00A2 +1 53 Idetify1 EQU 0A2H ;此处为IC卡保护区00~03单元的值,用于识别卡
0013 +1 54 Idetify2 EQU 13H
A51 MACRO ASSEMBLER SLE4442 09/17/2004 11:09:32 PAGE 2
0010 +1 55 Idetify3 EQU 10H
0091 +1 56 Idetify4 EQU 91H
+1 57 ;************************************************
+1 58
+1 59 ;****************************************
+1 60 ;函数名称: ReadCard
+1 61 ;功能描述: 从主存储器中读出数据块
+1 62 ;入口参数:RecBuf --- 接收缓冲区地址
+1 63 ; ByteNum --- 要求读的字节数
+1 64 ; StartAdr --- 主存储器的起始地址
+1 65 ;返回参数: A --- 为0读成功
+1 66 ; A --- 表示无效卡或者卡损坏
+1 67 ;*****************************************
010E 12027B +1 68 ReadCard: LCALL Anrst
0111 700B +1 69 JNZ ReadExit ;复位不成功,退出
0113 7830 +1 70 MOV R0,#ReadBuf ;接收缓冲区地址
0115 AA57 +1 71 MOV R2,ByteNum
0117 AD58 +1 72 MOV R5,StartAdr
0119 1201F5 +1 73 LCALL Remm ;调用读主存储器子程序
011C 7400 +1 74 MOV A,#00H
011E 22 +1 75 ReadExit: RET
+1 76
+1 77 ;*********************************************
+1 78 ;函数名称: WriteCard
+1 79 ;功能描述: 向主存储器中写入数据块
+1 80 ;入口参数:WriteBuf --- 发送缓冲区地址
+1 81 ; ByteNum --- 要写入的字节数
+1 82 ; StartAdr --- 写主存储器的起始地址
+1 83 ;返回参数: A --- 为0写成功
+1 84 ; A --- 表示无效卡或者卡损坏
+1 85 ;*********************************************
011F +1 86 WriteCard:
011F 12027B +1 87 LCALL Anrst
0122 7011 +1 88 JNZ WriteExit
0124 7840 +1 89 MOV R0,#WriteBuf
0126 AA57 +1 90 MOV R2,ByteNum
0128 AD58 +1 91 MOV R5,StartAdr ;给出各个入口参数
012A +1 92 WriteLoop:
012A E6 +1 93 MOV A,@R0
012B FE +1 94 MOV R6,A
012C 120233 +1 95 LCALL Wrmm ;写入一个字节
012F 08 +1 96 INC R0
0130 0D +1 97 INC R5
0131 DAF7 +1 98 DJNZ R2,WriteLoop ;判断是否写入了指定的字节数
0133 7400 +1 99 MOV A,#00H ;读成功,返回0
0135 +1 100 WriteExit:
0135 22 +1 101 RET
+1 102
+1 103 ;*******************************************************
+1 104 ;函数名称: ReadProtect
+1 105 ;功能描述: 从保护存储器中读出数据块
+1 106 ;入口参数:RecBuf --- 接收缓冲区地址
+1 107 ; ByteNum --- 要求读的字节数(取值1 - 4)
+1 108 ; StartAdr --- 保护存储器的起始地址(取值0 - 3)
+1 109 ;返回参数: A --- 为0读成功
+1 110 ; A --- 表示无效卡或者卡损坏
+1 111 ;*******************************************************
0136 +1 112 ReadProtect:
0136 12027B +1 113 LCALL Anrst
0139 700B +1 114 JNZ RpExit
+1 115
013B 7830 +1 116 MOV R0,#ReadBuf
013D AA57 +1 117 MOV R2,ByteNum
013F AD58 +1 118 MOV R5,StartAdr ;给出各个入口参数
0141 1201F1 +1 119 LCALL Repm ;读保护存储器
0144 7400 +1 120 MOV A,#00H ;读成功,返回0
A51 MACRO ASSEMBLER SLE4442 09/17/2004 11:09:32 PAGE 3
0146 +1 121 RpExit:
0146 22 +1 122 RET
+1 123
+1 124 ;**********************************************
+1 125 ;函数名称: WriteProtect
+1 126 ;功能描述: 保护保护数据区(32字节)中的数据块,
+1 127 ; 写入的数据必须与原数据相等
+1 128 ;入口参数:WriteBuf --- 发送缓冲区地址
+1 129 ; ByteNum --- 要写入的字节数
+1 130 ; StartAdr --- 写主存储器的起始地址
+1 131 ;返回参数: A --- 为0写成功
+1 132 ; A --- 表示无效卡或者卡损坏
+1 133 ;***********************************************
0147 +1 134 WriteProtect:
0147 12027B +1 135 LCALL Anrst
014A 7011 +1 136 JNZ WpExit
014C 7840 +1 137 MOV R0,#WriteBuf
014E AA57 +1 138 MOV R2,ByteNum
0150 AD58 +1 139 MOV R5,StartAdr ;给出各个入口参数
0152 +1 140 WpLoop:
0152 E6 +1 141 MOV A,@R0
0153 FE +1 142 MOV R6,A
0154 12022F +1 143 LCALL Wrpm ;写入一个字节
0157 08 +1 144 INC R0 ;缓冲区地址加1
0158 0D +1 145 INC R5 ;写入地址加1
0159 DAF7 +1 146 DJNZ R2,WpLoop
015B 7400 +1 147 MOV A,#00H ;写成功,返回0
015D +1 148 WpExit:
015D 22 +1 149 RET
+1 150
+1 151
+1 152 ;**************************************************
+1 153 ;函数名称: CheckPassword
+1 154 ;功能描述: 校验密钥
+1 155 ;入口参数:PSWD --- 密钥值,3个字节
+1 156 ;返回参数: A --- 0: 核对密码成功
+1 157 ; A --- 1: 表示无效卡或者卡损坏
+1 158 ; A --- 2: 核对密码失败
+1 159 ; A --- 3: 卡已报废
+1 160 ; A --- 4: 只剩一定校验机会
+1 161 ;注 意: 该程序只允许两次重试,以避免卡损坏
+1 162 ;***************************************************
015E +1 163 CheckPassword:
015E 12027B +1 164 LCALL Anrst
0161 7045 +1 165 JNZ CheckExit
+1 166
0163 120251 +1 167 LCALL Rescm ;读加密存储器,获取错误计数器值
0166 E550 +1 168 MOV A,EC
0168 5407 +1 169 ANL A,#07h
016A 6040 +1 170 JZ IsBadCard ;EC=0,卡已报废
016C 13 +1 171 RRC A
016D 5008 +1 172 JNC ChkPsw1
016F E550 +1 173 MOV A,EC
0171 5406 +1 174 ANL A,#06h ;将EC的一位写"0"
0173 603A +1 175 JZ HaveOneChance ;该卡还有一次试验机会
0175 8009 +1 176 SJMP ChkPsw2
0177 +1 177 ChkPsw1:
0177 13 +1 178 RRC A
0178 5035 +1 179 JNC HaveOneChance ;该卡还有一次试验机会
017A E550 +1 180 MOV A,EC
017C 5405 +1 181 ANL A,#05H
017E 602F +1 182 JZ HaveOneChance ;该卡还有一次试验机会
0180 +1 183 ChkPsw2:
0180 7D00 +1 184 MOV R5,#00H
0182 FE +1 185 MOV R6,A
0183 12022B +1 186 LCALL Wrscm ;将EC写回卡
A51 MACRO ASSEMBLER SLE4442 09/17/2004 11:09:32 PAGE 4
0186 7A03 +1 187 MOV R2,#3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -