📄 main.lst
字号:
222 1 //因为地址与数据复用,所以应将XBR2.1设为高电平,以使交叉开关
223 1 //跳过ALE,RD,WR
224 1
225 1 XBR0 = 0X05; //SET UART0,I2C
226 1 XBR1 = 0x10; // Set INT1
227 1 XBR2 = 0x42; // Enable XBAR,Enable EMFILE
228 1
229 1 P0MDOUT = 0xe1; //Output configuration for P0
230 1 //ALE,RD,WR,TXD配置为推挽输出,RXD,INT1配置为漏级开路
231 1 P1MDOUT = 0xff; // Output configuration for P1
232 1 //复位脚配置为推挽输出
233 1 P2MDOUT = 0x00; // Output configuration for P2
234 1 P3MDOUT = 0xff; // Output configuration for P3
235 1
236 1 P0|=0x1A; //set RX0,RX1,INT1为输入
237 1
238 1
239 1 delay=256; // Delay >1 ms before polling XTLVLD.
240 1 while(delay--);
241 1
C51 COMPILER V6.00i MAIN 07/16/2004 10:11:59 PAGE 5
242 1 while (!(OSCXCN & 0x80)); // Wait until external crystal has // started.
243 1 OSCICN = 0x0C; // Switch to external oscillator
244 1 OSCICN = 0x88; // Disable internal oscillator; enable
245 1 // missing clock detector.
246 1 while (!(OSCXCN & 0x80)); // Wait until external crystal has // started.
247 1 OSCICN = 0x08; // Switch to external oscillator
248 1
249 1 ///////////////////////////////////////////////////
250 1 //test 液晶
251 1
252 1
253 1 init_lcd ();
254 1
255 1
256 1 wrlattice (0x00,0x00);
257 1 disphz (tab1);
258 1 delay1 (300);
259 1 wrlattice (0xff,0x00);
260 1 delay1 (300);
261 1 wrlattice (0x00,0x00);
262 1 dispzf (tab2);
263 1 delay1 (300);
264 1 wrlattice (0x33,0x33);
265 1 wrlattice (0x00,0x00);
266 1 delay1 (300);
267 1 disptu (tab3);
268 1 delay1 (300);
269 1
270 1
271 1 /////////////////////////////////
272 1
273 1 csrc500=0;
274 1 csrtc=1;
275 1 SpeakSound();
276 1 SpeakSound();
277 1
278 1 // 初始化UART0、TIMER2
279 1 Baudrate_Init(); // 初始化串口0的波特率
280 1 TI0=0; //发送清零
281 1 DIR=0; //485置于接收状态
282 1
283 1 IT1=1; // 外部中断1设为沿触发
284 1
285 1 ES0=1; //允许串口0中断
286 1
287 1 EX1=1; //外部中断1开放
288 1 EA=1;
289 1
290 1 //---------------------i2c init------------------------
291 1 SMB0CN = 0x44; // Enable SMBus with ACKs on acknowledge
292 1 // cycle
293 1 SMB0CR = -100; // SMBus clock rate = 100kHz.
294 1 EIE1 |= 2; // SMBus interrupt enable
295 1 SM_BUSY = 0; // Free SMBus for first transfer.
296 1 // TEST I2C CODE---------------------------------------------------------------------
297 1 for(i=0;i<40;i++)
298 1 SM_Send(CHIP_A,0x0FFF+i,i); // Send 0x53(data) to address 0x88 on CHIP_A
299 1
300 1 // SM_Send(CHIP_B, 0x0001, 0x66); // Send 0x66(data) to address 0x01 on CHIP_B
301 1 // SM_Send(CHIP_C, 0x0010, 0x77);
302 1 // SM_Send(CHIP_B, 0x0333, 0xF0);
303 1 // SM_Send(CHIP_A, 0x0242, 0xF0);
C51 COMPILER V6.00i MAIN 07/16/2004 10:11:59 PAGE 6
304 1 for(i=0;i<40;i++)
305 1 {
306 2 buff[i] = SM_Receive(CHIP_A, 0x0FFF+i); // Read address 0x88 on CHIP_A
307 2 }
308 1 // check = SM_Receive(CHIP_B, 0x0001); // Read address 0x01 on CHIP_B
309 1 // check = SM_Receive(CHIP_C, 0x0010);
310 1 // check = SM_Receive(CHIP_B, 0x0333);
311 1 // END TEST I2C CODE-----------------------------------------------------------------
312 1
313 1 status=Mf500PcdConfig(); //配置RC500内部寄存器函数
314 1 status=Mf500PiccHalt();
315 1
316 1 while(1) //while(1)
317 1 {
318 2 if(UART1_Rec_Complete==1){//接收成功
319 3 UART1_Rec_Complete=0;
320 3
321 3 switch(Receive_Buf_UART1[1]){ //run command
322 4
323 4 case 0x00: //择卡命令
324 4 do{
325 5 status=Mf500PiccRequest(PICC_REQALL,catq);
-
326 5 status=Mf500PiccAnticoll(0,csn); //csn 为返回的卡序列号SN
-
327 5 status=Mf500PiccSelect(csn,catq); //选择这张卡
-
-
328 5 }while(status);
-
-
329 4 SEND_ICINFO_PC(0,0,5,csn);
330 4 SpeakSound();
331 4 break;
332 4
333 4 case 0x01: //卡验证
334 4 sector_num=Receive_Buf_UART1[2]*4+3;//算出密钥所在的扇区
335 4 if(Receive_Buf_UART1[3]==0x0A) //认证密钥
336 4 selec_abkey=PICC_AUTHENT1A;
337 4 if(Receive_Buf_UART1[3]==0x0B)
338 4 selec_abkey=PICC_AUTHENT1B;
339 4 switch(Receive_Buf_UART1[4]){
340 5 case 0x01:
341 5 memmove(keybuf,Receive_Buf_UART1+5,6);
342 5 status=Mf500HostCodeKey(keybuf,keycodebuf);//将密钥转换成RC500格式
-
343 5 status=Mf500PiccAuthKey(selec_abkey,csn,keycodebuf,sector_num);
344 5 if(status==0)
345 5 SEND_ICINFO_PC(1,0,0,NULL);
-
346 5 else
347 5 SEND_ICINFO_PC(1,1,0,NULL);
348 5 SpeakSound();
349 5 break;
350 5 case 0x02:
351 5 e2key_secotor=Receive_Buf_UART1[5];
-
352 5 status= Mf500PiccAuthE2(selec_abkey,csn,e2key_secotor,sector_num);
353 5 // 参数e2key_secotor 0 <= e2key_sector <= 15此为e2rom的扇区号
354 5 // 参数sector_num为卡的扇区0 block 0 <= block <= 15 即为认证的卡的扇区
-
355 5 if(status==0)
C51 COMPILER V6.00i MAIN 07/16/2004 10:11:59 PAGE 7
356 5 SEND_ICINFO_PC(1,0,0,NULL);
357 5 else
358 5 SEND_ICINFO_PC(1,1,0,NULL);
359 5 SpeakSound();
360 5 break;
361 5 default:
362 5 SEND_ICINFO_PC(1,2,0,NULL);
363 5 SpeakSound();
364 5 break;
365 5 }
366 4 break;
367 4
368 4 case 0x02: //卡的初始化值操作
369 4 block_num=Receive_Buf_UART1[2]*4+Receive_Buf_UART1[3];
370 4 memmove(temp_buf,Receive_Buf_UART1+4,16); //搬移16个16进制数
-
371 4 status=Mf500PiccWrite(block_num,temp_buf);
372 4 if(status==0)
373 4 SEND_ICINFO_PC(2,0,0,NULL);
374 4 else
375 4 SEND_ICINFO_PC(2,1,0,NULL);
376 4 SpeakSound();
377 4 break;
378 4
379 4 case 0x03: //卡的增减值操作
380 4 block_num=Receive_Buf_UART1[2]*4+Receive_Buf_UART1[3];
381 4 //memmove(temp_buf,RECEIVEBUFFER+5,1); //搬移1个16进制数
382 4 temp_buf[0]=Receive_Buf_UART1[5];
383 4 temp_buf[1]=Receive_Buf_UART1[6];
384 4 temp_buf[2]=0;
385 4 temp_buf[3]=0;
386 4 switch(Receive_Buf_UART1[4]){
387 5 case 0x01:
388 5 status=Mf500PiccValue(0xc0,block_num,temp_buf,block_num);//减值
389 5 if(status==0)
390 5 SEND_ICINFO_PC(3,0,0,NULL);
-
391 5 else
392 5 SEND_ICINFO_PC(3,1,0,NULL);
393 5 SpeakSound();
394 5 break;
395 5 case 0x02:
396 5 status=Mf500PiccValue(0xc1,block_num,temp_buf,block_num); //增值操作
-
397 5 if(status==0)
398 5 SEND_ICINFO_PC(3,0,0,NULL);
-
399 5 else
400 5 SEND_ICINFO_PC(3,1,0,NULL);
401 5 SpeakSound();
402 5 break;
403 5 default:
404 5 SEND_ICINFO_PC(3,2,0,NULL);
405 5 break;
406 5 }
407 4 break;
408 4
409 4 case 0x04: //读写块操作
410 4 block_num=Receive_Buf_UART1[2]*4+Receive_Buf_UART1[3];
411 4 switch(Receive_Buf_UART1[4]){
412 5 case 0x01:
413 5 status=Mf500PiccRead(block_num,rbuf);
C51 COMPILER V6.00i MAIN 07/16/2004 10:11:59 PAGE 8
414 5 if(status==0)
415 5 SEND_ICINFO_PC(4,0,16,rbuf);
-
416 5 else
417 5 SEND_ICINFO_PC(4,1,0,NULL);
-
418 5 SpeakSound();
419 5 break;
420 5 case 0x02:
421 5 memmove(temp_buf,Receive_Buf_UART1+5,16); //搬移16个16进制数
-
422 5 status=Mf500PiccWrite(block_num,temp_buf);
423 5 if(status==0)
424 5 SEND_ICINFO_PC(4,0,0,NULL); //显示写成功
425 5 else
426 5 SEND_ICINFO_PC(4,1,0,NULL);
427 5 SpeakSound();
428 5 break;
429 5 default:
430 5 SEND_ICINFO_PC(4,2,0,NULL);
431 5 break;
432 5 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -