AT24C64 程序
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
voidiic_wait_ack()
{
uchartt=200;
SDA=1;
iic_delay();
SCL=1;
iic_delay();
while(SDA &&tt--){}
SCL=0;
}
/********************************************************************
voidack()
{
SDA=0;
iic_delay();
SCL=1;
iic_delay();
SCL=0;
}
/************************************************************************/
/*发送NOACK信号*/
/************************************************************************/
void iic_start()
{
SDA = 1;
SCL = 1;
iic_delay();
SDA = 0;
iic_delay();
SCL = 0;
}
/************************************************************************/
void iic_stop()
iic_wait_ack();
for(i=0;i<num;i++)
{
iic_send_byte(data[i]);
iic_wait_ack();
}
iic_stop();
}
/********************************************************************
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA = P3^3;
sbit SCL = P3^4;
unsigned char code numtab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
}
void main()
{
uchar aa[5]={0};
P2=0xf0;//数码管的段位
AT24C64_W(n_data,0x0000,5);
delay(5);
AT24C64_R(aa,0x0000,5);
while(1)
{
P0=numtab[aa[0]];//数码管的数据位
}
}
SDA=1;
for(i=0;i<8;i++)
{
ddata <<= 1;
SCL=0;
iic_delay();
SCL=1;
iic_delay();
ddata |= SDA;
}
SCL=0;
return ddata;
}
/********************************************************************
向iic设备发送一个字节
说明:CY是溢出位
***********************************************************************/
void iic_send_byte(uchar sbyte)
{
uchar i;
for(i=0;i<8;i++)
{
从iic设备读取N个字节
说明:read_data,存放字节的数组;
address,指定从address处开始读取
num,读取的字节数
***********************************************************************/
void AT24C64_R(uchar data[], uchar address, uchar n)
向iic设备写入N个字节
说明:write_data,写入字节的数组
Address,从address处开始写入
n,写入的字节数
***********************************************************************/
void AT24C64_W(uchar data[], uchar address, uchar n)
{
SDA=0;
SCL=0;
iic_delay();
SCL=1;
iic_delay();
SDA=1;
}
/************************************************************************/
/*发送ACK信号*/
/************************************************************************/
voidiic_noack()
{
SDA=1;
iic_delay();
SCL=1;
iic_delay();
SCL=0;
}
/********************************************************************
等待ACK信号
***********************************************************************/
MCU从iic设备接收一个字节
***********************************************************************/
uchar iic_receive_byte()
{
uchar i;
uchar ddata=0;
SCL=0;
iic_delay();
{
uchari;
if(n>32) n=32; //每页最多32字节
iic_start();
iic_send_byte(0xa0);//器件地址
iic_wait_ack();
iic_send_byte(address>>8);//传高8位地址
iic_wait_ack();
iic_send_byte(address & 0xff);//传低8位地址
uchar n_data[]={1,3,5,7,9};
/************************************************************************/
void delay(int i)
{
int j;
while(i--)
for(j=255;j>0;j--);
{
uchari;
uchar *pp;
if(n>32) n=32; //n不能大于32,会从头覆盖字节
pp= data;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address>>8);
iic_wait_ack();
iic_send_byte(address & 0xff);
}
/************************************************************************/
void iic_delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/************************************************************************/
sbyte<<=1;
SCL = 0;
_nop_();
SDA = CY;
iic_delay();
SCL = 1;
iic_delay();
}
SCL=0;
iic_delay();
SCL = 1;
iic_delay();
}
/********************************************************************
iic_wait_ack();
iic_start();
iic_send_byte(0xa1);
iic_wait_ack();
for (i=0;i<n;i++)
{
*pp= iiΒιβλιοθήκη _receive_byte();pp++;
if (i<(n - 1))
{
ack();
}
}
iic_noack();
iic_stop();
{
uchartt=200;
SDA=1;
iic_delay();
SCL=1;
iic_delay();
while(SDA &&tt--){}
SCL=0;
}
/********************************************************************
voidack()
{
SDA=0;
iic_delay();
SCL=1;
iic_delay();
SCL=0;
}
/************************************************************************/
/*发送NOACK信号*/
/************************************************************************/
void iic_start()
{
SDA = 1;
SCL = 1;
iic_delay();
SDA = 0;
iic_delay();
SCL = 0;
}
/************************************************************************/
void iic_stop()
iic_wait_ack();
for(i=0;i<num;i++)
{
iic_send_byte(data[i]);
iic_wait_ack();
}
iic_stop();
}
/********************************************************************
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA = P3^3;
sbit SCL = P3^4;
unsigned char code numtab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
}
void main()
{
uchar aa[5]={0};
P2=0xf0;//数码管的段位
AT24C64_W(n_data,0x0000,5);
delay(5);
AT24C64_R(aa,0x0000,5);
while(1)
{
P0=numtab[aa[0]];//数码管的数据位
}
}
SDA=1;
for(i=0;i<8;i++)
{
ddata <<= 1;
SCL=0;
iic_delay();
SCL=1;
iic_delay();
ddata |= SDA;
}
SCL=0;
return ddata;
}
/********************************************************************
向iic设备发送一个字节
说明:CY是溢出位
***********************************************************************/
void iic_send_byte(uchar sbyte)
{
uchar i;
for(i=0;i<8;i++)
{
从iic设备读取N个字节
说明:read_data,存放字节的数组;
address,指定从address处开始读取
num,读取的字节数
***********************************************************************/
void AT24C64_R(uchar data[], uchar address, uchar n)
向iic设备写入N个字节
说明:write_data,写入字节的数组
Address,从address处开始写入
n,写入的字节数
***********************************************************************/
void AT24C64_W(uchar data[], uchar address, uchar n)
{
SDA=0;
SCL=0;
iic_delay();
SCL=1;
iic_delay();
SDA=1;
}
/************************************************************************/
/*发送ACK信号*/
/************************************************************************/
voidiic_noack()
{
SDA=1;
iic_delay();
SCL=1;
iic_delay();
SCL=0;
}
/********************************************************************
等待ACK信号
***********************************************************************/
MCU从iic设备接收一个字节
***********************************************************************/
uchar iic_receive_byte()
{
uchar i;
uchar ddata=0;
SCL=0;
iic_delay();
{
uchari;
if(n>32) n=32; //每页最多32字节
iic_start();
iic_send_byte(0xa0);//器件地址
iic_wait_ack();
iic_send_byte(address>>8);//传高8位地址
iic_wait_ack();
iic_send_byte(address & 0xff);//传低8位地址
uchar n_data[]={1,3,5,7,9};
/************************************************************************/
void delay(int i)
{
int j;
while(i--)
for(j=255;j>0;j--);
{
uchari;
uchar *pp;
if(n>32) n=32; //n不能大于32,会从头覆盖字节
pp= data;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address>>8);
iic_wait_ack();
iic_send_byte(address & 0xff);
}
/************************************************************************/
void iic_delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/************************************************************************/
sbyte<<=1;
SCL = 0;
_nop_();
SDA = CY;
iic_delay();
SCL = 1;
iic_delay();
}
SCL=0;
iic_delay();
SCL = 1;
iic_delay();
}
/********************************************************************
iic_wait_ack();
iic_start();
iic_send_byte(0xa1);
iic_wait_ack();
for (i=0;i<n;i++)
{
*pp= iiΒιβλιοθήκη _receive_byte();pp++;
if (i<(n - 1))
{
ack();
}
}
iic_noack();
iic_stop();