📄 iic.c
字号:
//-----------------------------------------------------------------------------
// iic.c
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <reg52.h>
#include <intrins.h>
#include "cpu/cpu.h"
#include "misc/general.h"
//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------
void i2c_Start ( void );
void i2c_Stop ( void );
char i2c_Read_Byte ( bit ack );
bit i2c_Write_Byte ( char c );
//------------------------------------------------------------------------------------
// i2c Start Routine
//------------------------------------------------------------------------------------
void i2c_Start (void)
{
i2c_SDA = HIGH;
i2c_SCL = HIGH;
_nop_ ();
i2c_SDA = LOW;
_nop_ (); _nop_ ();
i2c_SCL = LOW;
}
//------------------------------------------------------------------------------------
// i2c Stop Routine
//------------------------------------------------------------------------------------
void i2c_Stop (void)
{
i2c_SDA = LOW;
i2c_SCL = HIGH;
_nop_ ();
i2c_SDA = HIGH;
}
//------------------------------------------------------------------------------------
// i2c Write Byte Routine
//------------------------------------------------------------------------------------
bit i2c_Write_Byte (char c)
{
char i; bit ack;
for ( i = 8; i > 0; i-- )
{
if ( c & MSB )
i2c_SDA = HIGH;
else
i2c_SDA = LOW;
i2c_SCL = HIGH;
_nop_ ();
c <<= 1;
i2c_SCL = LOW;
}
i2c_SDA = HIGH;
i2c_SCL = HIGH;
_nop_ ();
ack = I2C_ACK;
if ( i2c_SDA == HIGH ) ack = I2C_NACK;
_nop_ (); _nop_ ();
i2c_SCL = LOW;
_nop_ (); _nop_ ();
return ack;
}
//------------------------------------------------------------------------------------
// i2c Read Byte Routine
//------------------------------------------------------------------------------------
char i2c_Read_Byte (bit ack)
{
char i, c = 0;
i2c_SDA = HIGH;
for ( i = 8; i > 0; i-- )
{
i2c_SCL = HIGH;
_nop_ ();
c <<= 1;
if ( i2c_SDA == HIGH ) c |= LSB;
i2c_SCL = LOW;
}
if ( ack == I2C_ACK ) i2c_SDA = LOW;
i2c_SCL = HIGH;
_nop_ ();
i2c_SCL = LOW;
return c;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -