?? i2c.c
字號:
/* =========================================================================
* I2C總線基本操作函數
* =========================================================================*/
/* 全局符號定義 */
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE ~FALSE
#define uchar unsigned char
sbit SCL = 0x96 ;
sbit SDA = 0x97 ;
/****************************************************************************
* 函數原型: void delay(void);
* 功 能: 本函數實際上只有一條返回指令, 在具體應用中可視具體要求增加延時
* 指令。
****************************************************************************/
void delay( void ) {
;
}
/****************************************************************************
* 函數原型: void I_start(void);
* 功 能: 提供I2C總線工作時序中的起始位。
****************************************************************************/
void I_start( void ) {
SCL = HIGH ;
delay() ;
SDA = LOW ;
delay() ;
SCL = LOW ;
delay() ;
}
/****************************************************************************
* 函數原型: void I_stop(void);
* 功 能: 提供I2C總線工作時序中的停止位。
****************************************************************************/
void I_stop( void ) {
SDA = LOW ;
delay() ;
SCL = HIGH ;
delay() ;
SDA = HIGH ;
delay() ;
SCL = LOW ;
delay() ;
}
/****************************************************************************
* 函數原型: void I_init(void);
* 功 能: I2C總線初始化。在main()函數中應首先調用本函數, 然后再調用
* 其它函數。
****************************************************************************/
void I_init( void ) {
SCL = LOW ;
I_stop() ;
}
/****************************************************************************
* 函數原型: bit I_clock(void);
* 功 能: 提供I2C總線的時鐘信號, 并返回在時鐘電平為高期間SDA 信號線上狀
* 態。本函數可用于數據發送, 也可用于數據接收。
****************************************************************************/
bit I_clock( void ) {
bit sample ;
SCL = HIGH ;
delay() ;
sample = SDA ;
SCL = LOW ;
delay() ;
return ( sample ) ;
}
/****************************************************************************
* 函數原型: bit I_send(uchar I_data);
* 功 能: 向I2C總線發送8位數據, 并請求一個應答信號ACK。如果收到ACK應答
* 則返回1(TRUE), 否則返回0(FALSE)。
****************************************************************************/
bit I_send( uchar I_data ) {
uchar i ;
/* 發送8位數據 */
for ( i=0 ; i<8 ; i++ ) {
SDA = (bit)( I_data & 0x80 ) ;
I_data = I_data << 1 ;
I_clock() ;
}
/* 請求應答信號ACK */
SDA = HIGH ;
return ( ~I_clock() );
}
/****************************************************************************
* 函數原型: uchar I_receive(void);
* 功 能: 從I2C總線上接收8位數據信號, 并將接收到8位數據作為一個字節
* 返回, 不回送應答信號ACK。主函數在調用本函數之前應保證SDA信
* 號線處于浮置狀態, 即使8051的P1.7腳置1。
****************************************************************************/
uchar I_receive( void ) {
uchar I_data = 0 ;
register uchar i ;
for ( i=0 ; i<8 ; i++ ) {
I_data *= 2 ;
if (I_clock()) I_data++ ;
}
return ( I_data ) ;
}
/****************************************************************************
* 函數原型: void I_Ack(void);
* 功 能: 向I2C總線發送一個應答信號ACK, 一般用于連續數據讀取時。
*****************************************************************************/
void I_Ack( void ) {
SDA = LOW ;
I_clock() ;
SDA = HIGH ;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -