这个是官方的库函数直接调用,
- /*---------------------------------------------------------------------*/
- /* --- STC MCU Limited ------------------------------------------------*/
- /* --- STC 1T Series MCU Demo Programme -------------------------------*/
- /* --- Mobile: (86)13922805190 ----------------------------------------*/
- /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
- /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
- /* --- Web: www.STCMCU.com --------------------------------------------*/
- /* --- Web: www.STCMCUDATA.com ---------------------------------------*/
- /* --- QQ: 800003751 -------------------------------------------------*/
- /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
- /*---------------------------------------------------------------------*/
-
- #include "STC8G_H_EEPROM.h"
-
- //========================================================================
- // 函数: void ISP_Disable(void)
- // 描述: 禁止访问ISP/IAP.
- // 参数: non.
- // 返回: non.
- // 版本: V1.0, 2012-10-22
- //========================================================================
- void DisableEEPROM(void)
- {
- IAP_CONTR = 0; //禁止IAP操作
- IAP_CMD = 0; //去除IAP命令
- IAP_TRIG = 0; //防止IAP命令误触发
- IAP_ADDRH = 0xff; //清0地址高字节
- IAP_ADDRL = 0xff; //清0地址低字节,指向非EEPROM区,防止误操作
- }
-
- //========================================================================
- // 函数: void EEPROM_Trig(void)
- // 描述: 触发EEPROM操作.
- // 参数: none.
- // 返回: none.
- // 版本: V1.0, 2014-6-30
- //========================================================================
- void EEPROM_Trig(void)
- {
- F0 = EA; //保存全局中断
- EA = 0; //禁止中断, 避免触发命令无效
- IAP_TRIG = 0x5A;
- IAP_TRIG = 0xA5; //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
- //送完A5H后,IAP命令立即被触发启动
- //CPU等待IAP完成后,才会继续执行程序。
- _nop_();
- _nop_();
- EA = F0; //恢复全局中断
- }
-
- //========================================================================
- // 函数: void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
- // 描述: 从指定EEPROM首地址读出n个字节放指定的缓冲.
- // 参数: EE_address: 读出EEPROM的首地址.
- // DataAddress: 读出数据放缓冲的首地址.
- // number: 读出的字节长度.
- // 返回: non.
- // 版本: V1.0, 2012-10-22
- //========================================================================
- void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
- {
- IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
- IAP_READ(); //送字节读命令,命令不需改变时,不需重新送命令
- do
- {
- IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
- IAP_ADDRL = EE_address % 256; //送地址低字节
- EEPROM_Trig(); //触发EEPROM操作
- *DataAddress = IAP_DATA; //读出的数据送往
- EE_address++;
- DataAddress++;
- }while(--number);
-
- DisableEEPROM();
- }
-
- //========================================================================
- // 函数: void EEPROM_SectorErase(u16 EE_address)
- // 描述: 把指定地址的EEPROM扇区擦除.
- // 参数: EE_address: 要擦除的扇区EEPROM的地址.
- // 返回: non.
- // 版本: V1.0, 2013-5-10
- //========================================================================
- void EEPROM_SectorErase(u16 EE_address)
- {
- IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
- IAP_ERASE(); //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
- //只有扇区擦除,没有字节擦除,512字节/扇区。
- //扇区中任意一个字节地址都是扇区地址。
- IAP_ADDRH = EE_address / 256; //送扇区地址高字节(地址需要改变时才需重新送地址)
- IAP_ADDRL = EE_address % 256; //送扇区地址低字节
- EEPROM_Trig(); //触发EEPROM操作
- DisableEEPROM(); //禁止EEPROM操作
- }
-
- //========================================================================
- // 函数: void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
- // 描述: 把缓冲的n个字节写入指定首地址的EEPROM.
- // 参数: EE_address: 写入EEPROM的首地址.
- // DataAddress: 写入源数据的缓冲的首地址.
- // number: 写入的字节长度.
- // 返回: non.
- // 版本: V1.0, 2012-10-22
- //========================================================================
- void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
- {
-
- EEPROM_SectorErase(EE_address);
-
- IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
- IAP_WRITE(); //宏调用, 送字节写命令
- do
- {
- IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
- IAP_ADDRL = EE_address % 256; //送地址低字节
- IAP_DATA = *DataAddress; //送数据到IAP_DATA,只有数据改变时才需重新送
- EEPROM_Trig(); //触发EEPROM操作
- EE_address++; //下一个地址
- DataAddress++; //下一个数据
- }while(--number); //直到结束
- DisableEEPROM();
- }[code]/*---------------------------------------------------------------------*/
- /* --- STC MCU Limited ------------------------------------------------*/
- /* --- STC 1T Series MCU Demo Programme -------------------------------*/
- /* --- Mobile: (86)13922805190 ----------------------------------------*/
- /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
- /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
- /* --- Web: www.STCMCU.com --------------------------------------------*/
- /* --- Web: www.STCMCUDATA.com ---------------------------------------*/
- /* --- QQ: 800003751 -------------------------------------------------*/
- /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
- /*---------------------------------------------------------------------*/
-
- #ifndef __EEPROM_H
- #define __EEPROM_H
-
- #include "config.h"
-
- //========================================================================
- // 定义声明
- //========================================================================
-
- #define STC8X1K08 8
- #define STC8X1K16 16
- #define STC8XxK32 32
- #define STC8XxK60 60
-
- // 选择MCU型号
- #define MCU_Type STC8X1K08 //STC8X1K08, STC8X1K16, STC8XxK32, STC8XxK32, STC8XxK60
-
- /************************** ISP/IAP *****************************
-
- 型号 大小 扇区数 开始地址 结束地址 MOVC读偏移地址
- STC8X1K08 4K 8扇区 0x0000 ~ 0x0FFF 0x2000
- STC8X1K16 12K 24扇区 0x0000 ~ 0x2FFF 0x4000
- STC8XxK32 32K 64扇区 0x0000 ~ 0x7FFF 0x8000
- STC8XxK60 4K 8扇区 0x0000 ~ 0x0FFF 0xF000
-
- */
-
- #if (MCU_Type == STC8X1K08)
- #define MOVC_ShiftAddress 0x2000
- #elif (MCU_Type == STC8X1K16)
- #define MOVC_ShiftAddress 0x4000
- #elif (MCU_Type == STC8XxK32)
- #define MOVC_ShiftAddress 0x8000
- #elif (MCU_Type == STC8XxK60)
- #define MOVC_ShiftAddress 0xF000
- #else
- #define MOVC_ShiftAddress 0xC000 //用户自定义
- #endif
-
-
- void DisableEEPROM(void);
- void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number);
- void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number);
- void EEPROM_SectorErase(u16 EE_address);
-
-
- #endif
复制代码
[/code] |