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

📄 cpu_com.lst

📁 keil下ISO7816规则的APDU程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
 708                                  else
 709                                  {
 710                                                  return FALSE;
 711                                  }
 712                          }
 713                          return FALSE;
 714                          
 715          }
 716          */
 717          //复位
 718          /*unsigned char Rst(void)
 719          {
 720                          unsigned char reset_flag = 1,*ndata;
 721                          Reset(reset_flag);
 722                          if(Reset_answer(ndata)==FALSE)//冷复位失败
 723                          {
 724                                          reset_flag = 0;
 725                                          Reset(reset_flag);
 726                                          if(Reset_answer(ndata)==FALSE)//热复位失败
 727                                                          return FALSE;
 728                                          return TRUE;//热复位成功
 729                          }
 730                          return TRUE;//冷复位成功
 731          }*/
C51 COMPILER V7.50   CPU_COM                                                               05/16/2006 17:45:20 PAGE 13  

 732          //延时2500uS
 733          void delay(void)
 734          {
 735   1                      unsigned int i = 0;
 736   1                      for(i=0;i<413;i++);
 737   1                      //for(i=0;i<255;i++);
 738   1      }
 739          //正确时返回长度向串口发送长度个数据,错误时返回时向串口发送0xFF
 740          unsigned char read_ATR(void)
 741          {
 742   1              unsigned char idata Present_TA2=FALSE,TA2=0xff,Number_ATR=0;
 743   1          unsigned char idata ln_history,number_Ti,Yi=0,y;     
 744   1          unsigned char idata FI=1,DI=1,Type_T0=0,Type_Ti=0;
 745   1              unsigned char idata ndata1[1]; 
 746   1              unsigned char idata i,z=0,x = 0;
 747   1              if(GetChar(ndata1) == TRUE)
 748   1              {
 749   2                      ndata[0]=ndata1[0];
 750   2                      for(i=1;i<32;i++)
 751   2                      {
 752   3                              //BT_REC = 1;
 753   3                              if(GetChar(ndata1)==TRUE)
 754   3                                      ndata[i]=ndata1[0];
 755   3                              else                                                            //接收完数据
 756   3                                      goto comatr;
 757   3                      }
 758   2              }
 759   1              else                                                                            //没有接收到ART,或者接收失败
 760   1                      return FALSE;   
 761   1      comatr:         
 762   1              if(ndata[z] == 0x3B)
 763   1                      CPUCD_Format = 0;                                       //正规则                
 764   1              else if(ndata[z] == 0x03)
 765   1                      CPUCD_Format = 1;                                       //反规则
 766   1              else 
 767   1                      return FALSE;                                           //错误
 768   1              z++;                                                                    //Z = 1
 769   1              if(z>(i-1))                                                             //如果没有接收到第二个字节或第二个字节数据错误则失败
 770   1                      return FALSE;                                           //
 771   1              ln_history = ndata[z] & 0x0F;                   //取出历史字节个数
 772   1              number_Ti = ndata[z] &0xF0;                     //取出反映TA1~TD1
 773   1              z++;                                                                    //Z = 2
 774   1              if (number_Ti & 0X10)                                   //读TA1,时钟速率转换因子
 775   1              {
 776   2                      if (z>(i-1))                                            //如果没有接收到第三个字节或第三个字节数据错误则失败                                                                                                            
 777   2                      return FALSE;
 778   2              FI = ndata[z]>>4;                                       //ndata[2]                                              
 779   2              DI = ndata[z] & 0X0F;
 780   2              z++;                                                            //z=3
 781   2              }
 782   1              if (number_Ti & 0X20)
 783   1          {
 784   2              if (z>(i-1))                                            //读TB1,编程电压、电流参数
 785   2                      return FALSE;
 786   2                      z++;                                                            //z=4
 787   2              }
 788   1              if (number_Ti & 0X40)
 789   1              {
 790   2                      if (z>(i-1))                                            //读TC1,8位以外的额外等候时间
 791   2                      return FALSE;
 792   2              if (ndata[z] == 255)                            //ndata[4]
 793   2                      Extra_guardtime_N = 0;
C51 COMPILER V7.50   CPU_COM                                                               05/16/2006 17:45:20 PAGE 14  

 794   2              else 
 795   2              {               
 796   3                      Extra_guardtime_N = ndata[z];
 797   3      //                      Extra_guardtime_N_bak = Extra_guardtime_N;
 798   3              }
 799   2                      z++;                                                            //z=5
 800   2              }
 801   1              else
 802   1              {
 803   2                      Extra_guardtime_N = 0;
 804   2              }
 805   1              if (number_Ti & 0X80)
 806   1          {
 807   2              if (z>(i-1))                                            //读TD1,无TD1默认Yi=0,Type_T0=0
 808   2                      return FALSE;
 809   2              Type_T0 = ndata[z] & 0X0F;                      //ndata[5]
 810   2              Yi = ndata[z] & 0xf0;
 811   2              z++;                                                            //z=6
 812   2              }
 813   1              if (Yi & 0X10)                                                  //TA2,TB2,TC2,TD2的记录
 814   1              {
 815   2                      if (z>(i-1))                                            //读TA2,指定模式字节
 816   2                      return FALSE;
 817   2              Present_TA2=TRUE;
 818   2              TA2=ndata[z];                                           //ndata[6]
 819   2                      z++;                                                            //z=7
 820   2              }
 821   1              if (Yi & 0X20)
 822   1          {
 823   2                      if (z>(i-1))                                            //读TB2
 824   2                      return FALSE;
 825   2              z++;                                                            //z=8
 826   2          }
 827   1              if (Yi & 0X40)
 828   1          {
 829   2                      if (z>(i-1))                                            //读TC2
 830   2                      return FALSE;
 831   2                      tc2 = (ndata[z]/10)-1;
 832   2              z++;                                                            //z=9
 833   2          }
 834   1              if (Yi & 0X80)
 835   1          {
 836   2              if (z>(i-1))                                            //读TD2
 837   2                      return FALSE;
 838   2                      Yi = ndata[z] & 0xf0;
 839   2                      Type_Ti = ndata[z] & 0X0F;
 840   2                      z++;                                                            //z=10
 841   2          }
 842   1          else
 843   1          {
 844   2                      Yi=0;  
 845   2          }
 846   1              while  (Yi)                                                                     //TAi,TBi,TCi,TDi的记录
 847   1              {
 848   2                      if (Yi & 0X10)
 849   2              {
 850   3                      if (z>(i-1))                                            //读TAi,指定模式字节
 851   3                              return FALSE;
 852   3                              z++;                                                            //z=11
 853   3                      }
 854   2                      if (Yi & 0X20)
 855   2              {
C51 COMPILER V7.50   CPU_COM                                                               05/16/2006 17:45:20 PAGE 15  

 856   3                      if (z>(i-1))                                            //读TBi
 857   3                              return FALSE;
 858   3                      z++;                                                            //z=12
 859   3              }
 860   2                      if (Yi & 0X40)
 861   2              {
 862   3                      if (z>(i-1))                                            //读TCi
 863   3                              return FALSE;
 864   3                      z++;                                                            //z=13
 865   3              }
 866   2                      if (Yi & 0X80)
 867   2              {
 868   3                      if (z>(i-1))                                            //读TDi
 869   3                              return FALSE;
 870   3                      Yi = ndata[z] & 0xf0;                           //ndata[13]
 871   3                      Type_Ti = ndata[z] & 0X0F;
 872   3                      z++;                                                            //z=14
 873   3                      }
 874   2              else 
 875   2              {
 876   3                      Yi=0;
 877   3              }
 878   2              }
 879   1              while (ln_history)                              //接收历史字节
 880   1              {
 881   2                      if(z>(i-1))
 882   2                      return FALSE;
 883   2              z++;
 884   2              ln_history--;
 885   2          } 
 886   1              if (Type_T0 !=0 || Type_Ti !=0)         //接收TCK: 在默认的 T = 0模式下,没有TCK;在 T = 0和 T = 15同时存在时,有
             -TCK
 887   1          {
 888   2              if(z>(i-1))
 889   2                      {
 890   3                              tck = 0;
 891   3                      return FALSE;
 892   3                      }
 893   2              z++;
 894   2      
 895   2                
 896   2                //检查TCK是否正确
 897   2                      y=0x00;
 898   2              for (x=1;x<=z;x++)
 899   2              {
 900   3                      y ^= ndata[x]; 
 901   3              }
 902   2              if (y != 0)
 903   2                      {
 904   3                              tck = 0;
 905   3                      return FALSE;
 906   3                      }
 907   2                      else
 908   2                              tck = 1;
 909   2          }
 910   1      //      else
 911   1      //      {
 912   1      //              return 255;
 913   1      //      }
 914   1               return i;
 915   1      //       if (Present_TA2==TRUE)//TA2存在,指定模式。
 916   1      //     {
C51 COMPILER V7.50   CPU_COM                                                               05/16/2006 17:45:20 PAGE 16  

 917   1       //         OCR2 = (Arr_Fi[FI]/372)*52/Arr_Di[DI]-1;
 918   1       //         PreTCNT2=(OCR2+1)*2/3-1;
 919   1        //   }
 920   1      /*     else
 921   1           {
 922   1                if (Request_PPS() == FALSE)
 923   1                      return FALSE;
 924   1                else
 925   1                {
 926   1                      if (Response_PPS() == FALSE)
 927   1                              return FALSE;
 928   1                }
 929   1           }
 930   1      */     
 931   1      //     Extra_guardtime = Extra_guardtime_N;
 932   1           //计算波特率机延时因子
 933   1      //     *ATR = Number_ATR; 
 934   1      }
 935          void com_Open(void)
 936          {
 937   1              TH1=0XFA;         //0XFD波特率为9.6K,fosc=11.059M; 0xFA fosc=22.1184
 938   1              TL1=0XFA;  
 939   1      //      TH1=0XF4;         //0XFD波特率为9.6K,fosc=11.059M; 0xFA fosc=22.1184
 940   1      //      TL1=0XF4;  
 941   1      //      TH1=0XFF;         //0XFD波特率为9.6K,fosc=11.059M; 0xFA fosc=22.1184
 942   1      //      TL1=0XFF;  
 943   1      
 944   1              SCON=0X50;        //串行口运行方

⌨️ 快捷键说明

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