📄 myiic24.h
字号:
//------------ 24c01 slave address ----------//
//------------ 1 0 1 0 A2 A1 A0 R/W ----------//
//---------- page read or write 8 byte--------//
//------------ 24c02 slave address ----------//
//------------ 1 0 1 0 A2 A1 A0 R/W ----------//
//---------- page read or write 8 byte--------//
//------------ 24c04 slave address ----------//
//------------ 1 0 1 0 A2 A1 P0 R/W ----------//
//--------- page read or write 16 byte--------//
//------------ 24c08 slave address ----------//
//------------ 1 0 1 0 A2 P1 P0 R/W ----------//
//--------- page read or write 16 byte--------//
//------------ 24c16 slave address ----------//
//------------ 1 0 1 0 P2 P1 P0 R/W ----------//
//--------- page read or write 16 byte--------//
//***** 以上读写方式同 c16 , P 为页地址 ******//
//------------ 24c32 slave address ----------//
//------------ 1 0 1 0 A2 A1 A0 R/W ----------//
//--------- page read or write 32 byte--------//
//------------ 24c64 slave address ----------//
//------------ 1 0 1 0 A2 A1 A0 R/W ----------//
//--------- page read or write 32 byte--------//
//------------ 24c128 slave address ----------//
//------------ 1 0 1 0 0 A1 A0 R/W ----------//
//--------- page read or write 64 byte--------//
//------------ 24c256 slave address ----------//
//------------ 1 0 1 0 0 A1 A0 R/W ----------//
//--------- page read or write 64 byte--------//
//------------ 24c512 slave address ----------//
//------------ 1 0 1 0 0 A1 A0 R/W ----------//
//--------- page read or write 128 byte-------//
//* 以上读写方式同 c64 , SUB1_ADDR 为页地址 **//
#include<reg52.h>
#include<intrins.h>
#define TRUE 1
#define FALSE 0
#define PAGE_SIZE 8
#define SLAVE_WRITE 0xa0
#define SLAVE_READ 0xa1
#define SUBJECT_ADDR 0x00
sbit SCL=P1^7;
sbit SDA=P1^6;
unsigned char READ_RAM[PAGE_SIZE];
void delaySend();
void delayWrite();
void iicStart();
void iicStop();
void iicAck();
void iicNack();
bit iicSend(unsigned char send_value);
unsigned char iicReceive();
void bWriteSingle(unsigned char device_write,sub_addr,write_value);
unsigned char bReadSingle(unsigned char device_write,sub_addr);
void pWriteSingle(unsigned char device_write,sub_addr);
void pReadSingle(unsigned char device_write,sub_addr);
void bWriteDouble(unsigned char device_write,sub1_addr,sub2_addr,write_value);
unsigned char bReadDouble(unsigned char device_write,sub1_addr,sub2_addr);
void pWriteDouble(unsigned char device_write,sub1_addr,sub2_addr);
void pReadDouble(unsigned char device_write,sub1_addr,sub2_addr);
/*----------5ms-delay-----------*/
void delayWrite() //time=[(((y*3)+2+3)*d)+2]+2(调用时间)+2(返回时间)
{
unsigned char d,y;
for(d=0;d<100;d++)
{ for(y=0;y<15;y++);}
}
void delaySend()
{
_nop_(); _nop_();
}
/*---iic总线起始位----------*/
void iicStart()
{
SDA=TRUE;
delaySend();
SCL=TRUE;
delaySend();
SDA=FALSE;
delaySend();
SCL=FALSE;
delaySend();
SDA=TRUE;
}
/*---iic总线停止位----------*/
void iicStop()
{
SDA=FALSE;
delaySend();
SCL=TRUE;
delaySend();
SDA=TRUE;
}
//--------向IIC总线发送一应答信号---------//
void iicAck()
{
SDA=FALSE;
delaySend();
SCL=TRUE;
delaySend();
SCL=FALSE;
delaySend();
SDA=TRUE;
}
//--------向IIC总线发送一非应答信号---------//
void iicNack()
{
SDA=TRUE;
delaySend();
SCL=TRUE;
delaySend();
SCL=FALSE;
delaySend();
}
//--------- 单片机向 AT24Cxx 发送数据 返回一个应答信号----------//
bit iicSend(unsigned char send_value)
{
bit bt_report;
unsigned char count;
unsigned char bdata bt_value;
bt_value=send_value;
for(count=0;count<8;count++)
{
SDA=bt_value & 0x80; //串行发送数据,高位在前
bt_value <<= 1;
delaySend();
SCL=TRUE;
delaySend();
SCL=FALSE;
delaySend();
}
SDA=TRUE;
delaySend();
SCL=TRUE; //产生第九个时钟信号,
delaySend(); //用于接收 AT24C02 发出的应答信号
bt_report=SDA;
delaySend();
SCL=FALSE;
delaySend();
return(~bt_report);
}
//----从IIC上接收8位数据,并将其作为一字节返回,不回送应答信号-----//
unsigned char iicReceive()
{
bit bt_buff;
unsigned char bdata by_report;
unsigned char count;
by_report=0;
for(count=0;count<8;count++)
{
by_report <<= 1;
SCL=TRUE;
delaySend();
bt_buff=SDA;
delaySend();
SCL=FALSE;
delaySend();
if(bt_buff)
by_report++;
}
return(by_report);
}
//---------写字节数据到 24cxx (byte write)------------//
void bWriteSingle(unsigned char device_write,sub_addr,write_value)
{
iicStart();
iicSend(device_write);
iicSend(sub_addr);
iicSend(write_value);
iicStop();
delayWrite();
}
//-----------读字节数据从 24cxx (byte read) 并返回一字节数据------------//
unsigned char bReadSingle(unsigned char device_write,sub_addr)
{
unsigned char by_report;
iicStart();
iicSend(device_write);
iicSend(sub_addr);
iicStart();
iicSend(device_write+1);
by_report=iicReceive();
iicNack();
iicStop();
return(by_report);
}
//---------写字节数据到 24cxx (page write)------------//
void pWriteSingle(unsigned char device_write,sub_addr)
{
unsigned char count;
iicStart();
iicSend(device_write);
iicSend(sub_addr);
for(count=0;count<PAGE_SIZE;count++)
{
iicSend(READ_RAM[count]);
}
iicStop();
delayWrite();
}
//-----------读字节数据从 24cxx (page read)--------------//
void pReadSingle(unsigned char device_write,sub_addr)
{
unsigned char count;
iicStart();
iicSend(device_write);
iicSend(sub_addr);
iicStart();
iicSend(device_write+1);
for(count=0;count<PAGE_SIZE;count++)
{
READ_RAM[count]=iicReceive();
if(count==PAGE_SIZE-1)
{ iicNack(); }
else
{ iicAck(); }
}
iicStop();
}
//---------写字节数据到 24cxx (byte write)------------//
void bWriteDouble(unsigned char device_write,sub1_addr,sub2_addr,write_value)
{
iicStart();
iicSend(device_write);
iicSend(sub1_addr);
iicSend(sub2_addr);
iicSend(write_value);
iicStop();
delayWrite();
}
//-----------读字节数据从 24cxx (byte read) 并返回一字节数据------------//
unsigned char bReadDouble(unsigned char device_write,sub1_addr,sub2_addr)
{
unsigned char by_report;
iicStart();
iicSend(device_write);
iicSend(sub1_addr);
iicSend(sub2_addr);
iicStart();
iicSend(device_write+1);
by_report=iicReceive();
iicNack();
iicStop();
return(by_report);
}
//---------写字节数据到 24cxx (page write)------------//
void pWriteDouble(unsigned char device_write,sub1_addr,sub2_addr)
{
unsigned char count;
iicStart();
iicSend(device_write);
iicSend(sub1_addr);
iicSend(sub2_addr);
for(count=0;count<PAGE_SIZE;count++)
{
iicSend(READ_RAM[count]);
}
iicStop();
delayWrite();
}
//-----------读字节数据从 24cxx (page read)--------------//
void pReadDouble(unsigned char device_write,sub1_addr,sub2_addr)
{
unsigned char count;
iicStart();
iicSend(device_write);
iicSend(sub1_addr);
iicSend(sub2_addr);
iicStart();
iicSend(device_write+1);
for(count=0;count<PAGE_SIZE;count++)
{
READ_RAM[count]=iicReceive();
if(count==PAGE_SIZE-1)
{ iicNack(); }
else
{ iicAck(); }
}
iicStop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -