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

📄 sle4442.lst

📁 IC卡读写程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.07   SLE4442                                                               03/21/2004 15:22:08 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE SLE4442
OBJECT MODULE PLACED IN SLE4442.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE SLE4442.c LARGE BROWSE INTVECTOR(0X8000) DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          #include <reg52.h>
   3          #include "SLE4442.h"
   4          #include <intrins.h>
   5          
   6          /* 延时5个us宏定义 */
   7          #define Delay5Us()    _nop_();_nop_();_nop_();_nop_();_nop_()
   8          
   9          /* 延时10个us宏定义 */
  10          #define Delay10Us()   _nop_();_nop_();_nop_();_nop_();_nop_();\
  11                                                    _nop_();_nop_();_nop_();_nop_();_nop_()
  12          
  13          unsigned char bdata ibase;              //定义位寻址单元,用于发送与接收
  14                                                                          //一个字节
  15          sbit mybit0 = ibase^0;
  16          sbit mybit1 = ibase^1;
  17          sbit mybit2 = ibase^2;
  18          sbit mybit3 = ibase^3;
  19          sbit mybit4 = ibase^4;
  20          sbit mybit5 = ibase^5;
  21          sbit mybit6 = ibase^6;
  22          sbit mybit7 = ibase^7;
  23          
  24          /***************************************************************
  25          函数名称:Readchar
  26          功        能:读一个字节
  27          输        入: 无
  28          输        出:所得的字节的值 
  29          ****************************************************************/
  30          unsigned char Readchar(void)
  31          {
  32   1              CLK = 0; Delay5Us(); mybit0 = IO; CLK = 1; Delay5Us();  //一个脉冲接收1 bit
  33   1              CLK = 0; Delay5Us(); mybit1 = IO; CLK = 1; Delay5Us();  //一个脉冲接收1 bit
  34   1              CLK = 0; Delay5Us(); mybit2 = IO; CLK = 1; Delay5Us();  //一个脉冲接收1 bit
  35   1              CLK = 0; Delay5Us(); mybit3 = IO; CLK = 1; Delay5Us();  //一个脉冲接收1 bit
  36   1              CLK = 0; Delay5Us(); mybit4 = IO; CLK = 1; Delay5Us();  //一个脉冲接收1 bit
  37   1              CLK = 0; Delay5Us(); mybit5 = IO; CLK = 1; Delay5Us();  //一个脉冲接收1 bit
  38   1              CLK = 0; Delay5Us(); mybit6 = IO; CLK = 1; Delay5Us();  //一个脉冲接收1 bit
  39   1              CLK = 0; Delay5Us(); mybit7 = IO; CLK = 1; Delay5Us();  //一个脉冲接收1 bit
  40   1              
  41   1              return(ibase);          //返回读得的一个字节
  42   1      }
  43          
  44          /************************************************************
  45          函数名称:SendByte
  46          功    能:把一个字节的数据由低到高位依次发送出去
  47          输        入:unsigned char sendchar --- 要发送的字节
  48          输        出;无
  49          *************************************************************/
  50          void SendByte(unsigned char sendchar)
  51          {       
  52   1              unsigned char i = 8;
  53   1              ibase = sendchar;
  54   1      
  55   1              for(; i > 0; i--)                       //8个比特发送8次
C51 COMPILER V7.07   SLE4442                                                               03/21/2004 15:22:08 PAGE 2   

  56   1              {                                                       
  57   2                      CLK = 0;                
  58   2                      Delay5Us();
  59   2                      IO  = mybit0;                   //一个脉冲发送一个比特mybit0
  60   2                      CLK = 1;
  61   2                      Delay5Us();
  62   2                      ibase = ibase>>1;               //将下次要发送的比特位移到mybit0
  63   2              }
  64   1      }
  65          
  66          
  67          /***********************************************************
  68          函数名称:RstCard
  69          功    能:使IC卡SLE4442复位
  70          输        入:无
  71          输        出:0 --- 复位成功
  72                        1 --- 复位失败,卡为无效卡或卡已损坏 
  73          ************************************************************/
  74          unsigned char RstCard(void)
  75          {
  76   1              unsigned char i;
  77   1              unsigned char ReadBuf[4];
  78   1      
  79   1              IO  = 1;                                //IO  引脚置高电平                      
  80   1              RST = 0;                                //RST 引脚置低电平
  81   1              CLK = 0;                                //CLK 引脚置低电平
  82   1      
  83   1              Delay10Us();                    //下面在一个RST脉冲期间产生一个CLK脉冲
  84   1              RST = 1;
  85   1              Delay5Us();
  86   1              CLK = 1;
  87   1              Delay5Us();
  88   1              CLK = 0;
  89   1              Delay5Us();
  90   1              RST = 0;
  91   1                                                              //接收复位响应值
  92   1              for(i = 0; i < 4; i++)
  93   1              {
  94   2                      ReadBuf[i] = Readchar();
  95   2              }
  96   1      
  97   1              CLK = 1;
  98   1              Delay5Us();             
  99   1              CLK = 0;                
 100   1              IO  = 1;                                //置CLK和IO为复位时序图复位完成时的状态         
 101   1              
 102   1              if ((ReadBuf[0] == IDENTIFY1) && (ReadBuf[1] == IDENTIFY2) &&
 103   1                  (ReadBuf[2] == IDENTIFY3) && (ReadBuf[3] == IDENTIFY4))
 104   1              {       
 105   2                      return 0;                       //复位值正确,返回复位成功
 106   2              }
 107   1              else
 108   1              {
 109   2                      return 1;                       //复位值错误,返回复位失败
 110   2              }  
 111   1      }
 112          
 113          
 114                  
 115          /************************************************************
 116          函数名:SendCommand
 117          功  能:根据不同的参数把命令字发给IC卡
C51 COMPILER V7.07   SLE4442                                                               03/21/2004 15:22:08 PAGE 3   

 118          参  数:unsigned char command  --- 命令字;
 119                          unsigned char Address  --- 地址;
 120                          unsigned char senddata --- 数据
 121          返回值:无
 122          *************************************************************/
 123          void SendCommand(unsigned char command,unsigned char Address,unsigned char senddata)
 124          {
 125   1              IO  = 1;                        /*产生开始状态*/
 126   1              CLK = 0;
 127   1              Delay5Us();
 128   1              CLK = 1;
 129   1              Delay10Us();
 130   1              IO = 0;
 131   1              Delay10Us();
 132   1              CLK = 0;
 133   1                                                      /*发送命令*/
 134   1              SendByte(command);
 135   1              SendByte(Address);
 136   1              SendByte(senddata);
 137   1                                                      /*产生停止状态*/
 138   1              CLK = 0;
 139   1              IO  = 0;
 140   1              Delay5Us();
 141   1              CLK = 1;
 142   1              Delay5Us();
 143   1              IO  = 1;
 144   1              Delay5Us();
 145   1      }
 146          
 147          /****************************************************************
 148          函数名称:SendClock
 149          功    能:发送处理脉冲
 150          输    入:无
 151          输        出:无
 152          *****************************************************************/
 153          void SendClock(void)
 154          {       
 155   1              CLK=0;                          //产生一个脉冲,做为处理的工始
 156   1              Delay10Us();
 157   1              CLK=1;
 158   1              Delay10Us();
 159   1      
 160   1              do
 161   1              {
 162   2                      CLK=0;                  
 163   2                      Delay10Us();
 164   2                      CLK=1;
 165   2                      Delay10Us();
 166   2              }while(IO == 0);        //不断产生处理脉冲,驱动IC卡内部处理,直到IC卡将
 167   1      }                                               //IO口拉为高电平
 168          
 169          /***************************************************************
 170          函数名称:ReadCm
 171          功    能:从主存储器中读出数据块并存入ReadBuf中
 172          输        入:unsigned char StarAddr --- 开始地址(0 - 255)
 173                            unsigned char ByteNum  --- 要读出的字节数(1 - 256)
 174                            unsigned char *RecBuf  --- 接收数据缓冲区
 175          输        出: 0 --- 读成功
 176                            1 --- 表示无效卡或者卡损坏    
 177          ****************************************************************/
 178          unsigned char ReadCm(unsigned char StarAddr,unsigned char ByteNum,unsigned char *RecBuf)
 179          {
C51 COMPILER V7.07   SLE4442                                                               03/21/2004 15:22:08 PAGE 4   

 180   1              unsigned char i = 0;
 181   1      
 182   1              if (RstCard() == 1)                                             /* 使卡复位*/
 183   1                      return 1;                                                       /* 如果复位失败返回1 */
 184   1                      
 185   1              SendCommand(0x30,StarAddr,0x00);                /* 发送读主存命令 */
 186   1      
 187   1              for(i = 0; i < ByteNum; i++)
 188   1              {
 189   2                      *RecBuf = Readchar();                       /* 从主存中读出ByteNum个字节并存入RecBuf中 */
 190   2                      RecBuf++;
 191   2              }
 192   1                      return 0;
 193   1      }
 194          
 195          /****************************************************************
 196          函数名称: WriteCm
 197          功    能: 把存在WriteBuf中的ByteNum个字节的数据存入主存储器中
 198          输    入: unsigned char StarAdr   --- 开始地址(0 - 255)

⌨️ 快捷键说明

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