?? eepromrw.c
字號:
/*————————————————————
〖說明〗24LC65 I2C EEPROM字節讀寫驅動程序,芯片A0-A1-A2要接VCC。
現缺頁寫、頁讀,和CRC校驗程序。以下程序經過50臺驗證,批量的效果有待考
察。
為了安全起見,程序中很多NOP是冗余的,希望讀者能進一步精簡,但必須經過驗
證。
51晶振為11.0592MHz
〖文件〗24LC65.c ﹫2001/03/23
〖作者〗龍嘯九天 c51@yeah.net http://mcs51.yeah.net/
〖修改〗修改建議請到論壇公布 http://c51bbs.yeah.net/
〖版本〗V1.00A Build 0323
—————————————————————*/
#include <reg52.h >
#include<INTRINS.H>
#define SDA P3_5
#define SCL P3_4
#define uchar unsigned char
#define uint unsigned int
sbit P3_5 = P3^5;
sbit P3_4 = P3^4;
/*----------------------------------------------------------------------------
調用方式:write_8bit(uchar ch) ﹫2001/03/23
函數說明:內函數,私有,用戶不直接調用。
------------------------------------------------------------------------------*/
write_8bit(uchar ch)
{
uchar i=8;
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
while (i--)
{
SDA=(bit)(ch&0x80);
_nop_();_nop_();_nop_();_nop_();_nop_();
ch<<=1;
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
/*------------------------------------------------------------------------------
--
調用方式:void ACK(void) ﹫2001/03/23
函數說明:內函數,私有,用戶不直接調用。
--------------------------------------------------------------------------------
-*/
void ACK(void)
{
uchar time_1 ;
SDA=1;
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
time_1=5;
while(SDA) {if (!(time_1--)) break;} //ACK
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
/*------------------------------------------------------------------------------
--
調用方式:void Write24LC65(uint address,uchar ddata) ﹫2001/03/23
函數說明:在指定地址address(address<0x2000)寫入一個字節ddata
--------------------------------------------------------------------------------
-*/
void Write24LC65(uint address,uchar ddata)//
{
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
SCL=0; //START
write_8bit(0xae); //寫從地址
ACK();
write_8bit(address>>8);
ACK();
write_8bit(address&0x00FF);
ACK();
write_8bit(ddata);
ACK();
SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_
();SDA=1; //STOP
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
//delay(10);
}
/*------------------------------------------------------------------------------
--
調用方式:uchar Read24LC65(uint address) ﹫2001/03/23
函數說明:讀取24LC65指定地址address(address<0x2000)的數據。
--------------------------------------------------------------------------------
-*/
uchar Read24LC65(uint address)
{
uchar ddata=0;
uchar i=8;
SDA=0;_nop_();SCL=0; //START
write_8bit(0xae); //寫從地址
ACK();
write_8bit(address>>8);
ACK();
write_8bit(address&0x00FF);
ACK();
//以上是一個“啞”寫操作,相當于設置當前地址
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
SCL=0; //START
write_8bit(0xaf); //寫從地址,置為讀模式
ACK();
while (i--)
{
SDA=1;
ddata<<=1;
SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;
if (SDA) ddata|=0x01;
}
SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_
();SDA=1; //STOP
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
//delay(5);
return ddata;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -