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

📄 eprom.lst

📁 RM0038红外传感器接收电视机摇控的源码
💻 LST
字号:
C51 COMPILER V7.00  EPROM                                                                  07/18/2007 12:16:47 PAGE 1   


C51 COMPILER V7.00, COMPILATION OF MODULE EPROM
OBJECT MODULE PLACED IN Eprom.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Eprom.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include "default.h"
   2          #include "Stdafx.h"
   3          #include "Eprom.h"
   4          
   5          /* 定义命令 */
   6          #define READ_AP_and_Data_Memory_Command                         0x01        /*  字节读数据存储区   */
   7          #define PROGRAM_AP_and_Data_Memory_Command          0x02        /*  字节编程数据存储区 */
   8          #define SECTOR_ERASE_AP_and_Data_Memory_Command     0x03        /*  扇区擦除数据存储区 */
   9          
  10          //20MHZ
  11          #define WAIT_TIME        0x01
  12          
  13          #define DEBUG_AP_Memory_Begin_Sector_addr               0x0000
  14          #define DEBUG_AP_Memory_End_Sector_addr         0x7e00
  15          #define DEBUG_AP_Memory_End_Byte_addr           0x7fff
  16          
  17          #define DEBUG_Data_Memory_Begin_Sector_addr     0x8000
  18          /* 打开 ISP,IAP 功能 */
  19          void ISP_IAP_enable(void)
  20          {
  21   1              EA      =       0;      /* 关中断 */
  22   1              ISP_CONTR       =       ISP_CONTR & 0x18;       /* 0001,1000 */
  23   1              ISP_CONTR       =       ISP_CONTR | WAIT_TIME;
  24   1              ISP_CONTR       =       ISP_CONTR | 0x80;       /* 1000,0000 */
  25   1      }
  26          
  27          /* 关闭 ISP,IAP 功能 */
  28          void ISP_IAP_disable(void)
  29          {
  30   1              ISP_CONTR       =       ISP_CONTR & 0x7f;       /* 0111,1111 */
  31   1              ISP_TRIG        =       0x00;
  32   1              EA                      =   1;                  /* 开中断 */
  33   1      }
  34          
  35          void ispcommand(uchar uCommand)
  36          {
  37   1              ISP_CMD &=      0xF8;   /* 1111,1000 */
  38   1              ISP_CMD |=      uCommand;
  39   1      }
  40          
  41          uchar readchar(uint byte_addr)
  42          {
  43   1              ISP_DATA = 0;
  44   1              ispcommand(READ_AP_and_Data_Memory_Command);        /* 0000,0001 */     
  45   1              ISP_IAP_enable();
  46   1              ISP_ADDRH       =       (uchar)(byte_addr >> 8);
  47   1              ISP_ADDRL       =       (uchar)(byte_addr & 0x00ff);
  48   1              ISP_TRIG        =       0x46;
  49   1              ISP_TRIG        =       0xb9;
  50   1              _nop_();
  51   1              ISP_IAP_disable();
  52   1              return (ISP_DATA);
  53   1      }
  54          
  55          void writechar(uint byte_addr,uchar uWrite)
C51 COMPILER V7.00  EPROM                                                                  07/18/2007 12:16:47 PAGE 2   

  56          {
  57   1              ispcommand(PROGRAM_AP_and_Data_Memory_Command);/* 0000,0010 */
  58   1              ISP_IAP_enable();
  59   1              ISP_ADDRH       =       (uchar)(byte_addr >> 8);
  60   1              ISP_ADDRL       =       (uchar)(byte_addr & 0x00ff);
  61   1              ISP_DATA        =       uWrite;
  62   1              ISP_TRIG        =       0x46;
  63   1              ISP_TRIG        =       0xb9;
  64   1              _nop_();
  65   1              ISP_IAP_disable();
  66   1      }
  67          
  68          /* 扇区擦除 */
  69          uchar sector_erase(uint uSector)
  70          {
  71   1              uint xdata sector_addr = DEBUG_Data_Memory_Begin_Sector_addr + uSector*512;
  72   1              uint xdata get_sector_addr      =       0;
  73   1              get_sector_addr                 =       (sector_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
  74   1              ISP_ADDRH                       =       (uchar)(get_sector_addr >> 8);
  75   1              ISP_ADDRL                       =       0x00;
  76   1      
  77   1              ispcommand(SECTOR_ERASE_AP_and_Data_Memory_Command);    /* 0000,0011 */
  78   1      
  79   1              ISP_IAP_enable();
  80   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
  81   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
  82   1              ISP_IAP_disable();
  83   1              _nop_();           
  84   1              return OK;
  85   1      }
  86          
  87          /* 字节编程并校验 */
  88          //uSector 第几扇区,pWrite,写入数据指针, uint uCount,多少个字节
  89          bit WriteEprom(uchar uSector, uchar *pWrite, uint uCount)
  90          {
  91   1              uint xdata i = 0;
  92   1              uchar xdata ii;
  93   1              uint xdata byte_addr = DEBUG_Data_Memory_Begin_Sector_addr + uSector*512;
  94   1              uint xdata uMove = 0;
  95   1              bit bBreak = 0;
  96   1              if(uCount > 256)
  97   1              {
  98   2                      sector_erase(uSector);// 扇区擦除
  99   2              }else
 100   1              {
 101   2                      uMove = (510 - 510/(8*uCount))/(8*uCount) + 1;
 102   2                      if(readchar(byte_addr) != (uchar)uCount)
 103   2                      {
 104   3                              sector_erase(uSector);// 扇区擦除
 105   3                              writechar(byte_addr, (uchar)uCount);
 106   3                      }else
 107   2                      {
 108   3                              for(i = 0; i < (510 - 510/(8*uCount))/(8*uCount);i++)
 109   3                              {
 110   4                                      uchar xdata tChar = readchar(byte_addr + i + 1);
 111   4                                      for(ii = 0; ii < 8; ii++)
 112   4                                      {
 113   5                                              if((tChar &(0x01 << ii)) == 0)
 114   5                                              {
 115   6                                                      uMove += uCount;
 116   6                                              }else
 117   5                                              {
C51 COMPILER V7.00  EPROM                                                                  07/18/2007 12:16:47 PAGE 3   

 118   6                                                      uchar xdata ij;
 119   6                                                      //对比新的参数是否和旧的一样
 120   6                                                      for(ij = 0; ij < uCount; ij++)
 121   6                                                      {
 122   7                                                              if(readchar(byte_addr + ij + uMove) != pWrite[ij])
 123   7                                                              {
 124   8                                                                      bBreak = 1;
 125   8                                                                      break;
 126   8                                                              }
 127   7                                                      }
 128   6                                                      if(bBreak)
 129   6                                                      {
 130   7                                                              tChar &= (0xFE << ii);
 131   7                                                              writechar(byte_addr + i + 1,tChar);
 132   7                                                      }else return OK;
 133   6                                                      break;
 134   6                                              }
 135   5                                      }
 136   4                                      if(bBreak)
 137   4                                      {
 138   5                                              uMove += uCount;
 139   5                                      }
 140   4                                      if((tChar == 0)&&(i >= ((510 - 510/(8*uCount))/(8*uCount) - 1)))
 141   4                                      {
 142   5                                              sector_erase(uSector);// 扇区擦除
 143   5                                              writechar(byte_addr, (uchar)uCount);
 144   5                                              uMove = (510 - 510/(8*uCount))/(8*uCount) + 1;
 145   5                                      }
 146   4                                      if(bBreak)
 147   4                                      {
 148   5                                              break;
 149   5                                      }
 150   4                              }
 151   3                      }
 152   2              }
 153   1      
 154   1              //ConvetLed2((long)uMove + 1000);
 155   1              //delay(60000);delay(60000);
 156   1      
 157   1              for(i = 0; i < uCount; i++)
 158   1              {
 159   2                      writechar(byte_addr + i + uMove, pWrite[i]);
 160   2              }
 161   1      
 162   1              for(i = 0; i < uCount; i++)
 163   1              {
 164   2                      if(readchar(byte_addr + i + uMove) != pWrite[i])
 165   2                      {
 166   3                              P4_3 = 0;
 167   3                              delay(5000);
 168   3                              P4_3 = 1;
 169   3                              ConvetLed2(i + uMove);
 170   3                              delay(60000);delay(60000);delay(60000);delay(60000);
 171   3                              return ERROR;
 172   3                      }
 173   2              }
 174   1              return  OK;
 175   1      }
 176          
 177          /* 读Eprom*/
 178          //uSector 第几扇区,pWrite,读出数据指针, uint uCount,多少个字节
 179          bit ReadEprom(uchar uSector, uchar *pWrite, uint uCount)
C51 COMPILER V7.00  EPROM                                                                  07/18/2007 12:16:47 PAGE 4   

 180          {
 181   1              uint xdata i = 0;
 182   1              uchar xdata ii;
 183   1              uint xdata byte_addr = DEBUG_Data_Memory_Begin_Sector_addr + uSector*512;
 184   1              uint xdata uMove = 0;
 185   1              bit bBreak = 0;
 186   1      
 187   1              if(uCount > 256)
 188   1              {
 189   2                      
 190   2              }else
 191   1              {
 192   2                      uMove = (510 - 510/(8*uCount))/(8*uCount) + 1;
 193   2                      if(readchar(byte_addr) != (uchar)uCount)
 194   2                      {
 195   3                              P4_3 = 0;
 196   3                              delay(5000);
 197   3                              P4_3 = 1;
 198   3                              delay(5000);
 199   3                              P4_3 = 0;
 200   3                              delay(5000);
 201   3                              P4_3 = 1;
 202   3                              delay(5000);
 203   3                              P4_3 = 0;
 204   3                              delay(5000);
 205   3                              P4_3 = 1;
 206   3                      }
 207   2                      for(i = 0; i < (510 - 510/(8*uCount))/(8*uCount);i++)
 208   2                      {
 209   3                              uchar xdata tChar = readchar(byte_addr + i + 1);
 210   3                              for(ii = 0; ii < 8; ii++)
 211   3                              {
 212   4                                      if((tChar &(0x01 << ii)) == 0)
 213   4                                      {
 214   5                                              uMove += uCount;
 215   5                                      }else
 216   4                                      {
 217   5                                              bBreak = 1;
 218   5                                              break;
 219   5                                      }
 220   4                              }
 221   3                              
 222   3                              if(bBreak)
 223   3                              {
 224   4                                      break;
 225   4                              }
 226   3                      }
 227   2              }
 228   1      
 229   1              for(i = 0; i < uCount; i++)
 230   1              {
 231   2                      pWrite[i] = readchar(byte_addr + i + uMove);
 232   2              }
 233   1              return  OK;
 234   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1539    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----      21
   PDATA SIZE       =   ----    ----
C51 COMPILER V7.00  EPROM                                                                  07/18/2007 12:16:47 PAGE 5   

   DATA SIZE        =   ----      12
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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