📄 at24c64(pass).c
字号:
#include<reg52.h>
#include<intrins.h>
//#define WDI P3_4
#define AT24c64_address 0xa0 //A2,A1,A0,接GND。EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
//表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); _nop_();_nop_();_nop_();_nop_();
//#define NUM 10
//uchar idata sendbuf[NUM];
//uchar idata receivebuf[NUM];
bit bdata SystemError;
sbit SDA=P0^0;
sbit SCL=P0^1;
//uchar dat[10];
///
void iic_start();//启动IIC总线
void iic_stop();//停止IIC总线
void slave_ACK();//从机发送应答
void slave_NOACK(void);//从机发送非应答
void check_ACK(void);//主机应答位检查
void IICSendByte(uchar ch);//发送1BYTE
uchar IICReciveByte(void);//接收1BYTE
void AT24c64_write_byte(uint address,uchar dat);// 24c64存储1BYTE
uchar AT24c64_read_byte(uint address);//读指定的地址的1BYTE数据
void AT24c64_read_bytes(uint address,uchar *pdat,uchar length);//读指定地址后的连续的数据
void AT24c64_write_bytes(uint address,uchar *pdat,uchar length);//写一页数据到24c64中
void delay_tt_ms(uchar tt);//延时TTMS
///////////////////////////////
void iic_start(void)//启动IIC总线
{
EA=0;
SDA=1;
SCL=1;
delayNOP();//延时5us
SDA=0;
delayNOP();
SCL=0;
}
/////////////////////////////////
void iic_stop(void)//停止IIC总线
{
SDA=0;
SCL=1;
delayNOP();
SDA=1;
delayNOP();
SCL=0;
}
////////////////////////////////
void slave_ACK(void)//从机发送应答
{
SDA=0;
SCL=1;
delayNOP();
SCL=0;
SDA=1;
}
/////////////////////////////////
void slave_NOACK(void)//从机发送非应答
{
SDA=1;
SCL=1;
delayNOP();
SDA=0;
SCL=0;
}
/////////////////////////////////
void check_ACK(void)//主机应答位检查
{
SDA=1;
SCL=1;
F0=0;//非应答标志F0
if(SDA==1)
F0=1;//表明非应答
SCL=0;
}
//////////////////////////////////
void IICSendByte(uchar ch)//发送1BYTE
{
uchar idata n=8;//1字节共8位
while(n--)
{
if((ch&0x80)==0x80)//发送高位
{
SDA=1;//传输1
SCL=1;
delayNOP();
SCL=0;
}
else
{
SDA=0;//传输0
SCL=1;
delayNOP();
SCL=0;
}
ch<<=1;//数据左移
}
}
//////////////////////////////////
uchar IICReceiveByte(void)//接收1BYTE
{
uchar idata n=8;
uchar tdata;
while(n--)
{
SDA=1;
SCL=1;
tdata<<=1;//左移一位
if(SDA==1)
tdata=tdata|0x01;//收到1,数据最后一位为1
else
tdata=tdata&0xfe;
SCL=0;
}
return(tdata);
}
////////////////////////////////////
void AT24c64_write_byte(uint address,uchar dat)// 24c64存储1BYTE
{
uchar value;
iic_start();
value=AT24c64_address&0xfe; //发送器件地址
IICSendByte(value);
check_ACK();//检测应答
if(F0==1)
{
SystemError=1;
return;
}
value=address/0x100;//发送地址高字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
value=address%0x100;//发送地址低字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
value=dat;
IICSendByte(value);//发送数据
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
iic_stop();
}
///////////////////////////////////
uchar AT24c64_read_byte(uint address)//读指定的地址的1BYTE数据
{
uchar value;
iic_start();
value=AT24c64_address&0xfe; //发送器件地址
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return 0;
}
value=address/0x100;//发送地址高字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return 0;
}
value=address%0x100;//发送地址低字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return 0;
}
iic_stop();
iic_start();
value=AT24c64_address|0x01; //发送器件地址
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return 0;
}
value=IICReceiveByte();
slave_NOACK(); //主不应答信号;主机发送非应答,迫使数据传输结束
iic_stop();
return(value);
}
//////////////////////////////////
void AT24c64_write_bytes(uint address,uchar *pdat,uchar length)//写一页数据到24c64中
{
uchar value,i;
iic_start();
value=AT24c64_address&0xfe; //发送器件地址
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
value=address/0x100;//发送地址高字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
value=address%0x100;//发送地址低字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
for(i=0;i<length;i++ )
{
value=*pdat;
IICSendByte(value);//发送数据
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
pdat++;
}
iic_stop();
}
//////////////////////////////////////
void AT24c64_read_bytes(uint address,uchar *pdat,uchar length)//读指定地址后的连续的数据
{
uchar value,i;
iic_start();
value=AT24c64_address&0xfe; //发送器件地址
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
value=address/0x100;//发送地址高字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
value=address%0x100;//发送地址低字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
iic_stop();
iic_start();
value=AT24c64_address|0x01; //发送器件地址
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
i=length-1;
while(i--)
{
*pdat=IICReceiveByte();
slave_ACK();//主应答信号
pdat++;
}
*pdat=IICReceiveByte();
slave_NOACK();//主不应答信号
iic_stop();
}
//////////////////////////////////
/*void delay_tt_ms(uchar tt)//延时TTMS
{
uchar i;
while(tt--)
for(i=0;i<125;i++);
}
//////////////////////////////////
void main(void)
{
uchar d=0xff,i;
/*AT24c64_write_byte(0x0020,0x08);//测试写入1BYTE
delay_tt_ms(5);//写入有个时间的最短3MS,
d=AT24c64_read_byte(0x0020);//读测试
P1=d;
uchar pdat[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
AT24c64_write_bytes(0x0010,pdat,10);//测试页写入
delay_tt_ms(5);
AT24c64_read_bytes(0x0010,dat,10);//读指定地址后的连续的数据
while(1)
{
for(i=0;i<=10;i++)
{
P2=dat[i];
delay_tt_ms(200);
delay_tt_ms(200);
delay_tt_ms(200);
delay_tt_ms(200);
}
}
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -