📄 eeprom.c
字号:
#include <config.h>
#define IN_EEPROM
#if EEPROM_USING
#define ISP_IAP_BYTE_READ 0x01;//字节读
#define ISP_IAP_BYTE_PROGRAM 0x02;//字节编程, 前提是该字节是空,0FFh
#define ISP_IAP_SECTOR_ERASE 0x03;//扇区擦除, 要某字节为空,要擦一扇区
#define WAIT_TIME 0x01;//设置等待时间,30MHz 以下0,24M 以下1,
#define ENABLE_ISP 0x81;// <24MHz
#define EEPROM_MAX_BUFFER 10
unsigned char xdata eeprom_buffer[EEPROM_MAX_BUFFER];
//-----------------------------------------------------------------------------
// ----eeprom的读,需要指定地址,每次固定读入一定
void eeprom_read(void)
{
//MOV ISP_ADDRH, #BYTE_ADDR_HIGH ;送地址高字节
//MOV ISP_ADDRL, #BYTE_ADDR_LOW ;送地址低字节
//MOV ISP_CONTR, #WAIT_TIME ;设置等待时间
//ORL ISP_CONTR, #10000000B ;允许ISP/IAP 操作
//MOV ISP_CMD, #ISP_IAP_BYTE_READ ;送字节读命令,命令不需改变时,不需重新送命令
//MOV ISP_TRIG, #46h ;先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
//MOV ISP_TRIG, #0B9h ;送完B9h 后,ISP/IAP 命令立即被触发起动
unsigned char idata i=0x00;
for(i=0x00;i<EEPROM_MAX_BUFFER;i++)
{ ISP_ADDRH = 0x28; //选择第二扇区
ISP_ADDRL = i;
ISP_CONTR = WAIT_TIME;
ISP_CONTR |= 0x80;
ISP_CMD = ISP_IAP_BYTE_READ;
EA = 0x00;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
EA = 0x01;
eeprom_buffer[i]=ISP_DATA;
}
// -----------关闭ISP/IAP功能---------------
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
ISP_ADDRH = 0x00;
ISP_ADDRL = 0x00;
}
void eeprom_write(void) //eeprom写入
{
//MOV ISP_DATA, #ONE_DATA ;送字节编程数据到ISP_DATA
//MOV ISP_ADDRH, #BYTE_ADDR_HIGH ;送地址高字节
//MOV ISP_ADDRL, #BYTE_ADDR_LOW ;送地址低字节
//MOV ISP_CONTR, #WAIT_TIME ;设置等待时间
//ORL ISP_CONTR, #10000000B ;允许ISP/IAP 操作
//MOV ISP_CMD, #ISP_IAP_BYTE_PROGRAM ;送字节编程命令
//MOV ISP_TRIG, #46h ;先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
//MOV ISP_TRIG, #0B9h ;送完B9h 后,ISP/IAP 命令立即被触发起动
unsigned char idata i=0x00;
for(i=0x00;i<EEPROM_MAX_BUFFER;i++)
{ ISP_DATA=eeprom_buffer[i];
ISP_ADDRH = 0x28; //选择第二扇区
ISP_ADDRL = i;
ISP_CONTR = WAIT_TIME;
ISP_CONTR |= 0x80;
ISP_CMD = ISP_IAP_BYTE_PROGRAM;
EA = 0x00;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
EA = 0x01;
}
// -----------关闭ISP/IAP功能---------------
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
ISP_ADDRH = 0x00;
ISP_ADDRL = 0x00;
}
void eeprom_earse(void)
{
//MOV ISP_ADDRH, #SECTOR_FIRST_BYTE_ADDR_HIGH ;送扇区起始地址高字节
//MOV ISP_ADDRL, #SECTOR_FIRST_BYTE_ADDR_LOW ;送扇区起始地址低字节
//MOV ISP_CONTR, #WAIT_TIME ;设置等待时间
//ORL ISP_CONTR, #10000000B ;允许ISP/IAP
//MOV ISP_CMD, #ISP_IAP_SECTOR_ERASE ;送扇区擦除命令,命令不需改变时,不需重新送命令
//MOV ISP_TRIG, #46h ;先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
//MOV ISP_TRIG, #0B9h ;送完B9h 后,ISP/IAP 命令立即被触发起动
unsigned char idata i=0x00;
ISP_ADDRH = 0x28;
ISP_ADDRL = 0x80; //指定该扇区的任何一个地址即可
ISP_CONTR = WAIT_TIME;
ISP_CONTR |= 0x80;
ISP_CMD = ISP_IAP_SECTOR_ERASE;
EA = 0x00;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
EA = 0x01;
// -----------关闭ISP/IAP功能---------------
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
ISP_ADDRH = 0x00;
ISP_ADDRL = 0x00;
}
// -----------------------------------------------------------------------------
// ----- EEPROM的数据处理 ----------------------------------------------------
unsigned char xdata eeprom_operatemode=0x01;
void eeprom_process(void)
{if(eeprom_operatemode==0x01) //读出
{eeprom_read();
if((eeprom_buffer[8]==0x55)&&(eeprom_buffer[9]==0xaa))
{exhaust_number=eeprom_buffer[3]*1000+eeprom_buffer[2]*100+eeprom_buffer[1]*10+eeprom_buffer[0];
authorize_number=eeprom_buffer[7]*1000+eeprom_buffer[6]*100+eeprom_buffer[5]*10+eeprom_buffer[4];
eeprom_operatemode=0x00;
}
else //否则初始化
{exhaust_number=0x00;
authorize_number=1000;
eeprom_operatemode=0x00;
}
}
else if(eeprom_operatemode==0x02) //写入
{eeprom_earse();
eeprom_buffer[0]=exhaust_number%10;
eeprom_buffer[1]=(exhaust_number%100)/10;
eeprom_buffer[2]=(exhaust_number%1000)/100;
eeprom_buffer[3]=exhaust_number/1000;
eeprom_buffer[4]=authorize_number%10;
eeprom_buffer[5]=(authorize_number%100)/10;
eeprom_buffer[6]=(authorize_number%1000)/100;
eeprom_buffer[7]=authorize_number/1000;
eeprom_buffer[8]=0x55;
eeprom_buffer[9]=0xaa;
eeprom_write();
eeprom_operatemode=0x00;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -