EEPROM.lst 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. C51 COMPILER V9.54 EEPROM 09/26/2022 20:11:46 PAGE 1
  2. C51 COMPILER V9.54, COMPILATION OF MODULE EEPROM
  3. OBJECT MODULE PLACED IN .\Objects\EEPROM.obj
  4. COMPILER INVOKED BY: D:\Keil5 C51\C51\BIN\C51.EXE EEPROM.c LARGE OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\Lis
  5. -tings\EEPROM.lst) TABS(2) OBJECT(.\Objects\EEPROM.obj)
  6. line level source
  7. 1 #include "config.h"
  8. 2 #include "eeprom.h"
  9. 3
  10. 4 //========================================================================
  11. 5 // 函数: void ISP_Disable(void)
  12. 6 // 描述: 禁止访问ISP/IAP.
  13. 7 // 参数: non.
  14. 8 // 返回: non.
  15. 9 // 版本: V1.0, 2012-10-22
  16. 10 //========================================================================
  17. 11 void DisableEEPROM(void)
  18. 12 {
  19. 13 1 IAP_CONTR = 0; //禁止IAP操作
  20. 14 1 IAP_CMD = 0; //去除IAP命令
  21. 15 1 IAP_TRIG = 0; //防止IAP命令误触发
  22. 16 1 IAP_ADDRH = 0xff; //清0地址高字节
  23. 17 1 IAP_ADDRL = 0xff; //清0地址低字节,指向非EEPROM区,防止误操作
  24. 18 1 }
  25. 19
  26. 20 //========================================================================
  27. 21 // 函数: void EEPROM_Trig(void)
  28. 22 // 描述: 触发EEPROM操作.
  29. 23 // 参数: none.
  30. 24 // 返回: none.
  31. 25 // 版本: V1.0, 2014-6-30
  32. 26 //========================================================================
  33. 27 void EEPROM_Trig(void)
  34. 28 {
  35. 29 1 F0 = EA; //保存全局中断
  36. 30 1 EA = 0; //禁止中断, 避免触发命令无效
  37. 31 1 IAP_TRIG = 0x5A;
  38. 32 1 IAP_TRIG = 0xA5; //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
  39. 33 1 //送完A5H后,IAP命令立即被触发启动
  40. 34 1 //CPU等待IAP完成后,才会继续执行程序。
  41. 35 1 _nop_();
  42. 36 1 _nop_();
  43. 37 1 EA = F0; //恢复全局中断
  44. 38 1 }
  45. 39
  46. 40 //========================================================================
  47. 41 // 函数: void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
  48. 42 // 描述: 从指定EEPROM首地址读出n个字节放指定的缓冲.
  49. 43 // 参数: EE_address: 读出EEPROM的首地址.
  50. 44 // DataAddress: 读出数据放缓冲的首地址.
  51. 45 // number: 读出的字节长度.
  52. 46 // 返回: non.
  53. 47 // 版本: V1.0, 2012-10-22
  54. 48 //========================================================================
  55. 49 void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
  56. 50 {
  57. 51 1 IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
  58. 52 1 IAP_READ(); //送字节读命令,命令不需改变时,不需重新送命令
  59. 53 1 do
  60. 54 1 {
  61. C51 COMPILER V9.54 EEPROM 09/26/2022 20:11:46 PAGE 2
  62. 55 2 IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
  63. 56 2 IAP_ADDRL = EE_address % 256; //送地址低字节
  64. 57 2 EEPROM_Trig(); //触发EEPROM操作
  65. 58 2 *DataAddress = IAP_DATA; //读出的数据送往
  66. 59 2 EE_address++;
  67. 60 2 DataAddress++;
  68. 61 2 }while(--number);
  69. 62 1
  70. 63 1 DisableEEPROM();
  71. 64 1 }
  72. 65
  73. 66 //========================================================================
  74. 67 // 函数: void EEPROM_SectorErase(u16 EE_address)
  75. 68 // 描述: 把指定地址的EEPROM扇区擦除.
  76. 69 // 参数: EE_address: 要擦除的扇区EEPROM的地址.
  77. 70 // 返回: non.
  78. 71 // 版本: V1.0, 2013-5-10
  79. 72 //========================================================================
  80. 73 void EEPROM_SectorErase(u16 EE_address)
  81. 74 {
  82. 75 1 IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
  83. 76 1 IAP_ERASE(); //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
  84. 77 1 //只有扇区擦除,没有字节擦除,512字节/扇区。
  85. 78 1 //扇区中任意一个字节地址都是扇区地址。
  86. 79 1 IAP_ADDRH = EE_address / 256; //送扇区地址高字节(地址需要改变时才需重新送地址)
  87. 80 1 IAP_ADDRL = EE_address % 256; //送扇区地址低字节
  88. 81 1 EEPROM_Trig(); //触发EEPROM操作
  89. 82 1 DisableEEPROM(); //禁止EEPROM操作
  90. 83 1 }
  91. 84
  92. 85 //========================================================================
  93. 86 // 函数: void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
  94. 87 // 描述: 把缓冲的n个字节写入指定首地址的EEPROM.
  95. 88 // 参数: EE_address: 写入EEPROM的首地址.
  96. 89 // DataAddress: 写入源数据的缓冲的首地址.
  97. 90 // number: 写入的字节长度.
  98. 91 // 返回: non.
  99. 92 // 版本: V1.0, 2012-10-22
  100. 93 //========================================================================
  101. 94 void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
  102. 95 {
  103. 96 1 IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
  104. 97 1 IAP_WRITE(); //宏调用, 送字节写命令
  105. 98 1 do
  106. 99 1 {
  107. 100 2 IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
  108. 101 2 IAP_ADDRL = EE_address % 256; //送地址低字节
  109. 102 2 IAP_DATA = *DataAddress; //送数据到IAP_DATA,只有数据改变时才需重新送
  110. 103 2 EEPROM_Trig(); //触发EEPROM操作
  111. 104 2 EE_address++; //下一个地址
  112. 105 2 DataAddress++; //下一个数据
  113. 106 2 }while(--number); //直到结束
  114. 107 1 DisableEEPROM();
  115. 108 1 }
  116. 109
  117. MODULE INFORMATION: STATIC OVERLAYABLE
  118. CODE SIZE = 166 ----
  119. CONSTANT SIZE = ---- ----
  120. XDATA SIZE = ---- 14
  121. PDATA SIZE = ---- ----
  122. C51 COMPILER V9.54 EEPROM 09/26/2022 20:11:46 PAGE 3
  123. DATA SIZE = ---- ----
  124. IDATA SIZE = ---- ----
  125. BIT SIZE = ---- ----
  126. END OF MODULE INFORMATION.
  127. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)