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

📄 sim.lst

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V8.01   SIM                                                                   03/28/2006 09:48:50 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE SIM
OBJECT MODULE PLACED IN Sim.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Sim.c LARGE OPTIMIZE(9,SIZE) BROWSE DEBUG OBJECTEXTEND CODE

line level    source

   1          /*
   2          * Copyright (c) 2004,成都港顺科技发展有限公司
   3          * All rights reserved.
   4          *
   5          * 编 译 器:Keil:C Compiler:7.20;Assembler:7.10
   6          * 工程名称:POS-Test.UV2
   7          * 文件名称:Sim.C
   8          * 摘    要:与税控IC卡通讯的所有底层函数
   9          *
  10          * 单 片 机:uPSD3254
  11          * 当前版本:0.4
  12          * 作    者:李凯
  13          * 完成日期:2004-12-7 14:45
  14          */
  15          
  16          #include "Main.h"
  17          
  18          #define SIM0RXD         PDO=0           //select Sim0 RXD Mode
  19          #define SIM0TXD         PDO=0x02        //select Sim0 TXD Mode
  20          #define SIM1RXD         PDO=0x04        //select Sim1 RXD Mode
  21          #define SIM1TXD         PDO=0x06        //select Sim1 TXD Mode
  22          
  23          #define Ctr0Set         P15=1
  24          #define Ctr0Clr         P15=0
  25          #define Ctr1Set         P17=1
  26          #define Ctr1Clr         P17=0
  27          
  28          #define Rst0Set         P14=1
  29          #define Rst0Clr         P14=0
  30          #define Rst1Set         P16=1
  31          #define Rst1Clr         P16=0
  32          
  33          #define SimWoQi         0               //渥奇的卡
  34          #define SimTianYu       1               //天喻的卡
  35          #define SimWoQi100K     2               //渥奇的100K卡
  36          
  37          sbit CardDetect=P3^4;
  38          
  39          //uchar xdata SimTimeOut,SimType,SimEtu;
  40          xdata uchar SimTimeOut,SimType,SimGuardTime,SimWaitTime,SimIns;
  41          
  42          uchar SimDetect(uchar x)
  43          {//x=0x11:插入用户卡;=0x12:插入管理卡;=0x01:取出用户卡;=0x02:取出管理卡
  44   1              uint i=1000,k=1000;
  45   1      
  46   1              if((x&0x10)!=0)
  47   1              {
  48   2                      if(x==0x11)
  49   2                      {
  50   3                              LcdDisplay(0,0,"请插入用户卡!",3);
  51   3                      }
  52   2                      else
  53   2                      {
  54   3                              LcdDisplay(0,0,"请插入管理卡!",3);
  55   3                      }
C51 COMPILER V8.01   SIM                                                                   03/28/2006 09:48:50 PAGE 2   

  56   2                      SimDeactive(1);
  57   2                      while(CardDetect==0){if(GetKey()==K_TC)return 0;}
  58   2                      while(--i);
  59   2                      while(CardDetect==0){if(GetKey()==K_TC)return 0;}
  60   2                      SimDeactive(1);
  61   2                      while(--k);
  62   2              }
  63   1              else
  64   1              {
  65   2                      if(x==0x01)
  66   2                              LcdDisplay(48,0,"请取出用户卡!",1);
  67   2                      else
  68   2                              LcdDisplay(48,0,"请取出管理卡!",1);
  69   2                      SimDeactive(1);
  70   2                      while(CardDetect==1){if(GetKey()==K_TC)return 0;}
  71   2                      while(--i);
  72   2                      while(CardDetect==1){if(GetKey()==K_TC)return 0;}
  73   2              }
  74   1              return 1;
  75   1      }
  76          
  77          void SimActive(uchar ch)
  78          {
  79   1              uchar k=185,m=75;
  80   1      
  81   1              TXD=1;
  82   1              RXD=1;
  83   1              RI=0;TI=0;
  84   1              if(ch==0)
  85   1              {
  86   2                      Rst0Set;
  87   2                      Ctr0Clr;
  88   2                      while(--k);
  89   2                      Rst0Clr;
  90   2                      while(--m);
  91   2                      Rst0Set;
  92   2                      SIM0RXD;
  93   2              }
  94   1              else
  95   1              {
  96   2                      Rst1Set;
  97   2                      Ctr1Clr;
  98   2                      while(--k);
  99   2                      Rst1Clr;
 100   2                      while(--m);
 101   2                      Rst1Set;
 102   2                      SIM1RXD;
 103   2              }
 104   1      }
 105          
 106          void SimDeactive(uchar ch)
 107          {
 108   1              uchar x=250;
 109   1      
 110   1              if(ch==0)
 111   1              {
 112   2                      Rst0Clr;                        //RSTIN=0
 113   2                      Ctr0Set;                        //CMDVcc=1
 114   2                      SIM0TXD;
 115   2              }
 116   1              else
 117   1              {
C51 COMPILER V8.01   SIM                                                                   03/28/2006 09:48:50 PAGE 3   

 118   2                      Rst1Clr;                        //RSTIN=0
 119   2                      Ctr1Set;                        //CMDVcc=1
 120   2                      SIM1TXD;
 121   2              }
 122   1              while(--x);             //至少需要125us
 123   1      }
 124          
 125          void SimTxdByte(uchar dat)
 126          {
 127   1              uchar i,j;
 128   1      
 129   1              i=SimGuardTime+1;               //对ISO7816-3来说,发送一个字节+奇偶位需要12个ETU
 130   1              while(i>0)                              //但是对51单片机来说,发送一个字节+奇偶位只有10个ETU
 131   1              {
 132   2                      j=104;
 133   2                      while(--j);
 134   2                      i--;
 135   2              }       
 136   1              ACC=dat;
 137   1              TB8=P;
 138   1              while(1)
 139   1              {
 140   2                      SBUF = dat;
 141   2                      while(!TI);
 142   2                      TI=0;
 143   2                      j=100;
 144   2                      while(--j);
 145   2                      if(TXD==1)break;//发送方在起始上升沿之后的(11±0.2)基本时间单元(etu)时刻检测I/O
 146   2                      else
 147   2                      {//检测到差错信号,至少两个etu延时之后才重发
 148   3                              j=208;          //Bps9600: Etu=104 us
 149   3                              while(--j);
 150   3                      }
 151   2              }
 152   1      }
 153          
 154          uchar SimRxdByte()
 155          {
 156   1              uchar dat,j;
 157   1              ulong m,n;
 158   1              bit x;
 159   1              
 160   1              SimTimeOut=0;
 161   1              n=SimWaitTime*9600;
 162   1              while(1)
 163   1              {
 164   2                      m=n;
 165   2                      while(!RI)
 166   2                      {
 167   3                              m--;
 168   3                              if(m==0)
 169   3                              {
 170   4                                      SimTimeOut=1;
 171   4                                      return 0;
 172   4                              }
 173   3                      }
 174   2                      RI=0;
 175   2                      dat=SBUF;
 176   2                      ACC=dat;
 177   2                      x=P;
 178   2                      if(x==RB8)
 179   2                              return dat;
C51 COMPILER V8.01   SIM                                                                   03/28/2006 09:48:50 PAGE 4   

 180   2                      else
 181   2                      {//奇偶效验错误时,从(10.5±0.2)基本时间单元(etu)开始,
 182   3                              REN=0;
 183   3                              j=50;           //从(10.5±0.2)基本时间单元(etu)开始
 184   3                              while(--j);
 185   3                              RXD=0;          //传送一个状态为A(低电平),最少为1etu,最大为2etu的差错信号
 186   3                              j=120;          //Bps9600: Etu=104 us ;
 187   3                              while(--j);
 188   3                              RXD=1;
 189   3                              j=104;          //卡在至少2etu后重发数据
 190   3                              while(--j);
 191   3                              REN=1;
 192   3                      }
 193   2              }
 194   1      }
 195          
 196          //TS T0 TA1 TB1 TC1 TD1 TA2 TB2 TC2 TD2 TA3 TB3 TC3 TD3 TA(i) TB(i) TC(i) TD(i) T1 T2 ... TK TCK
 197          uchar SimATR()
 198          {
 199   1              uchar i,m,n,len,k,f,x,y,v,TX[24];
 200   1              uchar dat;
 201   1      
 202   1              memset(TX,0,sizeof(TX));
 203   1              len=2;
 204   1              SimGuardTime=0;
 205   1              SimWaitTime=10;
 206   1              i=0;v=0;
 207   1              f=0;k=0;
 208   1              x=0;y=0;
 209   1              m=0;n=0;
 210   1              while(1)
 211   1              {
 212   2      //              RxdLen=len;                     //TEST
 213   2                      dat=SimRxdByte();
 214   2                      if(SimTimeOut==1)
 215   2                              return 0;
 216   2                      RxdBuf[i]=dat;
 217   2                      if(i==1)
 218   2                      {       
 219   3                              m=2;n=2;                
 220   3                              len+=(dat&0x0F);        //历史字节数目
 221   3                              if(dat&0x10){TX[0]=1;len++;m++;n++;}            //判断TA1-TD1是否存在
 222   3                              if(dat&0x20){TX[1]=1;len++;m++;n++;}
 223   3                              if(dat&0x40){TX[2]=1;len++;n++;}
 224   3                              if(dat&0x80){TX[3]=1;len++;}
 225   3                      }
 226   2                      if(i==m && TX[2]==1)
 227   2                      {//额外保护时间N=TC1                    
 228   3                              if(dat==255)SimGuardTime=0;
 229   3                              else    SimGuardTime=dat;
 230   3                      }
 231   2                      if(i==n && TX[3]==1)    //TD1存在并且已经收到
 232   2                      {
 233   3                              if((dat&0x0F)!=0)
 234   3                              {//TCK存在
 235   4                                      f=1;
 236   4                                      len++;
 237   4                              }
 238   3                              x=n+1;
 239   3                              y=x;
 240   3                              if(dat&0x10){TX[4]=1;len++;x++;y++;}            //判断TA2-TD2是否存在
 241   3                              if(dat&0x20){TX[5]=1;len++;x++;y++;}
C51 COMPILER V8.01   SIM                                                                   03/28/2006 09:48:50 PAGE 5   

 242   3                              if(dat&0x40){TX[6]=1;len++;y++;}
 243   3                              if(dat&0x80){TX[7]=1;len++;}
 244   3                      }
 245   2                      if(i==x && TX[6]==1)    //TC2存在并且已经收到
 246   2                      {//最大工作等待时间
 247   3                              k=dat;                  
 248   3                      }
 249   2                      if(i==y && TX[7]==1)    //TD2存在并且已经收到
 250   2                      {
 251   3                              if(f==0 && ((dat&0x0F)!=0))
 252   3                              {//TCK存在
 253   4                                      f=1;
 254   4                                      len++;
 255   4                              }
 256   3                              v=y+1;                  
 257   3                              if(dat&0x10){TX[8]=1;len++;v++;}                //判断TA3-TD3是否存在
 258   3                              if(dat&0x20){TX[9]=1;len++;v++;}

⌨️ 快捷键说明

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