?? iic.c
字號:
#include "include.H"
//I2C基本操作函數由8個函數組成,程序清單如下:
/*******************************************************************************
* 函數原型:void function_delay(void);
* 功 能:本函數實際上只有一條返回指令,在具體應用中可視具體要求增加延時指令.
*******************************************************************************/
void function_delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
// ;
}
/*******************************************************************************
* 函數原型:void function_I2C_start(void);
* 功 能:提供I2C總線工作時序中的起始位.
*******************************************************************************/
void function_I2C_start(void)
{
SDA=1;
function_delay();
function_delay();
function_delay();
SCL=1;
function_delay();
function_delay();
function_delay();
SDA=0;
function_delay();
SCL=0;
function_delay();
}
/*******************************************************************************
* 函數原型:void function_I2C_stop(void);
* 功 能:提供I2C總線工作時序中的停止位.
*******************************************************************************/
void function_I2C_stop(void)
{
SDA=0;
function_delay();
SCL=1;
function_delay();
SDA=1;
function_delay();
// SCL=0;
// function_delay();
// SCL=1;
}
/*******************************************************************************
* 函數原型:void function_I2C_init(void);
* 功 能:I2C總線初始化.在main()函數中應首先調用本函數,然后再調用其他函數.
*******************************************************************************/
void function_I2C_init(void)
{
SCL=0;
function_I2C_stop();
}
/*******************************************************************************
* 函數原型:bit function_I2C_clock(void);
* 功 能:提供I2C總線的時鐘信號,并返回在時鐘電平為高期間SDA信號線上狀態.
* 本函數可以用于數據發送,也可用于數據接收.
*******************************************************************************/
bit function_I2C_clock(void)
{
bit sample;
SCL=1;
sample=SDA;
function_delay();
SCL=0;
// function_delay();
return(sample);
}
/*******************************************************************************
* 函數原型:bit function_I2C_send(unsigned char I2C_data);
* 功 能:向I2C總線發送8位數據,并請求一個應答信號ACK.如果收到ACK應答,則返回
* 1(TURE),否則返回0(FALSE).
*******************************************************************************/
bit function_I2C_send(unsigned char I2C_data)
{
register unsigned char i;
/* 發送8位數據 */
for(i=0;i<8;i++)
{
SDA=(bit)(I2C_data&0x80);
I2C_data<<=1;
function_I2C_clock();
}
function_delay();
/* 請求應答信號ACK */
SDA=1;
return(~function_I2C_clock());
}
/*******************************************************************************
* 函數原型:unsigned char function_I2C_receive(void);
* 功 能:從I2C總線接收8位數據信號,并將接收到的8位數據作為一個字節返回,不回
* 送應答信號ACK.主函數在調用本函數之前應保證SDA信號線處于浮置狀態,即
* 使8051的引腳置1.
*******************************************************************************/
unsigned char function_I2C_receive(void)
{
unsigned char I2C_data;
register unsigned char i;
for(i=0;i<8;i++)
{
I2C_data<<=1;
if(function_I2C_clock())
I2C_data|=0x01;
}
return(I2C_data);
}
/*******************************************************************************
* 函數原型:void function_I2C_Ack(void);
* 功 能:向I2C總線發送一個應答信號ACK,一般用于連續數據讀取時.
*******************************************************************************/
void function_I2C_Ack(void)
{
SDA=0;
SCL=1;
function_delay();
SCL=0;
function_delay();
SDA=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -