📄 verify4442.lst
字号:
C51 COMPILER V6.23a VERIFY4442 08/25/2003 19:43:12 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE VERIFY4442
OBJECT MODULE PLACED IN Verify4442.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Verify4442.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 #include <stdio.h>
3 #include <intrins.h>
4 #include <reg51.h>
5 #include <Verify4442.h>
6 main()
7 {
8 1 init();
9 1 if(IC_In == 1)
10 1 {
11 2 IC_VCCC = 1;
12 2 IC_VCC_LED = ON;
13 2 Delay10us();
14 2 ResetCard(); //
15 2 IC_Verify_Flag = Verify(PassWord[0],PassWord[1],PassWord[2]);
16 2 BreakOperate();
17 2 Delay10us();
18 2 //if( IC_Verify_Flag == True)
19 2 //{
20 2 WriteMainMem(0xff,0xff);
21 2 Delay10us();
22 2 WriteMainMem(0xe0,0xe0);
23 2 //}
24 2 Delay10us();
25 2 ResetCard();
26 2 Verify_Send();
27 2 Delay10us();
28 2 IC_VCCC = 0;
29 2 }
30 1 }
31
32 bit Verify(uchar pt1,pt2,pt3)
33 {
34 1 uchar idata temp[4]; //暂存4字节的保密区内容
35 1 uchar i;
36 1 SendComm(RSM_COMM,0xff,0xff); //读密码存储区的命令字,第2,3个参数在此命令中被忽略
37 1 ReadMode(temp, 4); //读出
38 1 IC_PassWord[4] = temp[4];
39 1 if((temp[0] & 0x07) != 0) //第一字节是错误计数器,如果错误计数器为0,直接退出
40 1 {
41 2 if((temp[0] & 0x07)==0x07) // 00000111
42 2 i = 0x06;
43 2 else if((temp[0] & 0x07)==0x06)// 00000110
44 2 i = 0x04;
45 2 else if((temp[0] & 0x07)==0x04)// 00000100
46 2 i = 0x00; //将其中一位为1的改为0
47 2 SendComm(WSM_COMM,0,i); //修改错误计数器
48 2 ProcessMode(); //处理
49 2 //for (i = 1; i < 4; i++, pt++) //校对3字节的密码
50 2 //{
51 2 SendComm(VER_COMM,1,pt1); //发出校对命令,
52 2 ProcessMode(); //处理
53 2 SendComm(VER_COMM,2,pt2); //发出校对命令,
54 2 ProcessMode(); //处理
55 2 SendComm(VER_COMM,3,pt3); //发出校对命令,
C51 COMPILER V6.23a VERIFY4442 08/25/2003 19:43:12 PAGE 2
56 2 ProcessMode(); //处理
57 2 //}
58 2 SendComm(WSM_COMM,0,0xff); //擦除计数器恢复错误计数器
59 2 ProcessMode(); //处理
60 2 SendComm(RSM_COMM,0xff,0xff); //读密码存储区的命令字,第2,3个参数在此命令中被忽略
61 2 ReadMode(temp, 4); //读错误计数器的内容
62 2 if((temp[0] & 0x07)==0x07) //如果没有被成功擦除,表明校对失败
63 2 return 1 ;
64 2 }
65 1 return 0;
66 1 }
67
68
69 void SendComm(uchar a,uchar b,uchar c)
70 {
71 1 StartComm(); //开始发送命令
72 1 WriteByte(a); //a: 发命令字
73 1 WriteByte(b); //b: 发地址
74 1 WriteByte(c); //c: 发数据
75 1 StopComm(); //结束发送命令
76 1 }
77
78 void StartComm(void)
79 {
80 1 IC_CLK = 0;
81 1 IC_IO = 1;
82 1 Delay5us();
83 1 IC_CLK = 1;
84 1 Delay5us();
85 1 IC_IO = 0;
86 1 Delay5us();
87 1 }
88
89 void WriteByte(uchar ch)
90 {
91 1 uchar i;
92 1 for(i = 8; i > 0; i--)
93 1 {
94 2 IC_CLK = 0;
95 2 IC_IO = (bit)(ch & 0x01);
96 2 Delay5us();
97 2 IC_CLK = 1;
98 2 Delay10us();
99 2 ch = ch >> 1; //右移一位
100 2 }
101 1 }
102
103 uchar ReadByte(void)
104 {
105 1 uchar i,ch;
106 1 ch = 0;
107 1 for (i = 8; i > 0; i--)
108 1 {
109 2 IC_CLK = 0;
110 2 ch = ch >> 1; //从低位读起
111 2 if((uchar)IC_IO)
112 2 ch |= 0x80;
113 2 Delay5us();
114 2 IC_CLK = 1;
115 2 Delay5us();
116 2 }
117 1 return ch;
C51 COMPILER V6.23a VERIFY4442 08/25/2003 19:43:12 PAGE 3
118 1 }
119
120
121 void StopComm(void)
122 {
123 1 IC_CLK = 0;
124 1 IC_IO = 0;
125 1 Delay5us();
126 1 IC_CLK = 1; //CLK: H
127 1 Delay5us();
128 1 IC_IO = 1; //IO : H
129 1 Delay10us();
130 1 }
131
132 void ReadMode(uchar idata *pt,uchar count)
133 {
134 1 IC_CLK=0;
135 1 Delay5us();
136 1 do
137 1 {
138 2 *pt = ReadByte(); //读入一个字节
139 2 pt++; //指针加一
140 2 }while(--count); //计数器减一,判断
141 1 }
142
143 void BreakOperate(void)
144 {
145 1 IC_CLK = 0;
146 1 IC_RST = 0;
147 1 IC_IO = 0;
148 1 Delay5us();
149 1 IC_RST = 1;
150 1 IC_IO = 1;
151 1 Delay5us();
152 1 IC_RST = 0;
153 1 Delay5us();
154 1 IC_VCCC = 0;
155 1 }
156
157 void ResetCard(void)
158 {
159 1 uchar temp;
160 1 Delay5us();
161 1 IC_RST = 0;
162 1 IC_CLK = 0;
163 1 IC_IO = 1;
164 1 Delay5us();
165 1 IC_RST = 1;
166 1 Delay5us();
167 1 IC_CLK = 1;
168 1 Delay10us();
169 1 Delay10us();
170 1 Delay10us();
171 1 Delay10us();
172 1 IC_CLK = 0;
173 1 Delay5us();
174 1 IC_RST = 0;
175 1 Delay10us();
176 1 temp = ReadByte();
177 1 temp = ReadByte();
178 1 temp = ReadByte();
179 1 temp = ReadByte();
C51 COMPILER V6.23a VERIFY4442 08/25/2003 19:43:12 PAGE 4
180 1 IC_CLK = 0;
181 1 Delay5us();
182 1 IC_IO = 1;
183 1 _nop_();
184 1 IC_CLK = 0;
185 1 Delay5us();
186 1
187 1 }
188
189 void Delay10us(void)
190 {
191 1 _nop_();
192 1 _nop_();
193 1 _nop_();
194 1 _nop_();
195 1 _nop_();
196 1 _nop_();
197 1 }
198
199 void Delay5us(void)
200 {
201 1 _nop_();
202 1 _nop_();
203 1 _nop_();
204 1 }
205
206
207 void init()
208 {
209 1 //uchar i;
210 1 TMOD=0x20;
211 1 TL1=0xFd;
212 1 TH1=0xFd;
213 1 SCON=0x50;
214 1 PCON=0x00;
215 1 EA = 1;
216 1 ES = 1;
217 1 TR1=1;
218 1 IC_VCCC = 0;
219 1 IC_In = 1;
220 1 IC_Verify_LED = OFF;
221 1 IC_Read_LED = OFF;
222 1 IC_In_LED = OFF;
223 1 IC_VCC_LED = OFF;
224 1 IC_Read_Flag = True;
225 1 IC_Verify_Flag = False;
226 1 // IC_Write_add = 0xE0;
227 1 // IC_Write_data = 0xE0;
228 1 }
229
230 void Verify_Send()
231 {
232 1 if(IC_Verify_Flag == True)
233 1 {
234 2 SBUF = 0xff;
235 2 do{}
236 2 while(TI == 0);
237 2 TI = 0;
238 2 }
239 1 else
240 1 {
241 2 SBUF = 0x00;
C51 COMPILER V6.23a VERIFY4442 08/25/2003 19:43:12 PAGE 5
242 2 do{}
243 2 while(TI == 0);
244 2 TI = 0;
245 2 }
246 1 }
247
248 void ProcessMode(void)
249 {
250 1 uint i;
251 1 IC_CLK = 0;
252 1 Delay5us();
253 1 IC_IO = 0;
254 1 for (i = 255; i > 0; i--)
255 1 {
256 2 IC_CLK = 1;
257 2 Delay5us();
258 2 IC_CLK = 0;
259 2 Delay5us();
260 2 }
261 1 IC_IO = 1;
262 1 }
263
264 void WriteMainMem(uchar addr,uchar Data)
265 {
266 1 ResetCard();
267 1 SendComm(WMM_COMM, addr, Data); //写主存的命令字,地址,数据
268 1 ProcessMode();
269 1 BreakOperate();
270 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 592 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 23 17
IDATA SIZE = ---- 4
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -