📄 i2c.c
字号:
/*--------------------------------------------------------
i2c.c file
Creat by Computer-lov Date: 2005.7.19
Last edit date:2005.7.19
Copyright(C) 2005-2015 Computer-lov
All rights reserved
Welcome to my Blog: Http://computer00.21ic.org
-----------------------------------------------------------*/
#include "hardware.h"
#include "I2C.h"
#define delay()
//*****************************************************************************************************
//void delay(void) //延时子程序
//{
// unsigned char i;
// for(i=0;i<1;i++);
//}
//*****************************************************************************************************
//************************************** 将一个字节写入I2C总线 *****************************************
unsigned char Write_a_data(unsigned char device_addr,unsigned char data_addr,unsigned char w_data)
{
unsigned char i,Device_Addr;
delay();
SDA=0; //产生一个起始位
delay();
Device_Addr=device_addr; //地址暂存
for(i=0;i<7;i++) //输出设备地址
{
SCL=0;
delay();
SDA=device_addr&0x80; //SDA上输出一位数据,高位在前
device_addr<<=1;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=0; //SDA上输出0,表示写操作
delay();
SCL=1;
delay();
SCL=0;
delay();
SDA=1; //释放SDA线
delay();
SCL=1;
delay();
if(SDA){return 1;} //如果设备未响应,则返回出错代码1
for(i=0;i<8;i++) //输出数据地址
{
SCL=0;
delay();
SDA=data_addr&0x80; //SDA上输出一位数据,高位在前
data_addr<<=1;
delay();
SCL=1;
delay();
delay();
}
SCL=0;
delay();
SDA=1; //释放SDA线
delay();
SCL=1;
delay();
if(SDA){return 2;} //如果设备未响应,则返回出错代码2
for(i=0;i<8;i++) //输出要写入的数据
{
SCL=0;
delay();
SDA=w_data&0x80; //SDA上输出一位数据,高位在前
w_data<<=1;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1; //释放SDA线
delay();
SCL=1;
delay();
if(SDA){return 3;} //如果设备未响应,则返回出错代码3
SCL=0;
delay();
SDA=0;
delay();
SCL=1;
delay();
SDA=1; //产生一个停止位,停止操作
return 0; //正确写入,返回0
}
//****************************************************************************************
#define SET_POINT 0xB0 //0xB0命令表示写入地址
//********************************* 从I2C总线中读取一个字节 *****************************
unsigned int Read_a_data(unsigned char device_addr,unsigned char data_addr)
{
unsigned char i,r_data; //,Device_Addr;
Write_a_data(device_addr,SET_POINT,data_addr);
SDA=0; //产生一个起始位
delay();
for(i=0;i<7;i++) //输出设备地址,一个7位的地址
{
SCL=0;
delay();
SDA=device_addr&0x80; //SDA上输出一位数据,高位在前
device_addr<<=1;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1; //SDA上输出1,表示读操作
delay();
SCL=1;
delay();
SCL=0;
delay();
SDA=1; //释放SDA线
delay();
SCL=1;
delay();
if(SDA) return 0x0300; //如果设备未响应,则返回出错代码0x0300
for(i=0;i<8;i++) //读出数据
{
SCL=0;
delay();
r_data<<=1;
delay();
SCL=1;
if(SDA)r_data=r_data|0x01; //保存一位数据
delay();
}
SCL=0;
delay();
SDA=1; //置SDA高电平,表示停止读出
delay();
SCL=1;
delay();
SCL=0;
delay();
SDA=0;
delay();
SCL=1;
delay();
SDA=1; //产生一个停止位,停止读操作
return r_data; //返回数据
}
//****************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -