打印
[STC单片机]

关于STC12C5A60S2的EEPROM应用(请赐教)

[复制链接]
1001|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bjjtyl|  楼主 | 2015-3-1 16:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
伏尔加的鱼| | 2015-3-1 17:08 | 只看该作者
STC有例子你看看吧  操作很简单的

使用特权

评论回复
板凳
xyz549040622| | 2015-3-1 18:04 | 只看该作者
你要应用做什么呢?单纯的读和写的话,官网是给出例子的。

使用特权

评论回复
地板
dirtwillfly| | 2015-3-2 07:51 | 只看该作者

使用特权

评论回复
5
鉲┊布奇诺| | 2015-3-2 11:24 | 只看该作者

使用特权

评论回复
6
dirtwillfly| | 2015-3-2 20:13 | 只看该作者
stc官网提供的手册里有c代码和汇编代码

使用特权

评论回复
7
示耳三水| | 2015-3-10 13:24 | 只看该作者

使用特权

评论回复
8
coody| | 2015-3-10 14:59 | 只看该作者
拷贝自STC官网下载的库函数中的“08-UART1-读写EEPROM”的EEPROM.c文件。

//========================================================================
// 函数: void        ISP_Disable(void)
// 描述: 禁止访问ISP/IAP.
// 参数: non.
// 返回: non.
// 版本: V1.0, 2012-10-22
//========================================================================
void        DisableEEPROM(void)
{
        ISP_CONTR = 0;                        //禁止ISP/IAP操作
        ISP_CMD   = 0;                        //去除ISP/IAP命令
        ISP_TRIG  = 0;                        //防止ISP/IAP命令误触发
        ISP_ADDRH = 0xff;                //清0地址高字节
        ISP_ADDRL = 0xff;                //清0地址低字节,指向非EEPROM区,防止误操作
}

//========================================================================
// 函数: 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)
{
        EA = 0;                //禁止中断
        ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);        //设置等待时间,允许ISP/IAP操作,送一次就够
        ISP_READ();                                                                        //送字节读命令,命令不需改变时,不需重新送命令
        do
        {
                ISP_ADDRH = EE_address / 256;                //送地址高字节(地址需要改变时才需重新送地址)
                ISP_ADDRL = EE_address % 256;                //送地址低字节
                ISP_TRIG();                                                        //先送5AH,再送A5H到ISP/IAP触发寄存器,每次都需要如此
                                                                                        //送完A5H后,ISP/IAP命令立即被触发启动
                                                                                        //CPU等待IAP完成后,才会继续执行程序。
                _nop_();
                *DataAddress = ISP_DATA;                        //读出的数据送往
                EE_address++;
                DataAddress++;
        }while(--number);

        DisableEEPROM();
        EA = 1;                //重新允许中断
}


/******************** 扇区擦除函数 *****************/
//========================================================================
// 函数: void EEPROM_SectorErase(u16 EE_address)
// 描述: 把指定地址的EEPROM扇区擦除.
// 参数: EE_address:  要擦除的扇区EEPROM的地址.
// 返回: non.
// 版本: V1.0, 2013-5-10
//========================================================================
void EEPROM_SectorErase(u16 EE_address)
{
        EA = 0;                //禁止中断
                                                                                        //只有扇区擦除,没有字节擦除,512字节/扇区。
                                                                                        //扇区中任意一个字节地址都是扇区地址。
        ISP_ADDRH = EE_address / 256;                        //送扇区地址高字节(地址需要改变时才需重新送地址)
        ISP_ADDRL = EE_address % 256;                        //送扇区地址低字节
        ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);        //设置等待时间,允许ISP/IAP操作,送一次就够
        ISP_ERASE();                                                        //送扇区擦除命令,命令不需改变时,不需重新送命令
        ISP_TRIG();
        _nop_();
        DisableEEPROM();
        EA = 1;                //重新允许中断
}

//========================================================================
// 函数: 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)
{
        EA = 0;                //禁止中断

        ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);        //设置等待时间,允许ISP/IAP操作,送一次就够
        ISP_WRITE();                                                        //送字节写命令,命令不需改变时,不需重新送命令
        do
        {
                ISP_ADDRH = EE_address / 256;                //送地址高字节(地址需要改变时才需重新送地址)
                ISP_ADDRL = EE_address % 256;                //送地址低字节
                ISP_DATA  = *DataAddress;                        //送数据到ISP_DATA,只有数据改变时才需重新送
                ISP_TRIG();
                _nop_();
                EE_address++;
                DataAddress++;
        }while(--number);

        DisableEEPROM();
        EA = 1;                //重新允许中断
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:电子恐龙

19

主题

50

帖子

0

粉丝