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

📄 iap.lst

📁 PLC源代码
💻 LST
字号:
C51 COMPILER V8.16   IAP                                                                   10/10/2009 14:43:36 PAGE 1   


C51 COMPILER V8.16, COMPILATION OF MODULE IAP
OBJECT MODULE PLACED IN IAP.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IAP.c LARGE WARNINGLEVEL(1) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "system.h"
   2          
   3          extern signed   int   xdata  _D[31];                      //  位元件 D 内存分配 
   4          #define   Value      _D[31]  // 变频显示器LED显示缓冲区
   5          
   6          //=======================================================================================================
   7          // 函数名称: IAPFlashErasureMode
   8          //
   9          // 功能描述:  页面擦除模式
  10          //
  11          // 输 入:  unsigned int pageaddr
  12          //          
  13          // 输 出:  void
  14          //         
  15          // 全局变量:  
  16          // 调用模块: 无
  17          //
  18          // 作 者:  卢明君
  19          // 日 期:  2009年9月15日
  20          // 备  注:  
  21          //-------------------------------------------------------------------------------------------------------
  22          // 修改人:
  23          // 日 期:
  24          // 备  注: 
  25          //-------------------------------------------------------------------------------------------------------
  26          //=======================================================================================================
  27          void IAPFlashErasureMode(unsigned int pageaddr)
  28          {
  29   1              ISPCR=0x83;                     // ISPCR.7=1,启用ISP
  30   1                                                      // ISPCR[2:0]=011, 假设MPC82系列运行在11.0592M
  31   1              IFMT=0x03;                      // 选择页擦除模式
  32   1              IFADRH=pageaddr>>8;     // 这个页面必须在IAP存储区
  33   1              IFADRL=pageaddr;
  34   1              SCMD=0x46;                      // 触发的ISP处理
  35   1              SCMD=0xb9;                      // MCU将会停止运行.直到处理完成
  36   1      }
  37          //=======================================================================================================
  38          // 函数名称: IAPFlashProgrem
  39          //
  40          // 功能描述:  单字节写入模式(无"检查是否写入成功")
  41          //
  42          // 输 入:  unsigned int codeaddr,unsigned char ucdata
  43          //          
  44          // 输 出:  void
  45          //         
  46          // 全局变量:  
  47          // 调用模块: 无
  48          //
  49          // 作 者:  卢明君
  50          // 日 期:  2009年9月15日
  51          // 备  注:  此函数不包含"检查是否写入成功".
  52          //-------------------------------------------------------------------------------------------------------
  53          // 修改人:
  54          // 日 期:
  55          // 备  注: 
C51 COMPILER V8.16   IAP                                                                   10/10/2009 14:43:36 PAGE 2   

  56          //-------------------------------------------------------------------------------------------------------
  57          //=======================================================================================================
  58          void IAPFlashProgrem(unsigned int codeaddr,unsigned char ucdata)
  59          {
  60   1              ISPCR=0x83;                     // ISPCR.7=1,启用ISP
  61   1                                                      // ISPCR[2:0]=011, 假设MPC82系列运行在11.0592M
  62   1              IFMT=0x02;                      // 进入编程模式
  63   1              IFADRH=codeaddr>>8;     // 这个字节必须在IAP存储区
  64   1              IFADRL=codeaddr;
  65   1              IFD=ucdata;                     // 填写待编程的数据
  66   1              SCMD=0x46;                      // 触发的ISP处理
  67   1              SCMD=0xb9;                      // MCU将会停止运行.直到处理完成
  68   1      }
  69          //=======================================================================================================
  70          // 函数名称: IAPFlashProgremMode
  71          //
  72          // 功能描述:  单字节写入模式(含有"检查是否写入成功")
  73          //
  74          // 输 入:  unsigned int codeaddr,unsigned char ucdata
  75          //          
  76          // 输 出:  void
  77          //         
  78          // 全局变量:  
  79          // 调用模块: IAPFlashErasureMode ; IAPFlashProgrem ; IAPFlashReadMode
  80          //
  81          // 作 者:  卢明君
  82          // 日 期:  2009年9月15日
  83          // 备  注:  此函数包含"检查是否写入成功".
  84          //-------------------------------------------------------------------------------------------------------
  85          // 修改人:
  86          // 日 期:
  87          // 备  注: 
  88          //-------------------------------------------------------------------------------------------------------
  89          //=======================================================================================================
  90          void IAPFlashProgremMode(unsigned int codeaddr,unsigned char ucdata)    // 编程模式
  91          {
  92   1              unsigned char checkdata=0;
  93   1              unsigned char retry=0;
  94   1              unsigned int  i=0;
  95   1              unsigned int  tempaddr=0;
  96   1              unsigned char tempdata;                                                                         //      为节省RAM 应运而生的变量.
  97   1              checkdata=IAPFlashReadMode(codeaddr);
  98   1              while(checkdata!=ucdata)                                                                        //      判断不相等后,再写入,相等就不必写入重新写入了.
  99   1              {
 100   2                      IAPFlashProgrem(codeaddr,ucdata);
 101   2                      if(++retry>ReTryTimes)                                                                  //      2次尝试机会
 102   2                      {
 103   3                              tempaddr=codeaddr-codeaddr%512;                                         //      计算当前页首地址
 104   3                              IAPFlashErasureMode(PLCTempAddr);                                       //      擦除IAP缓存备份空间     为节省RAM 应运而生的空间.
 105   3                              for(i=0;i<512;i++)                                                                      //      读出当前页所有数据,备份
 106   3                              {
 107   4                                      tempdata=IAPFlashReadMode(i+tempaddr);
 108   4                                      if(tempdata!=0xff)IAPFlashProgrem(i+PLCTempAddr,tempdata);                                      
 109   4                              }
 110   3                              IAPFlashErasureMode(tempaddr);                                          //      擦除当前页
 111   3                              if(ucdata!=0xff)IAPFlashProgrem(codeaddr,ucdata);       //      重写
 112   3                              for(i=0;i<512;i++)                                                                      //      将备份数据写回
 113   3                              {
 114   4                                      if(codeaddr==(i+tempaddr))continue;
 115   4                                      tempdata=IAPFlashReadMode(i+PLCTempAddr);
 116   4                                      if(tempdata!=0xff)IAPFlashProgrem(i+tempaddr,tempdata);
 117   4                              }
C51 COMPILER V8.16   IAP                                                                   10/10/2009 14:43:36 PAGE 3   

 118   3                      }
 119   2                      checkdata=IAPFlashReadMode(codeaddr);
 120   2                      if(retry>=ReTryOut)
 121   2                      {
 122   3                              while(1)        //      出错了,不写了,显示写错误的地址,请核对是否超出IAP空间大小
 123   3                              {
 124   4                                      Value=codeaddr;
 125   4      //                              Out_EY_BIT();
 126   4                              }
 127   3                      }
 128   2              }
 129   1      }
 130          //=======================================================================================================
 131          // 函数名称: IAPFlashReadMode
 132          //
 133          // 功能描述:  单字节读取模式
 134          //
 135          // 输 入:  unsigned int codeaddr
 136          //          
 137          // 输 出:  unsigned char
 138          //         
 139          // 全局变量:  
 140          // 调用模块: 无
 141          //
 142          // 作 者:  卢明君
 143          // 日 期:  2009年9月15日
 144          // 备  注:  
 145          //-------------------------------------------------------------------------------------------------------
 146          // 修改人:
 147          // 日 期:
 148          // 备  注: 
 149          //-------------------------------------------------------------------------------------------------------
 150          //=======================================================================================================
 151          unsigned char IAPFlashReadMode(unsigned int codeaddr)   // 读模式
 152          {
 153   1              ISPCR=0x83;                     // ISPCR.7=1,启用ISP
 154   1                                                      // ISPCR[2:0]=011, 假设MPC82系列运行在11.0592M
 155   1              IFMT=0x01;                      // 进入读模式
 156   1              IFADRH=codeaddr>>8;     // 这个字节必须在IAP存储区
 157   1              IFADRL=codeaddr;
 158   1              SCMD=0x46;                      // 触发的ISP处理
 159   1              SCMD=0xb9;                      // MCU将会停止运行.直到处理完成 // 触发IAP
 160   1              return IFD;                     // 读出的数据
 161   1      }


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


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

⌨️ 快捷键说明

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