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

📄 icrdwr.lst

📁 包含电路图及c语言程序
💻 LST
字号:
C51 COMPILER V7.02b   ICRDWR                                                               12/10/2005 19:53:55 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE ICRDWR
OBJECT MODULE PLACED IN ICRdWr.OBJ
COMPILER INVOKED BY: E:\EDATOOLS\KEILC7.0\C51\BIN\C51.EXE ICRdWr.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*****************************************/
   2          /* Copyright (c) 2005, 通信工程学院      */
   3          /* All rights reserved.                  */
   4          /* 作    者:戴 佳                                               */
   5          /*****************************************/
   6          
   7          #include "ICRdWr.h"
   8          
   9          /* 延时t毫秒 */
  10          void delay(uint t)
  11          {
  12   1              uint i;
  13   1              while(t--)
  14   1              {
  15   2                      /* 对于11.0592M时钟,约延时1ms */
  16   2                      for (i=0;i<125;i++)
  17   2                      {}
  18   2              }
  19   1      } 
  20          
  21          /* 获取需要存入IC卡数据的函数*/
  22          void getdata()
  23          {
  24   1              // 此函数简化如下:
  25   1              uchar i;
  26   1              for (i=0;i<8;i++)
  27   1                      data_in[i]=i+1;
  28   1      }
  29          
  30          /* 写单片机AT89S8252的SPDR寄存器,数据通过SPI口串行输出给IC卡芯片 */
  31          void write_spi(uchar dat)
  32          {
  33   1             SPDR = dat;
  34   1             while (!(SPSR & 0x80)) ;         // 等待一次传输完成
  35   1      }
  36          
  37          /* 获取IC卡芯片状态函数 */
  38          uchar IC_stat(void)
  39          {
  40   1          P1_1 = 0;                                   // 使能IC卡芯片;/cs=0
  41   1          
  42   1              write_spi(STAT_REG_READ);                       // 写入读IC卡芯片状态指令
  43   1              write_spi(0x00);                    // 写无关比特
  44   1         
  45   1          P1_1 = 1;                                   // 禁用IC卡芯片;/cs=1
  46   1          return SPDR;                                                // 返回IC卡芯片状态字节
  47   1      }
  48          
  49          /* 写IC卡芯片函数:将数据写入buffer,如果buffer满,
  50                  则将buffer中数据写入主内存页 */
  51          void write_to_IC(uchar dat)
  52          { 
  53   1              uchar stat;
  54   1      
  55   1          /* 检查IC卡芯片是否忙 */
C51 COMPILER V7.02b   ICRDWR                                                               12/10/2005 19:53:55 PAGE 2   

  56   1              stat = IC_stat();
  57   1          while ((stat&0x80)==0x00);
  58   1              
  59   1              /* 数据写入buffer */
  60   1          P1_1 = 0;                                           // 使能IC卡芯片;/cs=0          
  61   1              write_spi(BUFFER_1_WRITE);                              // buffer1写指令代码 
  62   1          write_spi(0x00);                            // 写入8位无关位
  63   1          write_spi((uchar)(buf_start_addr>>8));      // 写入7位无关位加上9位buffer起始字节地址的第1位
  64   1          write_spi((uchar)buf_start_addr);           // 写入9位buffer起始字节地址的后8位
  65   1          write_spi(dat);                             // 写入数据        
  66   1          P1_1 = 1;                                           // 禁用IC卡芯片;结束buffer write指令
  67   1          
  68   1          buf_start_addr++;                                           // 下一buffer起始字节地址
  69   1          
  70   1          /* 如果buffer写满,则将buffer中数据写入主内存页 */
  71   1          if (buf_start_addr > 263)               
  72   1          {
  73   2              buf_start_addr = 0;                                     // buffer起始字节地址重置0
  74   2              if (page_addr < 2047)                   // 如果主内存页不满
  75   2              { 
  76   3                              /* buffer数据写入主内存页 */
  77   3                  P1_1 = 0;                                           // 使能IC卡芯片;/cs=0
  78   3                      write_spi(B1_TO_MM_PAGE_NO_ERA);        // 写入无在线擦除的buffer1写主内存页指令代码             
  79   3                  write_spi((uchar)(page_addr>>7));   // 写入4位保留位加上11位页地址的高4位
  80   3                  write_spi((uchar)(page_addr<<1));   // 写入11位页地址的低7位和1位无关位
  81   3                  write_spi(0x00);                    // 再写入8位无关位        
  82   3                  P1_1 = 1;                                   // 禁用IC卡芯片;结束无在线擦除的buffer写主内存页指令
  83   3      
  84   3                  page_addr++;                                // 下一页地址
  85   3              }
  86   2          }  
  87   1      }
  88          
  89          /* 读IC卡芯片函数,如果一页读完,则读取下一页 */
  90          uchar read_from_IC()
  91          {
  92   1              uchar stat;
  93   1              uchar tmp;
  94   1      
  95   1              /* 检查IC卡芯片是否忙 */
  96   1              stat = IC_stat();
  97   1          while ((stat&0x80)==0x00);
  98   1      
  99   1              /* 从主内存页中读出数据 */
 100   1              P1_1 = 0;                                       // 使能IC卡芯片;/cs=0  
 101   1              write_spi(MM_PAGE_READ) ;               // 写入主内存页读指令代码
 102   1              tmp = (uchar)(page_addr>>7);
 103   1              write_spi(tmp);                                 // 写入4位保留位加上11位页地址的高4位
 104   1              tmp = (uchar)(page_addr<<1)|((uchar)(page_start_addr>>8)&0x01);
 105   1          write_spi(tmp);                                     // 写入11位页地址的低7位和9位页起始字节地址的最高位
 106   1              tmp = (uchar)(page_start_addr);
 107   1              write_spi(tmp);                                 // 写入9位页起始字节地址的低8位
 108   1              write_spi(0x00) ;                               // 写入8位无关位
 109   1              write_spi(0x00) ;                               // 写入8位无关位
 110   1              write_spi(0x00) ;                               // 写入8位无关位
 111   1              write_spi(0x00) ;                               // 再写入8位无关位,共写入32位无关位
 112   1              write_spi(0xff) ;                               // 写入8位无意义值以确保完成一字节数据的读出    
 113   1              P1_1 = 1;                               // 禁用IC卡芯片;结束主内存页读指令
 114   1      
 115   1              page_start_addr++;                              // 下一页中起始字节地址
 116   1      
 117   1              /* 如果读完一页,则读取下一页 */
C51 COMPILER V7.02b   ICRDWR                                                               12/10/2005 19:53:55 PAGE 3   

 118   1          if (page_start_addr > 263)               
 119   1          {
 120   2              page_start_addr = 0;                            // 页起始字节地址重置0
 121   2              if (page_addr < 2047)                   // 如果主内存页没有读完
 122   2                      page_addr++;                            // 下一页地址        
 123   2          }  
 124   1      
 125   1              return SPDR;                                    // 返回读出数据
 126   1      }
 127          
 128          /* 主函数 */
 129          void main()
 130          {
 131   1              uchar i;
 132   1      
 133   1              P1_0 = 1;                                               // /RST引脚置高
 134   1      
 135   1              /* SPIE=0,SPE=1,DORD=0,MSTR=1,CPOL=CPHA=1,SPR1=0,SPR0=1*/
 136   1              SPCR=0x5d;
 137   1      
 138   1              buf_start_addr = 0;
 139   1              page_start_addr = 0;
 140   1              page_addr = 0;  
 141   1              
 142   1              /* 获取需要写入IC卡的数据,存放在data_in[]中 */
 143   1              getdata();                                              
 144   1      
 145   1              /* 将data_in[]中存放数据写入IC卡 */
 146   1              for (i=0;i<DATA_IN_MAX_LEN;i++)
 147   1              {
 148   2                      write_to_IC(data_in[i]);
 149   2                      delay(2);                                       // 延时2ms
 150   2              }
 151   1      
 152   1              delay(10);                                              // 延时10ms
 153   1      
 154   1              buf_start_addr = 0;
 155   1              page_start_addr = 0;
 156   1              page_addr = 0;
 157   1      
 158   1              /* 数据读出IC卡,存放在data_out[]中 */
 159   1              for (i=0;i<DATA_OUT_MAX_LEN;i++)
 160   1              {
 161   2                      data_out[i] = read_from_IC();
 162   2                      delay(2);                                       // 延时2ms
 163   2              }
 164   1      
 165   1              while(1);       
 166   1      }
 167          
 168          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    377    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     22    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.

C51 COMPILER V7.02b   ICRDWR                                                               12/10/2005 19:53:55 PAGE 4   


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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