?? 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 + -