AI8H的EEPROM如何使用
本帖最后由 DebugLab 于 2024-11-11 10:47 编辑AI8H的EEPROM如何使用,请高手指教
#include "reg51.h"
#include "intrins.h"
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
sfr IAP_DATA = 0xC2;
sfr IAP_ADDRH = 0xC3;
sfr IAP_ADDRL = 0xC4;
sfr IAP_CMD = 0xC5;
sfr IAP_TRIG = 0xC6;
sfr IAP_CONTR = 0xC7;
sfr IAP_TPS = 0xF5;
void IapIdle()
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
char IapRead(int addr)
{
char dat;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 1; //设置IAP读命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
dat = IAP_DATA; //读IAP数据
IapIdle(); //关闭IAP功能
return dat;
}
void IapProgram(int addr, char dat)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 2; //设置IAP写命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写IAP数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
IapIdle(); //关闭IAP功能
}
void IapErase(int addr)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 3; //设置IAP擦除命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //
IapIdle(); //关闭IAP功能
}
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
IapErase(0x0400);
P0 = IapRead(0x0400); //P0=0xff
IapProgram(0x0400, 0x12);
P1 = IapRead(0x0400); //P1=0x12
while (1);
}
本帖最后由 dongfang 于 2024-11-11 13:05 编辑
DebugLab 发表于 2024-11-11 10:51
我看到这个程序了,但存不了,麻烦你看看什么原因,我用的是STC8H1K28, IPA设置是4k
void main()
{
STC_Init(); //初始化STC8H
lcdinit(); //初始化LCD
ADC_Init(); //初始化ADC
Timer0_Init(); //初始化时钟0
PWM_config(); //初始PWMA
iap_h = IapRead(0x6000);
iap_l = IapRead(0x6001);
ADD=(u16)iap_h * 256 + (u16)iap_l;
IE0= 0; //外中断0标志位
EX0 = 1; //INT0 使能
IT0 = 1; //INT0 下降沿中断
EA=1;
/******************************************/
photodisplay(Photo1); //显示图片1
delay_ms(250);
zdkz ();
/*************************************/
while(1)
{
AD=Get_ADC10bitResult(0);
ADF=AD*4.88;
delay_ms(1);
AD=ADF;
wu= AD/1000;
liu = AD%1000/100;
qi= AD%100/10;
ba= AD%10;
write(0,0x90);
write(1,DIS5);
write(1,DIS5);
write(1,DIS5);
write(1,DIS5);
write(1,DIS5);
// ADD=Get_ADC10bitResult(1);
yi= ADD/1000;
er= ADD%1000/100;
san = ADD%100/10;
si= ADD%10;
write(0,0x88);
write(1,DIS5);
write(1,DIS5);
write(1,DIS5);
write(1,DIS5);
write(1,DIS5);
write(0,0x98);
write(1,0x10);
if(ADD!=ADD_1)
{
ADD_1=ADD;
IapErase(0x6000);
iap_h = (u8)(ADD_1>>8);
iap_l = (u8)(ADD_1);
IapProgram(0x6000,iap_h);
IapProgram(0x6001, iap_l);
}
}
}
我用编码器改变ADD的值,改变ADD的值,重新上电ADD还是零,没有保存下来,你看看保存读取有错误吗
这是EEPROM一个扇区的终极用法,一共50行代码简洁高效
QQ624353765 发表于 2024-11-11 13:16
这是EEPROM一个扇区的终极用法,一共50行代码简洁高效
不用擦除吗?
可以单独按字节循环写吗 vb2002 发表于 2024-11-12 13:27
不用擦除吗?
可以单独按字节循环写吗
擦了才能写,慢慢参悟,里面藏着很多编程的先进思想 QQ624353765 发表于 2024-11-12 14:15
擦了才能写,慢慢参悟,里面藏着很多编程的先进思想
不错 学习了 rpbdibvj 发表于 2024-11-13 18:15
不错 学习了
学会了吗?
我是半天没研究明白.
学习了 我的eeprom存储成功了,不是程序问题是存储地址的问题,使用IAP访问存储,地址都是从相对地址0000开始的,结束地址就看自定义EEPORM的大小了。
页:
[1]