📄 i2c_fun.h
字号:
//I2C总线基本操作 C51驱动函数///////
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE ~FALSE
//#define uchar unsigned char
sbit SCL=P1^6;
sbit SDA=P1^7;
void delay(void)
{
uchar i;
i=10;
while(i--);
}
//提供I2C总线工作时序中的起始位////
void I_start(void)
{
SDA=HIGH;
SCL=HIGH;
delay();
SCL=LOW;
delay();
SCL=HIGH;
delay();
SDA=LOW;
delay();
SCL=LOW;
delay();
//SDA=HIGH;
}
//提供I2C总线工作时序中的停止位////
void I_stop(void)
{
SDA=LOW;
delay();
SCL=HIGH;
delay();
SDA=HIGH;
delay();
SCL=LOW;
delay();
}
//I2C初始化/////////
void I_init(void)
{
SCL=LOW;
I_stop();
}
////提供I2C的时钟信号,并返回在时钟电平为高期间的SDA信号线上的状态////////
bit I_clock(void)
{
bit sample;
SCL=HIGH;
delay();
sample=SDA;
SCL=LOW;
delay();
return(sample);
}
////向I2C总线发送一个8位数据,并请求一个应答信号ACK,若受到ACK则返回1,否则返回0/////////
bit I_send(uchar I_data)
{
uchar I;
for(I=0;I<8;I++)
{
SDA=(bit)(I_data & 0x80);
I_data=I_data<<1;
I_clock();
}
///////////require ACK//////////
SDA=HIGH;
return(~I_clock());
}
//接受8位数据,并将此8位数据按一个字节返回,不回送ACK。调用本函数前,应保证SDA处于浮置状态///
uchar I_receive(void)
{
uchar I_data=0;
uchar I;
I_data=0;
for(I=0;I<8;I++)
{
I_data*=2;
if(I_clock())
I_data++;
}
return(I_data);
}
///向I2C总线发送一个ACK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -