EEPROM.c.bak 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
  7. /* --- Web: www.STCMCU.com --------------------------------------------*/
  8. /* --- Web: www.STCMCUDATA.com ---------------------------------------*/
  9. /* --- QQ: 800003751 -------------------------------------------------*/
  10. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
  11. /*---------------------------------------------------------------------*/
  12. /*************** 功能说明 ****************
  13. 本文件为STC8系列的内置EEPROM读写程序,用户几乎可以不修改这个程序.
  14. ******************************************/
  15. #include "config.h"
  16. #include "eeprom.h"
  17. //========================================================================
  18. // 函数: void ISP_Disable(void)
  19. // 描述: 禁止访问ISP/IAP.
  20. // 参数: non.
  21. // 返回: non.
  22. // 版本: V1.0, 2012-10-22
  23. //========================================================================
  24. void DisableEEPROM(void)
  25. {
  26. IAP_CONTR = 0; //禁止IAP操作
  27. IAP_CMD = 0; //去除IAP命令
  28. IAP_TRIG = 0; //防止IAP命令误触发
  29. IAP_ADDRH = 0xff; //清0地址高字节
  30. IAP_ADDRL = 0xff; //清0地址低字节,指向非EEPROM区,防止误操作
  31. }
  32. //========================================================================
  33. // 函数: void EEPROM_Trig(void)
  34. // 描述: 触发EEPROM操作.
  35. // 参数: none.
  36. // 返回: none.
  37. // 版本: V1.0, 2014-6-30
  38. //========================================================================
  39. void EEPROM_Trig(void)
  40. {
  41. F0 = EA; //保存全局中断
  42. EA = 0; //禁止中断, 避免触发命令无效
  43. IAP_TRIG = 0x5A;
  44. IAP_TRIG = 0xA5; //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
  45. //送完A5H后,IAP命令立即被触发启动
  46. //CPU等待IAP完成后,才会继续执行程序。
  47. _nop_();
  48. _nop_();
  49. EA = F0; //恢复全局中断
  50. }
  51. //========================================================================
  52. // 函数: void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
  53. // 描述: 从指定EEPROM首地址读出n个字节放指定的缓冲.
  54. // 参数: EE_address: 读出EEPROM的首地址.
  55. // DataAddress: 读出数据放缓冲的首地址.
  56. // number: 读出的字节长度.
  57. // 返回: non.
  58. // 版本: V1.0, 2012-10-22
  59. //========================================================================
  60. void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
  61. {
  62. IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
  63. IAP_READ(); //送字节读命令,命令不需改变时,不需重新送命令
  64. do
  65. {
  66. IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
  67. IAP_ADDRL = EE_address % 256; //送地址低字节
  68. EEPROM_Trig(); //触发EEPROM操作
  69. *DataAddress = IAP_DATA; //读出的数据送往
  70. EE_address++;
  71. DataAddress++;
  72. }while(--number);
  73. DisableEEPROM();
  74. }
  75. //========================================================================
  76. // 函数: void EEPROM_SectorErase(u16 EE_address)
  77. // 描述: 把指定地址的EEPROM扇区擦除.
  78. // 参数: EE_address: 要擦除的扇区EEPROM的地址.
  79. // 返回: non.
  80. // 版本: V1.0, 2013-5-10
  81. //========================================================================
  82. void EEPROM_SectorErase(u16 EE_address)
  83. {
  84. IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
  85. IAP_ERASE(); //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
  86. //只有扇区擦除,没有字节擦除,512字节/扇区。
  87. //扇区中任意一个字节地址都是扇区地址。
  88. IAP_ADDRH = EE_address / 256; //送扇区地址高字节(地址需要改变时才需重新送地址)
  89. IAP_ADDRL = EE_address % 256; //送扇区地址低字节
  90. EEPROM_Trig(); //触发EEPROM操作
  91. DisableEEPROM(); //禁止EEPROM操作
  92. }
  93. //========================================================================
  94. // 函数: void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
  95. // 描述: 把缓冲的n个字节写入指定首地址的EEPROM.
  96. // 参数: EE_address: 写入EEPROM的首地址.
  97. // DataAddress: 写入源数据的缓冲的首地址.
  98. // number: 写入的字节长度.
  99. // 返回: non.
  100. // 版本: V1.0, 2012-10-22
  101. //========================================================================
  102. void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
  103. {
  104. IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
  105. IAP_WRITE(); //宏调用, 送字节写命令
  106. do
  107. {
  108. IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
  109. IAP_ADDRL = EE_address % 256; //送地址低字节
  110. IAP_DATA = *DataAddress; //送数据到IAP_DATA,只有数据改变时才需重新送
  111. EEPROM_Trig(); //触发EEPROM操作
  112. EE_address++; //下一个地址
  113. DataAddress++; //下一个数据
  114. }while(--number); //直到结束
  115. DisableEEPROM();
  116. }