?? 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 + -