?? iic.h
字號:
//本頭文件關于I2C總線的通信協議I0口模擬實現
#ifndef _IIC_H
#define _IIC_H
//信號引腳定義
sbit SDA=P1^5; // 將p1.0口模擬數據口
sbit SCL=P1^4; // 將p1.1口模擬時鐘口
/******************************************************************************
函數:IIC_delay5us()
功能:模擬I2C總線延時
說明:請根據具體情況調整延時值
******************************************************************************/
void IIC_delay5us()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/******************************************************************************
函數:DELAY20Ms()
功能:IIC總線STOP后有15-20MS的延時下一次才可以START。
******************************************************************************/
void Delay20Ms(void)
{
unsigned int TempCyc = 1500;
while(TempCyc--);
}
/*--------------------------------------------------------------------------------------------------
函數名稱: IIC_start()
函數功能: 啟動I2C總線子程序
函數說明:
SCL處于高電平期間,當SDA出現下降沿時啟動I2C總線
本函數也用來產生重復起始條件
--------------------------------------------------------------------------------------------------*/
void IIC_Start(void)
{
SDA = 1; //時鐘保持高,數據線從高到低一次跳變,I2C通信開始
IIC_delay5us();
SCL = 1;
IIC_delay5us();
SDA = 0;
IIC_delay5us();
SCL = 0;
IIC_delay5us();
}
/*--------------------------------------------------------------------------------------------------
函數名稱: IIC_stop()
函數功能: 停止I2C總線數據傳送子程序
函數說明: SCL處于高電平期間,當SDA出現上升沿時停止I2C總線
--------------------------------------------------------------------------------------------------*/
void IIC_Stop(void)
{
SCL = 1;
SDA = 0; //時鐘保持高,數據線從低到高一次跳變,I2C通信停止
IIC_delay5us();
SDA = 1;
IIC_delay5us();
//對于器件來說,在下一次產生Start之前,額外增加一定的延時是必須的
Delay20Ms();
}
/******************************************************************************
函數:Slave_Ack()
功能:讀取從機應答位(應答或非應答),用于判斷:從機是否成功接收主機數據
返回:
0:從機應答
1:從機非應答
說明:從機在收到每一個字節后都要產生應答位,主機如果收到非應答則應當終止傳輸
******************************************************************************/
bit Slave_Ack()
{
bit ack;
// unsigned char m;
SCL=0; //置SCL為低電平
SDA = 1; //釋放SDA信號線。
IIC_delay5us(); //延時,從機的響應信號應該在這段時間出現。
SCL = 1; // 置SCL為高電平,準備判斷SDA。
IIC_delay5us(); //延時。
ack = SDA; //讀取響應信號。
SCL = 0; //置SCL為低電平。
SDA=0;
/* k++;
m=k+'0';
if(ack==1)
DisplayOneChar(1, 1, '0');
else
DisplayOneChar(1, 1, m);*/
return ack;
}
/******************************************************************************
函數:master_Ack()
功能:主機產生應答位(應答),用于通知從機:主機成功接收從機數據
參數:
ack=0:主機應答
說明:主機在收到每一個字節后都要產生應答,在收到最后一個字節后,應當產生非應答
******************************************************************************/
/*void master_Ack()
{
SDA = 0;
IIC_delay5us();
SCL = 1;
IIC_delay5us();
SCL = 0;
}*/
/******************************************************************************
函數:master_NAck()
功能:主機產生應答位(應答),用于通知從機:主機成功接收從機數據
參數:
ack=0:主機應答
說明:主機在收到每一個字節后都要產生應答,在收到最后一個字節后,應當產生非應答
******************************************************************************/
/*void master_NAck()
{
SDA = 1;
SCL = 0;
IIC_delay5us();
SCL = 1;
IIC_delay5us();
}*/
//--------------------------------------------------------------------------------------------------
// 函數名稱: IICSendByte
// 入口參數: ch
// 函數功能: 發送一個字節,也就是DATASHEET中所說的BYTE WRITE.利用此函數的有很多,像
// 寫SLAVE ADDRESS,WORDADDRESS1,WORDADDRESS0
//--------------------------------------------------------------------------------------------------
void IICSendByte(unsigned char ch)
{
unsigned char n=8; // 向SDA上發送一位數據字節,共八位
while(n--)
{
if((ch&0x80) == 0x80) // 若要發送的數據最高位為1則發送位1
{
SCL=0;
SDA = 1; // 傳送位1
IIC_delay5us();
SCL = 1;
IIC_delay5us();
}
else
{
SCL=0;
SDA = 0; // 否則傳送位0
IIC_delay5us();
SCL = 1;
IIC_delay5us();
}
ch = ch<<1; // 數據左移一位
}
SCL=0;
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: IICreceiveByte
// 返回接收的數據
// 函數功能: 接收一字節子程序,利用此函數的有很多,像CURRENT ADDRESS READ,RADOM READ,SEQUENTIAL READ.
//--------------------------------------------------------------------------------------------------
unsigned char IICreceiveByte(void)
{
unsigned char n=8; // 從SDA線上讀取一上數據字節,共八位
unsigned char tdata;
SDA=1;
while(n--)
{
SCL = 0;
IIC_delay5us();
SCL=1;
IIC_delay5us();
tdata = tdata<<1; // 左移一位,或_crol_(temp,1)
if(SDA == 1)
tdata = tdata|0x01; // 若接收到的位為1,則數據的最后一位置1
else
tdata = tdata&0xfe; // 否則數據的最后一位置0
SDA=1;
}
return(tdata);
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -