找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3300|回复: 2
打印 上一主题 下一主题
收起左侧

怎样把stc15w104单片机内部EEPROM的内容读出来?

[复制链接]
跳转到指定楼层
楼主
怎样把stc15w104单片机EEPROM的内容读出来?


或者显示到液晶1602上?




void IAP_Disable()
{
//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
IAP_CONTR = 0; //关闭IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用
IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}


//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
unsigned char Byte_Read(unsigned int add)
{
IAP_DATA = 0x00;
IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x01; //IAP/ISP/Eeprom 字节读命令


my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址


//EA = 0;
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动
_nop_();
//EA = 1;
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
return (IAP_DATA);
}


//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
void Byte_Program(unsigned int add, unsigned char ch)
{
IAP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x02; //IAP/ISP/Eeprom 字节编程命令


my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址


IAP_DATA = ch; //要编程的数据先送进IAP_DATA 寄存器
//EA = 0;
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动
_nop_();
//EA = 1;
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}


//擦除扇区, 入口:DPTR = 扇区地址
void Sector_Erase(unsigned int add)
{
IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x03; //IAP/ISP/Eeprom 扇区擦除命令


my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址


//EA = 0;
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动
_nop_();
//EA = 1;
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}




//读取Eeprom中的运行参数数据,以便程序调用
void EepromRead(unsigned int Eeprom_Address, unsigned char MaxPara, unsigned int *P)
{
unsigned char i;


for( i=0; i<MaxPara; i++ )
{
*P =(unsigned int)(Byte_Read(Eeprom_Address+i*2))*0xFF+Byte_Read(Eeprom_Address+1+i*2); //读Eeprom的值,存到read_Eeprom
P++;
}
}


//存储系统参数,以便将来应用
void EepromSave(unsigned int Eeprom_Address, unsigned char MaxPara, unsigned int *P)
{
unsigned char i;

Sector_Erase(Eeprom_Address);


for( i=0; i<MaxPara; i++ )
{
Byte_Program(Eeprom_Address+i*2,(unsigned char)( *P /0xFF));
Byte_Program(Eeprom_Address+i*2+1,(unsigned char)( *P %0xFF));
P++;
}
}


//Eeprom出厂设置
void EepromFactory(void)
{
MemorySys[DTime0] = 200; //系统参数200;,240
MemorySys[DTime1] = 100;
MemorySys[DTime2] = 200;
MemorySys[DTime3] = 200;
MemorySys[DTime4] = 100;
MemorySys[DTime5] = 300; //编码器方向


EepromSave(0x0000, SysTotal, MemorySys);//保存系统参数
DelayMS(100);
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-6-12 06:11 | 只看该作者
参照STC官方读写EEPROM的示例程序修改即可,不过stc15w104只有6个IO口,驱动LCD1602有点问题。采用4线驱动只写不读也得用4+2个IO口。这样就没有端口可用于其它外围设备了。就算用扩展电路也只能省下1~2个IO口。



回复

使用道具 举报

板凳
ID:285863 发表于 2020-6-12 07:27 | 只看该作者
stc官网有例程
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表