?? 2402.c
字號:
/*========對2402的讀寫========*/
/*調用時需要參數DELY_TIME*/
#include <2402.h>
/*
函數:delayus(unsigned int t)
功能:毫秒級的時間延時函數
參數:t:延時的時間
*/
void delayus(unsigned int data t)
{
while(t!=0)
t--;
}
/*
函數:I2C_Start(void)
功能:啟動I2C總線
參數:
說明:當SCL為高電平時使SDA產生一個負跳變
*/
void I2C_Start(void)
{
SDA=1;
SCL=1;
delayus(DELAY_TIME);
SDA=0;
delayus(DELAY_TIME);
SCL=0;
delayus(DELAY_TIME);
}
/*
函數:I2C_Stop(void)
功能:終止I2C總線
參數:
說明:當SCL為高電平時使SDA產生一個正跳變
*/
void I2C_Stop(void)
{
SDA=0;
SCL=1;
delayus(DELAY_TIME);
SDA=1;
delayus(DELAY_TIME);
SCL=0;
delayus(DELAY_TIME);
}
/*
函數:SEND_0(void)
功能:發送0
參數:
說明: 在SCL為高電平時使SDA信號為低
*/
void SEND_0(void)
{
SDA=0;
SCL=1;
delayus(DELAY_TIME);
SCL=0;
delayus(DELAY_TIME);
}
/*
函數:SEND_1(void)
功能:發送1
參數:
說明:在SCL為高電平時使SDA信號為高
*/
void SEND_1(void)
{
SDA=1;
SCL=1;
delayus(DELAY_TIME);
SCL=0;
delayus(DELAY_TIME);
}
/*
函數:Check_Acknowledge(void)
功能:發送完一個字節后檢驗設備的應答信號
參數:
說明:
*/
bit Check_Acknowledge(void)
{
char data F0;
SDA=1;
SCL=1;
delayus(DELAY_TIME/2);
F0=SDA;
delayus(DELAY_TIME/2);
SCL=0;
delayus(DELAY_TIME);
if(F0==1)
return FALSE;
return TRUE;
}
/*
函數:WriteI2CByte(char b)
功能:向I2C總線寫一個字節
參數:b:寫入的字節
說明:
*/
void WriteI2CByte(char b)
{
char data i;
for(i=0;i<8;i++)
if((b<<i)&0x80)
SEND_1();
else
SEND_0();
}
/*
函數:ReadI2CByte(void)
功能:從I2C總線讀一個字節
參數:
說明:
*/
char ReadI2CByte(void)
{
char data b=0,i,F0;
for(i=0;i<8;i++)
{
SDA=1; /*釋放總線*/
SCL=1; /*接受數據*/
delayus(10);
F0=SDA;
delayus(10);
SCL=0;
if(F0==1)
{
b=b<<1;
b=b|0x01;
}
else
b=b<<1;
}
return b;
}
/*
函數:Write_One_Byte(char addr,char thedata)
功能:向2402寫一個字節
參數:addr: 數據存儲的地址
thedata:所要存儲的數據
說明:
*/
void Write_One_Byte(char addr,char thedata)
{
bit acktemp=1;
I2C_Start(); /*總線開始*/
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();/*發送完一個字節后檢驗設備的應答信號*/
WriteI2CByte(addr); /*向address首地址開始寫數據*/
acktemp=Check_Acknowledge();/*發送完一個字節后檢驗設備的應答信號*/
WriteI2CByte(thedata); /*把thedata寫進去*/
acktemp=Check_Acknowledge();/*發送完一個字節后檢驗設備的應答信號*/
I2C_Stop(); /*總線停止*/
}
/*
函數:Write_A_Page(char *buffer,char m,char addr)
功能:向2402寫一個數組
參數:*buffer:所要存儲的數組
m:存儲的字節數
addr: 數據存儲的首地址
說明:
*/
void Write_A_Page(char *buffer,char m,char addr)
{
bit acktemp=1;
int i;
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();/*發送完一個字節后檢驗設備的應答信號*/
WriteI2CByte(addr); /*address*/
acktemp=Check_Acknowledge();/*發送完一個字節后檢驗設備的應答信號*/
for(i=0;i<m;i++)
{
WriteI2CByte(buffer[i]);
if(!Check_Acknowledge())
{
I2C_Stop();
}
}
I2C_Stop();
}
/*
函數:Read_One_Byte(char addr)
功能:從2402讀一個子節
參數:addr: 數據存儲的地址
說明:
*/
char Read_One_Byte(char addr)
{
bit acktemp=1;
char mydata;
I2C_Start(); /*啟動I2C總線*/
WriteI2CByte(0xa0); /*向I2C總線寫一個字節*/
acktemp=Check_Acknowledge();/*發送完一個字節后檢驗設備的應答信號*/
WriteI2CByte(addr); /*向I2C總線寫一個字節,addr 是地址*/
acktemp=Check_Acknowledge();/*發送完一個字節后檢驗設備的應答信號*/
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();/*發送完一個字節后檢驗設備的應答信號*/
mydata=ReadI2CByte();
acktemp=Check_Acknowledge();/*發送完一個字節后檢驗設備的應答信號*/
return mydata;
I2C_Stop(); /*停止I2C總線*/
}
/*
函數:Read_N_Bytes(char *buffer,char n,char addr)
功能:從2402順序讀n個字節到指定的數組
參數:*buffer:讀取的字節數據所要存儲的數組
n:讀取的字節數
addr: 數據所存儲的首地址
說明:
*/
void Read_N_Bytes(char *buffer,char n,char addr)
{
bit acktemp=1;
int data i=0;
I2C_Start(); /*啟動I2C總線*/
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();/*發送完一個字節后檢驗設備的應答信號*/
WriteI2CByte(addr); /*address*/
acktemp=Check_Acknowledge();/*發送完一個字節后檢驗設備的應答信號*/
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();/*發送完一個字節后檢驗設備的應答信號*/
for(i=0;i<n;i++)
{
buffer[i]=ReadI2CByte();
if(i!=n-1)
SEND_0(); /*發送應答*/
else
SEND_1(); /*發送非應答*/
}
I2C_Stop(); /*停止I2C總線*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -