📄 at24c02.c
字号:
//EEPROM WRITE:C0 1E 0B 06 00 00 02 00 FF FF FF FF FF FF FF FF
#include "LF2407register.h"
unsigned char EEPROM[16]={0xC0,0x79,0xBE,0x00,0x51,0x01,0x00,0x00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF} ;
unsigned char VERIFY[16] ;
void delay(unsigned j)
{
while(j--) ;
}
//系统初始化程序
void initial(void)
{
asm(" setc SXM") ;
asm(" clrc OVM") ;
asm(" clrc CNF") ;
asm(" setc INTM") ;
*SCSR1=0x8201 ;
*WDCR=0xE8 ;
*EVAIMRA=0 ;
*IMR=0x0000 ;
*IFR=0x0FFFF ;
WSGR=0x00 ;
*MCRC=0x0000 ;//BASIC IO FUNCTION(IOPF0==SDA, IOPF1==SCL)
*MCRA=0x0000 ;//FOR THE PURPOSE OF ERROR DISPLAY
*PFDATDIR=0xFF00 ;
}
void start(void)
{
*PFDATDIR|=0xFF01 ;//初始化状态,SDA=1,SCL=1
*PFDATDIR|=0xFF03 ;
delay(10) ;
*PFDATDIR&=0xFF02 ;//SDA从1跳变为0,形成起始状态
delay(10) ;
*PFDATDIR&=0xFF00 ;//将SCL置低,开始写数据到SDA
delay(10) ;
}
void stop(void)
{
*PFDATDIR=0xFF02 ;//SDA=0
delay(5) ;
*PFDATDIR=0xFF03 ;//SDA从0跳变为1,形成stop
delay(5) ;
*PFDATDIR=0xFF01 ;//SCL=0, SET THE SCL=0 AS A USUAL STAT.
delay(5) ;
}
//design as the page write way which can clock 8-byte into the eeprom at a time.
void write(unsigned char dat)
{ unsigned char j,shift=0x80;
for(j=0;j<8;j++)
{
if(dat&shift)
*PFDATDIR|=0xff01 ;//入口处认为SCL为低
else
*PFDATDIR&=0xFF00 ;//以上将DAT的最高位放到了IOPF.0上,即SDA上
delay(100) ;
*PFDATDIR|=0xFF02 ;//将SCL拉高,并且保持SDA上的数据
delay(100) ;
*PFDATDIR&=0xFF01 ;//SET SCL TO LOW WHICH IS A USUAL STAT
delay(100) ;
shift>>=1 ;
}
// 以下为ACK_CHECK (be aware that the SCL is low as a usual stat)
*PFDATDIR&=0xFE01 ;//SETB SDA
delay(100) ;
*PFDATDIR|=0xFE03 ;//SETB SCL
while(*PFDATDIR&0x0001)
delay(10) ;
{
*PFDATDIR&=0xFE01 ;//CLR SCL;
delay(100) ;
*PFDATDIR=0xFF01 ;//CLR SCL;
delay(1000) ;
}
}
//sequential read, the add means the start read address ,
//and pc means how many byte will be read by mocrocontroller
void read(unsigned char add)
{
unsigned char temp=0x00 ;
unsigned char i,j ;
start() ;//start
write(0xA0) ;//select the device,and the R/W is 0 means to WRITE
write(add) ;//WRITE THE ADD TO THE AT24C02,SO THAT IT CAN KEEP THE ADD
delay(2000) ;
start() ;
write(0xA1) ;//1 MEANS TO READ BYTE FROM THE ADD 0X00 WHICH IS WROTE TO EEPROM
delay(2000) ;
for(i=0;i<16;i++)
{
for(j=0;j<8;j++)
{
*PFDATDIR&=0XFE01 ;//set the SDA as the mode of input
*PFDATDIR|=0XFE02 ;//SETB SCL ;BE NOTICED THAT THE DATA IS RIGHT WHEN SCL=1
delay(100) ;
if(*PFDATDIR&0x0001)
{
temp<<=1 ;
temp+=1 ;
}
else
temp<<=1 ;
*PFDATDIR&=0XFE01 ;//SCL=0; this word can be ommitted because of scl=0 is the usual stat
}
//以下为产生ACK
*PFDATDIR|=0XFF00 ;//SDA=0,SCL=0
delay(100) ;
*PFDATDIR&=0XFF00 ;
*PFDATDIR|=0XFF02 ;//SDA=0,SCL=1
delay(100) ;
*PFDATDIR&=0XFF00 ;//SCL=0,SDA=0
VERIFY[i]=temp ;
temp=0 ;
}
stop() ;
}
void main(void)
{
unsigned char j ;
unsigned check=0 ;
initial() ;
start() ;
write(0xA0) ;
write(0x00) ;
for(j=0;j<8;j++)
write(EEPROM[j]) ;
stop() ;
delay(10000) ;
start() ;
write(0xA0) ;
write(0x08) ;
for(j=8;j<16;j++)
write(EEPROM[j]) ;
stop() ;
delay(10000) ;
read(0x00) ;
for(j=0;j<16;j++)
check+=VERIFY[j] ;
while(check!=0x08E9)
{
*PADATDIR=0xFF00 ;
delay(300000) ;
*PADATDIR=0xFF03 ;
delay(300000) ;
}
*PADATDIR=0xFF00 ;
while(1) ;
}
void interrupt nothing()
{
return ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -