📄 eeprom.c
字号:
///////////////////
#include <R_io.h>
////////////
bit eep_b ; ////内部外部EEPROM选择
//////////////////at24256///////////////
void delays (void) ///写入程序的延时程序
{
unsigned int loop;
for(loop=0;loop<1000;loop++)
{
_nop_( );
_nop_( );
}
}
//////////////
void start_2402 (void) ///开始
{
IO_iicsda=1;
_nop_();
_nop_();
IO_iicsclk=0;
_nop_();
_nop_();
IO_iicsclk=1;
_nop_();
_nop_();
IO_iicsda=0;
_nop_();
_nop_();
IO_iicsclk=0;
}
//////////////////
void stop_2402 (void) ///停止
{
IO_iicsda=0;
_nop_();
_nop_();
IO_iicsclk=1;
_nop_();
_nop_();
IO_iicsda=1;
}
////
void outbyt(unsigned char da) ///向eeprom写入一个字节
{
unsigned char loop;
for (loop=0;loop<8;loop++)
{
da=da<<1;
IO_iicsda=CY;
_nop_();
_nop_();
IO_iicsclk=1;
_nop_();
_nop_();
IO_iicsclk=0;
}
}
unsigned char inbyte (void) ///读出一个字节
{
unsigned char loop,da=0;
for (loop=0;loop<8;loop++)
{
da=da<<1;
IO_iicsda=1;
_nop_();
_nop_();
da=da|IO_iicsda;
IO_iicsclk=1 ;
_nop_();
_nop_();
IO_iicsclk=0;
}
return(da);
}
///
void ack (void) ///
{
IO_iicsda=0;
_nop_();
_nop_();
IO_iicsclk=1;
_nop_();
_nop_();
IO_iicsclk=0;
}
void noack(void) ///
{
IO_iicsda=1;
_nop_();
_nop_();
IO_iicsclk=1;
_nop_();
_nop_();
IO_iicsclk=0;
}
/////////* 打开 ISP,IAP 功能 */
void EraseEeprom(unsigned char t_addr)
{
ISP_ADDRH = t_addr*2+0x80;
ISP_ADDRL = 0;
EA = 0; /* 关中断 */
ISP_CONTR = 0x81; /* 1000,0000 */
ISP_CMD = 3;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
_nop_();
ISP_CONTR = 0; /* 0111,1111 */
ISP_CMD = 0;
ISP_TRIG = 0;
ISP_ADDRH = 0;
ISP_ADDRL = 0;
EA = 1; /* 开中断 */
}
////将从temp[0]的缓冲区开始num个数据
////写入到从t_addr地址开始
////一次最多8个
void WriteEeprom(unsigned char t_addr,unsigned char num,unsigned char xdata *ptr)
{
unsigned char loop;
if (!eep_b)
{
IO_iicen = 0;
_nop_();
_nop_();
start_2402();
outbyt (0xa0);
ack();
outbyt(t_addr);
for (loop=0;loop<num;loop++)
{
ack();
outbyt(*(ptr+loop));
}
ack();
stop_2402();
delays( );
IO_iicen = 1;
}
else
{
EraseEeprom(t_addr);
for (loop=0; loop<num; loop++)
{
ISP_ADDRH = *(ptr+loop);
ISP_ADDRH = t_addr*2+0x80;
ISP_ADDRL = loop;
EA = 0; /* 关中断 */
ISP_CONTR = 0x81; /* 1000,0000 */
ISP_CMD = 2;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
_nop_();
ISP_CONTR = 0; /* 0111,1111 */
ISP_CMD = 0;
ISP_TRIG = 0;
ISP_ADDRH = 0;
ISP_ADDRL = 0;
EA = 1; /* 开中断 */
}
}
}
////从eeprom的t_addr地址开始读出num个数据
////存入以temp[0]开始的存储单元
////一次最多8个
void ReadEeprom(unsigned char s_addr,unsigned char num,unsigned char xdata *ptr)
{
unsigned char loop;
if (!eep_b)
{
start_2402();
outbyt (0xa0);
ack();
outbyt(s_addr);
ack();
start_2402();
outbyt (0xa1);
for (loop=0;loop<num;loop++)
{
ack();
*(ptr+loop)=inbyte();
}
noack();
stop_2402();
}
else
{
for (loop=0; loop<num; loop++)
{
ISP_ADDRH = s_addr*2+0x80;
ISP_ADDRL = loop;
EA = 0; /* 关中断 */
ISP_CONTR = 0x81; /* 1000,0000 */
ISP_CMD = 1;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
_nop_();
ISP_CONTR = 0; /* 0111,1111 */
ISP_CMD = 0;
ISP_TRIG = 0;
ISP_ADDRH = 0;
ISP_ADDRL = 0;
EA = 1; /* 开中断 */
*(ptr+loop) = ISP_DATA;
}
}
}
///////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -