📄 iic.c
字号:
#include "include.H"
//I2C基本操作函数由8个函数组成,程序清单如下:
/*******************************************************************************
* 函数原型:void function_delay(void);
* 功 能:本函数实际上只有一条返回指令,在具体应用中可视具体要求增加延时指令.
*******************************************************************************/
void function_delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
// ;
}
/*******************************************************************************
* 函数原型:void function_I2C_start(void);
* 功 能:提供I2C总线工作时序中的起始位.
*******************************************************************************/
void function_I2C_start(void)
{
SDA=1;
function_delay();
function_delay();
function_delay();
SCL=1;
function_delay();
function_delay();
function_delay();
SDA=0;
function_delay();
SCL=0;
function_delay();
}
/*******************************************************************************
* 函数原型:void function_I2C_stop(void);
* 功 能:提供I2C总线工作时序中的停止位.
*******************************************************************************/
void function_I2C_stop(void)
{
SDA=0;
function_delay();
SCL=1;
function_delay();
SDA=1;
function_delay();
// SCL=0;
// function_delay();
// SCL=1;
}
/*******************************************************************************
* 函数原型:void function_I2C_init(void);
* 功 能:I2C总线初始化.在main()函数中应首先调用本函数,然后再调用其他函数.
*******************************************************************************/
void function_I2C_init(void)
{
SCL=0;
function_I2C_stop();
}
/*******************************************************************************
* 函数原型:bit function_I2C_clock(void);
* 功 能:提供I2C总线的时钟信号,并返回在时钟电平为高期间SDA信号线上状态.
* 本函数可以用于数据发送,也可用于数据接收.
*******************************************************************************/
bit function_I2C_clock(void)
{
bit sample;
SCL=1;
sample=SDA;
function_delay();
SCL=0;
// function_delay();
return(sample);
}
/*******************************************************************************
* 函数原型:bit function_I2C_send(unsigned char I2C_data);
* 功 能:向I2C总线发送8位数据,并请求一个应答信号ACK.如果收到ACK应答,则返回
* 1(TURE),否则返回0(FALSE).
*******************************************************************************/
bit function_I2C_send(unsigned char I2C_data)
{
register unsigned char i;
/* 发送8位数据 */
for(i=0;i<8;i++)
{
SDA=(bit)(I2C_data&0x80);
I2C_data<<=1;
function_I2C_clock();
}
function_delay();
/* 请求应答信号ACK */
SDA=1;
return(~function_I2C_clock());
}
/*******************************************************************************
* 函数原型:unsigned char function_I2C_receive(void);
* 功 能:从I2C总线接收8位数据信号,并将接收到的8位数据作为一个字节返回,不回
* 送应答信号ACK.主函数在调用本函数之前应保证SDA信号线处于浮置状态,即
* 使8051的引脚置1.
*******************************************************************************/
unsigned char function_I2C_receive(void)
{
unsigned char I2C_data;
register unsigned char i;
for(i=0;i<8;i++)
{
I2C_data<<=1;
if(function_I2C_clock())
I2C_data|=0x01;
}
return(I2C_data);
}
/*******************************************************************************
* 函数原型:void function_I2C_Ack(void);
* 功 能:向I2C总线发送一个应答信号ACK,一般用于连续数据读取时.
*******************************************************************************/
void function_I2C_Ack(void)
{
SDA=0;
SCL=1;
function_delay();
SCL=0;
function_delay();
SDA=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -