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

📄 eeprom.lst

📁 市面上的车载GPS定位器源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 188   1      
 189   1              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 190   1              ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 191   1      
 192   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 193   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 194   1              _nop_();
 195   1      
 196   1              ISP_IAP_disable();
 197   1      
 198   1              if(ISP_DATA     ==      original_data)
 199   1                      return  OK;
 200   1              else
 201   1                      return  ERROR;
 202   1      }
 203          
 204          /* 写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据 */
 205          /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源       */
 206          INT8U sequential_write_flash_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
 207          {
 208   1              INT16U  i       =       0;
 209   1              INT16U  in_sector_begin_addr    =       0;
 210   1              INT16U  sector_addr     =       0;
 211   1      
 212   1              /* 判是否是有效范围,此函数不允许跨扇区操作 */
 213   1              if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
 214   1                      return  ERROR;
 215   1              in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
 216   1              if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
 217   1                      return ERROR;
 218   1      
 219   1          /* 擦除 要修改/写入 的扇区 */
 220   1              sector_addr     =       (begin_addr & 0xfe00);  /* 1111,1110,0000,0000; 取扇区地址 */
 221   1              ISP_ADDRH       =       (INT8U)(sector_addr >> 8);
 222   1              ISP_ADDRL       =       0x00;
 223   1              ISP_CMD         =       ISP_CMD &       0xf8;           /* 1111,1000 */
 224   1              ISP_CMD         =       ISP_CMD |       SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */
 225   1      
 226   1              ISP_IAP_enable();
 227   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 228   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 229   1              _nop_();
 230   1      
 231   1              for(i = 0; i< counter; i++)
 232   1              {
 233   2                      /* 写一个字节 */
 234   2                      ISP_ADDRH       =       (INT8U)(begin_addr >> 8);
 235   2                      ISP_ADDRL       =       (INT8U)(begin_addr & 0x00ff);
 236   2                      ISP_DATA        =       array[i];
 237   2                      ISP_CMD         =       ISP_CMD &       0xf8;   /* 1111,1000 */
 238   2                      ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;             /* 0000,0010 */
 239   2      
 240   2                      ISP_TRIG        =       0x46;   /* 触发ISP_IAP命令 */
C51 COMPILER V7.06   EEPROM                                                                04/10/2006 16:28:24 PAGE 5   

 241   2                      ISP_TRIG        =       0xb9;   /* 触发ISP_IAP命令 */
 242   2                      _nop_();
 243   2      
 244   2                      /* 读回来 */
 245   2                      ISP_DATA        =       0x00;
 246   2      
 247   2                      ISP_CMD         =       ISP_CMD &       0xf8;   /* 1111,1000 */
 248   2                      ISP_CMD     =   ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 249   2      
 250   2                      ISP_TRIG        =       0x46;   /* 触发ISP_IAP命令 */
 251   2                      ISP_TRIG        =       0xb9;   /* 触发ISP_IAP命令 */
 252   2                      _nop_();
 253   2      
 254   2                      /*  比较对错 */
 255   2                      if(ISP_DATA != array[i])
 256   2                      {
 257   3                              ISP_IAP_disable();
 258   3                              return ERROR;
 259   3                      }
 260   2              begin_addr++;
 261   2              }
 262   1              ISP_IAP_disable();
 263   1              return  OK;
 264   1      }
 265          
 266          /* 写数据进数据Flash存储器(EEPROM), 只在同一个扇区内写,保留同一扇区中不需修改的数据    */
 267          /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源               */
 268          INT8U write_flash_with_protect_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
 269          {
 270   1              INT16U  i       =       0;
 271   1              INT16U  in_sector_begin_addr    =       0;
 272   1              INT16U  sector_addr     =       0;
 273   1              INT16U  byte_addr       =       0;
 274   1      
 275   1              /* 判是否是有效范围,此函数不允许跨扇区操作 */
 276   1              if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
 277   1                      return ERROR;
 278   1              in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
 279   1              /* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写 */
 280   1              if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
 281   1                      return ERROR;
 282   1      
 283   1              /* 将该扇区数据 0 - (USED_BYTE_QTY_IN_ONE_SECTOR-1) 字节数据读入缓冲区保护 */
 284   1              sector_addr             =       (begin_addr & 0xfe00);  /* 1111,1110,0000,0000; 取扇区地址              */
 285   1              byte_addr               =   sector_addr;                        /* 扇区地址为扇区首字节地址                             */
 286   1      
 287   1              ISP_IAP_enable();
 288   1              for(i = 0; i < USED_BYTE_QTY_IN_ONE_SECTOR; i++)
 289   1              {
 290   2                      ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
 291   2                      ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
 292   2      
 293   2                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 294   2                      ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 295   2      
 296   2                      ISP_TRIG        =       0x46;
 297   2                      ISP_TRIG        =       0xb9;
 298   2                      _nop_();
 299   2      
 300   2                      protect_buffer[i]       =       ISP_DATA;
 301   2                      byte_addr++;
 302   2              }
C51 COMPILER V7.06   EEPROM                                                                04/10/2006 16:28:24 PAGE 6   

 303   1      
 304   1              /* 将要写入的数据写入保护缓冲区的相应区域,其余部分保留 */
 305   1              for(i = 0; i < counter; i++)
 306   1              {
 307   2                      protect_buffer[in_sector_begin_addr] = array[i];
 308   2                      in_sector_begin_addr++;
 309   2              }
 310   1      
 311   1              /* 擦除 要修改/写入 的扇区 */
 312   1              ISP_ADDRH       =       (INT8U)(sector_addr >> 8);
 313   1              ISP_ADDRL       =       0x00;
 314   1              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 315   1              ISP_CMD         =       ISP_CMD |       SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */
 316   1      
 317   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 318   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 319   1              _nop_();
 320   1      
 321   1              /* 将保护缓冲区的数据写入 Data Flash, EEPROM */
 322   1              byte_addr       =   sector_addr;                        /* 扇区地址为扇区首字节地址     */
 323   1              for(i = 0; i< USED_BYTE_QTY_IN_ONE_SECTOR; i++)
 324   1              {
 325   2                      /* 写一个字节 */
 326   2                      ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
 327   2                      ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
 328   2                      ISP_DATA        =       protect_buffer[i];
 329   2                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 330   2                      ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;             /* 0000,0010 */
 331   2      
 332   2                      ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 333   2                      ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 334   2                      _nop_();
 335   2      
 336   2                      /* 读回来 */
 337   2                      ISP_DATA        =       0x00;
 338   2      
 339   2                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 340   2                      ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 341   2      
 342   2                      ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 343   2                      ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 344   2                      _nop_();
 345   2      
 346   2                      /*  比较对错 */
 347   2                      if(ISP_DATA != protect_buffer[i])
 348   2                      {
 349   3                              ISP_IAP_disable();
 350   3                              return ERROR;
 351   3              }
 352   2              byte_addr++;
 353   2              }
 354   1              ISP_IAP_disable();
 355   1              return OK;
 356   1      }
 357          
 358          /* 测试常量数组 */
 359          INT8U code Test_array_total[512]        =
 360          {
 361                  0x00,        0x01,        0x02,        0x03,        0x04,        0x05,        0x06,        0x07,
 362                  0x08,        0x09,        0x0a,        0x0b,        0x0c,        0x0d,        0x0e,        0x0f,
 363                  0x10,        0x11,        0x12,        0x13,        0x14,        0x15,        0x16,        0x17,
 364                  0x18,        0x19,        0x1a,        0x1b,        0x1c,        0x1d,        0x1e,        0x1f,
C51 COMPILER V7.06   EEPROM                                                                04/10/2006 16:28:24 PAGE 7   

 365                  0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        0x26,        0x27,
 366                  0x28,        0x29,        0x2a,        0x2b,        0x2c,        0x2d,        0x2e,        0x2f,
 367                  0x30,        0x31,        0x32,        0x33,        0x34,        0x35,        0x36,        0x37,
 368                  0x38,        0x39,        0x3a,        0x3b,        0x3c,        0x3d,        0x3e,        0x3f,
 369                  0x40,        0x41,        0x42,        0x43,        0x44,        0x45,        0x46,        0x47,
 370                  0x48,        0x49,        0x4a,        0x4b,        0x4c,        0x4d,        0x4e,        0x4f,
 371                  0x50,        0x51,        0x52,        0x53,        0x54,        0x55,        0x56,        0x57,
 372                  0x58,        0x59,        0x5a,        0x5b,        0x5c,        0x5d,        0x5e,        0x5f,
 373                  0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
 374                  0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
 375                  0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
 376                  0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        0x7f,
 377                  0x80,        0x81,        0x82,        0x83,        0x84,        0x85,        0x86,        0x87,
 378                  0x88,        0x89,        0x8a,        0x8b,        0x8c,        0x8d,        0x8e,        0x8f,
 379                  0x90,        0x91,        0x92,        0x93,        0x94,        0x95,        0x96,        0x97,
 380                  0x98,        0x99,        0x9a,        0x9b,        0x9c,        0x9d,        0x9e,        0x9f,
 381                  0xa0,        0xa1,        0xa2,        0xa3,        0xa4,        0xa5,        0xa6,        0xa7,
 382                  0xa8,        0xa9,        0xaa,        0xab,        0xac,        0xad,        0xae,        0xaf,
 383                  0xb0,        0xb1,        0xb2,        0xb3,        0xb4,        0xb5,        0xb6,        0xb7,
 384                  0xb8,        0xb9,        0xba,        0xbb,        0xbc,        0xbd,        0xbe,        0xbf,

⌨️ 快捷键说明

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