|
#include "reg51.h" #include "intrins.h"
sbit SCL= P1^5; sbit SDA= P1^4;
delay() { unsigned int i=1200; while(i--); } /*---------------------------------------------------------------------------- 調(diào)用方式:write_8bit(unsigned char ch) ﹫2001/03/23 函數(shù)說明:內(nèi)函數(shù),私有,用戶不直接調(diào)用。 ------------------------------------------------------------------------------- */ void write_8bit(unsigned char ch) { unsigned char 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_(); }
/*------------------------------------------------------------------------------ 調(diào)用方式:void ACK(void) ﹫2001/03/23 函數(shù)說明:內(nèi)函數(shù),私有,用戶不直接調(diào)用。 ------------------------------------------------------------------------------- */ void ACK(void) { unsigned char 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_(); }
unsigned char ReadIIC_24C01(unsigned char address) { unsigned char ddata=0; unsigned char i=8;
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( (address<<1) | 0x01); //寫頁地址和操作方式 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 delay(); return ddata;
}
void WriteIIC_24C01(unsigned char address,unsigned char 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( (address<<1) & 0xfe); //寫頁地址和操作方式,對于24C32- 24C256,page不起作用 ACK(); write_8bit(ddata); //發(fā)送數(shù)據(jù) ACK(); SDA=0; _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SDA=1; //STOP delay(); } 參考鏈接:http://www.picavr.com/news/2008-05/5296.htm |