📄 i2c.c
字号:
#include "globe.h"
void Delay(void)
{
uint8_t temp = 10; // mdy
while(--temp)
__wait_nop();
}
void i2c_start(void)
{
I2C_SDA_DIR = OUTPUT;
I2C_SDA = HIGH;
I2C_SCL = HIGH;
Delay();
I2C_SDA = LOW;
Delay();
I2C_SCL = LOW;
Delay();
}
void i2c_stop(void)
{
I2C_SDA_DIR = OUTPUT;
I2C_SDA = LOW;
I2C_SCL = HIGH;
Delay();
I2C_SDA = HIGH;
Delay();
I2C_SCL = LOW;
Delay();
}
void i2c_init(void)
{
I2C_SCL_DIR = OUTPUT;
I2C_SDA_DIR = OUTPUT;
Delay();
I2C_SCL = LOW;
i2c_stop();
}
uint8_t i2c_send_byte(uint8_t data)
{
uint8_t i;
uint8_t temp = 0;
I2C_SDA_DIR = OUTPUT;
for(i=0; i<8; i++)
{
if(data & 0x80)
I2C_SDA = 1;
else
I2C_SDA = 0;
data <<= 1;
I2C_SCL = HIGH;
Delay(); // for lcd module need more delay.
I2C_SCL = LOW;
}
I2C_SDA_DIR = INPUT;
Delay();
I2C_SCL = HIGH;
while(I2C_SDA) // Wait slave ack.
{
if(++temp > I2C_TIMEOUT)
{
return(0);
}
}
I2C_SDA_DIR = OUTPUT;
I2C_SCL = LOW;
return(1);
}
uint8_t i2c_clock(void)
{
uint8_t temp;
I2C_SCL = HIGH;
Delay();
temp = I2C_SDA;
I2C_SCL = LOW;
return(temp);
}
uint8_t i2c_receive_byte(void)
{
uint8_t i;
uint8_t data = 0;
I2C_SDA_DIR = INPUT;
for(i=0; i<8; i++)
{
data <<= 1;
if( i2c_clock() )
{
data += 1;
}
}
I2C_SDA_DIR = OUTPUT;
return(data);
}
void i2c_ack(void)
{
I2C_SDA_DIR = OUTPUT;
I2C_SDA = LOW;
i2c_clock();
I2C_SDA = HIGH;
}
uint8_t i2c_receive_byte0(void)
{
uint8_t i;
uint8_t data = 0;
I2C_SDA_DIR = INPUT;
for(i=0; i<8; i++)
{
data >>= 1;
if( i2c_clock() )
{
data |= 0x80;
}
else
data &= 0x7F;
}
I2C_SDA_DIR = OUTPUT;
return(data);
}
uint8_t i2c_send_byte0(uint8_t data)
{
uint8_t i;
uint8_t temp = 0;
I2C_SDA_DIR = OUTPUT;
for(i=0; i<8; i++)
{
if(data & 0x01)
I2C_SDA = 1;
else
I2C_SDA = 0;
data >>= 1;
I2C_SCL = HIGH;
Delay(); // for lcd module need more delay.
I2C_SCL = LOW;
}
I2C_SDA_DIR = INPUT;
Delay();
I2C_SCL = HIGH;
while(I2C_SDA) // Wait slave ack.
{
if(++temp > I2C_TIMEOUT)
return(0);
}
I2C_SDA_DIR = OUTPUT;
I2C_SCL = LOW;
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -