📄 sim.lst
字号:
259 3 if(dat&0x40){TX[10]=1;len++;v++;}
260 3 if(dat&0x80){TX[11]=1;len++;}
261 3 }
262 2 if(i==v && TX[11]==1) //TD3存在并且已经收到
263 2 {
264 3 if(f==0 && ((dat&0x0F)!=0))
265 3 {//TCK存在
266 4 len++;
267 4 f=1;
268 4 }
269 3 if(dat&0x10){TX[12]=1;len++;} //判断TA4-TD4是否存在
270 3 if(dat&0x20){TX[13]=1;len++;}
271 3 if(dat&0x40){TX[14]=1;len++;}
272 3 if(dat&0x80){TX[15]=1;len++;}
273 3 }
274 2 i++;
275 2 if(i>=len)break;
276 2 }
277 1 if(k!=0)SimWaitTime=k;
278 1
279 1 switch(RxdBuf[1])
280 1 {
281 2 case 0x7A: SimType=SimTianYu; break;
282 2 case 0x7D: SimType=SimWoQi; break;
283 2 case 0x7F: SimType=SimWoQi100K; break;
284 2 default : SimType= 0; break;
285 2 }
286 1 // RxdLen=len; //test
287 1 if(f!=0)
288 1 {//TCK存在
289 2 k=0;
290 2 len-=1;
291 2 for(i=1;i<len;i++)
292 2 k^=RxdBuf[i];
293 2 if(k!=RxdBuf[len])
294 2 {
295 3 ErrorHint("复位应答TCK错误!",0x9100);
296 3 }
297 2 }
298 1 k=12;
299 1 while(--k)
300 1 {//The answer to reset is complete 12 etu after the leading edge of the last character.
301 2 i=104;
302 2 while(--i);
303 2 }
C51 COMPILER V8.01 SIM 03/28/2006 09:48:50 PAGE 6
304 1 // UartTxd(1,&SimGuardTime);
305 1 return 1;
306 1 }
307
308 uchar SimRstCold(uchar ch)
309 {
310 1 uint i;
311 1
312 1 SimDeactive(ch);
313 1 UART0_Mod3_Timer1_9600; //禁止多机通信,8位数据+奇偶效验位
314 1 SimActive(ch);
315 1 i=SimATR();
316 1 if(i==0)
317 1 {
318 2 if(ch==0)ErrorHint("复位失败,请检查税控卡!",0x110);
319 2 if(ch==1)ErrorHint("复位失败,请检查用户卡!",0x111);
320 2 else ErrorHint("复位失败,请检查管理卡!",0x112);
321 2 }
322 1 // return SimBpsSet(19200,ch);
323 1 return 1;
324 1 }
325
326 uint ProcedureByte(uchar ins,uchar ch)
327 {
328 1 uchar k,ack;
329 1 // uchar x;
330 1 gyt2 mp;
331 1
332 1 if(ch == 0)SIM0RXD;
333 1 else SIM1RXD;
334 1 while(1)
335 1 {
336 2 ack=SimRxdByte();
337 2 if(SimTimeOut==1)return 0xFFFC;
338 2 if(ack!=0x60)break;
339 2 }
340 1 k=ack&0xF0;
341 1 if(k==0x60 || k==0x90)
342 1 {
343 2 mp.str[0]=ack;
344 2 mp.str[1]=SimRxdByte();
345 2 if(SimTimeOut==1)return 0xFFFD;
346 2 SimTimeOut=0xFF;
347 2 return mp.dat;
348 2 }
349 1 else
350 1 {
351 2 k=ack^ins;
352 2 if(k==0xFF || k==0xFE) //仅传输下一个字节,编程电压不处理
353 2 return 2;
354 2 if(k==0 || k==1) //传输所有余下数据,编程电压不处理
355 2 return 1;
356 2 ErrorHint("过程字节不正确",k); //过程字节不正确必须报错
357 2 }
358 1 }
359
360 uint SimCmd(uchar tlen,uchar ch)
361 {
362 1 gyt2 *state;
363 1 uint k;
364 1 uchar x,dat,rnum,tnum,ins;
365 1 uchar lc,le,rlen;
C51 COMPILER V8.01 SIM 03/28/2006 09:48:50 PAGE 7
366 1
367 1 if(tlen>5)
368 1 {//lc 存在
369 2 lc=TxdBuf[4];
370 2 if(tlen>(lc+5))
371 2 {//le存在,但是不发送le
372 3 le=TxdBuf[lc+5];
373 3 tlen-=1;
374 3 }
375 2 else
376 2 {//le不存在
377 3 le=0;
378 3 }
379 2 }
380 1 else //tlen==5,tlen不可能小于5
381 1 {//le、lc都不存在,或者le=0需要返回最大数据,或者仅le存在,都只需要接受SW1、SW2
382 2 lc=0;
383 2 le=TxdBuf[4];
384 2 }
385 1 rlen=le+2; //SW1+SW2
386 1 UART0_Mod3_Timer1_9600;
387 1 // UART0_Mod3_Timer2_19200;
388 1 tnum=0;
389 1 SimIns=0;
390 1 ins=TxdBuf[1];
391 1 // SIMCS; //cs6
392 1 TI=0;RI=0;
393 1 while(1)
394 1 {
395 2 if(ch == 0)SIM0TXD;
396 2 else SIM1TXD;
397 2 SimTxdByte(TxdBuf[tnum++]);
398 2 if(tnum==5 && lc!=0)
399 2 {
400 3 k=ProcedureByte(ins,ch); //获得过程字节
401 3 if(SimTimeOut==0xFF || SimTimeOut==1)return k;
402 3 if(k!=2 && k!=1)return k;
403 3 if(k==2)
404 3 {
405 4 while(1)
406 4 {
407 5 if(ch == 0)SIM0TXD;
408 5 else SIM1TXD;
409 5 SimTxdByte(TxdBuf[tnum++]);
410 5 if(tnum>=tlen)break;
411 5 k=ProcedureByte(ins,ch);
412 5 if(SimTimeOut==0xFF || SimTimeOut==1)return k;
413 5 if(k!=2 && k!=1)return k;
414 5 if(k==1)break; //传输所有余下数据
415 5 }
416 4 }
417 3 }
418 2 if(tnum>=tlen)break;
419 2 }
420 1 if(ch == 0)SIM0RXD;
421 1 else SIM1RXD;
422 1 rnum=0;tnum=0;
423 1 x=rlen-2;
424 1 // if(le!=0)
425 1 {
426 2 k=ProcedureByte(ins,ch);
427 2 if(SimTimeOut==0xFF || SimTimeOut==1)return k;
C51 COMPILER V8.01 SIM 03/28/2006 09:48:50 PAGE 8
428 2 if(k!=2 && k!=1)return k;
429 2 if(k==2)SimIns=1; //仅传输下一个字节
430 2 // if(k==1) //传输所有余下数据
431 2 }
432 1 while(1)
433 1 {
434 2 dat=SimRxdByte();
435 2 if(SimTimeOut==1)
436 2 {
437 3 return 0xFFFF;
438 3 }
439 2 if(SimIns && rnum<x)
440 2 {
441 3 tnum++;
442 3 if((tnum%2)==0)continue;
443 3 }
444 2 if(dat==0x60 && rnum==x)continue;
445 2 RxdBuf[rnum++]=dat;
446 2 if(rnum>=rlen)break;
447 2 }
448 1 state = &RxdBuf[rlen-2];
*** WARNING C182 IN LINE 448 OF SIM.C: pointer to different objects
449 1 return state->dat;
450 1 }
451
452 //|---------------------------------------------------------------------------------|
453 //|税控卡和用户卡所支持的波特率: |
454 //|9600 3571200/9600=372 FI=DI=1 FF1011FE 11FE |
455 //|19200 3579000/19200=186=372/2 FI=1 DI=2 FF1012FD 12FD |
456 //|38400 3579000/38400=94=372/4 FI=1 DI=3 FF1013FC 13FC |
457 //|56000 3579000/56000=64=512/8 FI=9 DI=4 FF10947B 947B |
458 //|首先检测卡片的复位信息,根据复位信息确定,以9600速率发送激活指令ff 10 94+这三 |
459 //|个字节的单字节异或值。卡片应该以9600返回确认值,确认值字节应该为后两个字节如 |
460 //|947B等表明速率已经修改成功,必须以修改后的速率进行通讯。若返回值不是后两个字 |
461 //|节,说明速率修改不成功。 |
462 //|1/Baud=etu=F/(D*fs) |
463 //|---------------------------------------------------------------------------------|
464 /*
465 uint SimBpsSet(uint bps,uchar card)
466 {
467 uint statecode,m;
468 gyt2 *xp;
469 TxdBuf[0]=0xFF;
470 TxdBuf[1]=0x10;
471 switch(bps)
472 {
473 case 9600:
474 TxdBuf[2]=0x11;
475 TxdBuf[3]=0xFE;
476 break;
477 case 19200:
478 TxdBuf[2]=0x12;
479 TxdBuf[3]=0xFD;
480 break;
481
482 case 38400:
483 TxdBuf[2]=0x13;
484 TxdBuf[3]=0xFC;
485 break;
486
487 case 56000:
488 TxdBuf[2]=0x94;
C51 COMPILER V8.01 SIM 03/28/2006 09:48:50 PAGE 9
489 TxdBuf[3]=0x7B;
490 break;
491
492 default:
493 TxdBuf[2]=0x11;
494 TxdBuf[3]=0xFE;
495 break;
496 }
497 xp = &TxdBuf[0];
498 m = xp->dat;
499 TxdLen=0xFF;
500 statecode=SimCmd(4,card);
501 xp = &RxdBuf[0];
502 if(xp->dat==m)
503 {
504 SimEtu=52;
505 return 1;
506 }
507 else
508 ErrorHint("Bps Set Error!",statecode);
509 }
510 */
511 //----------------------------------------------------------------------------------
512 uint GetResponse(uchar le,uchar card)
513 {
514 1 uint statecode;
515 1
516 1 TxdBuf[0]=0x00;
517 1 TxdBuf[1]=0xC0;
518 1 TxdBuf[2]=0x00;
519 1 TxdBuf[3]=0x00;
520 1 TxdBuf[4]=le;
521 1 statecode=SimCmd(5,card);
522 1 return statecode;
523 1 }
524
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -