📄 i2cwire.h
字号:
/*******************************************************************************
* 标题: I2Cwire头文件 *
* 日期: 2007-3-25 *
* 版本: 1.0 *
* 作者: 无名 *
* 邮箱: djrljf@163.com *
* QQ : 403499014 *
********************************************************************************
********************************************************************************
* 【版权】 Copyright(C)无名 All Rights Reserved *
* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
*******************************************************************************/
#ifndef _I2Cwire_H // 防止_I2Cwire_H被重复引用
#define _I2Cwire_H
#include "at89x52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
//==============================================================
#define clk P1_2 //I2C时钟线默认P1.2口,需要时修改该配置
#define sda P1_3 //I2C数据线默认P1.3口,需要时修改该配置
#define rCommand 0xa1 //读命令 A0 A1 A2均接地,需要时修改该配置
#define wCommand 0xa0 //写命令 A0 A1 A2均接地,需要时修改该配置
//==============================================================
//==============================================================
//起始信号,激活IIC总线器件;
//==============================================================
void begin()
{
sda=1; //数据线置1
_nop_(); //延时一个机器周期
clk=1; //时钟线置1
_nop_();
sda=0; //数据线置0
_nop_();
clk=0;
}
//==============================================================
//停止信号
//==============================================================
void end()
{
sda=0;
clk=1;
_nop_();
sda=1;
}
//==============================================================
//应答信号
//==============================================================
void answer()
{
sda=0;
_nop_();
clk=1;
_nop_();
clk=0;
}
//==============================================================
//等待从机的应答信号
//==============================================================
void waiting()
{
clk=1;
while(sda);
clk=0;
}
//==============================================================
//写时序
//==============================================================
void write(uchar temp)
{
uchar i;
for(i=0;i<8;i++)
{if((temp&0x80)==0x80)sda=1;//从最高位开始写
else sda=0;
temp=(temp<<1);
clk=1;
_nop_();
clk=0; //每次都以CLK为0结束 SDA不定
}
}
//==============================================================
//读时序
//==============================================================
uchar read()
{
uchar i,temp=0;
for(i=0;i<8;i++)
{
clk=1;
temp=(temp<<1)|sda;
clk=0;
}
answer();
return temp; //返回一个无符号字符型数
}
//==============================================================
//写一个字节到指定地址
//==============================================================
extern void write1Word(uchar addr,uchar temp)
{
begin();
write(wCommand);
waiting();
write(addr);
waiting();
write(temp);
waiting();
end();
}
//==============================================================
//连续写n个字节到以ADDR开始的连续空间里
//==============================================================
extern void writeMultiWord(uchar addr,uint n,uchar *word)
{
uchar i;
begin();
write(wCommand);
waiting();
write(addr);
waiting();
for(i=0;i<n;i++)
{
write(*(word+i));
waiting();
}
end();
}
//==============================================================
//在以ADDR开始的空间内连续读取N个数据
//==============================================================
extern uchar read1Word(uchar addr)
{
begin();
write(wCommand);
waiting();
write(addr);
waiting();
begin();
write(rCommand);
waiting();
return read();
end();
}
//==============================================================
//在以ADDR开始的空间内连续读取N个数据
//==============================================================
extern uchar readMultiWord(uchar addr,uint n)
{
uchar i;
begin();
write(wCommand);
waiting();
write(addr);
waiting();
begin();
write(rCommand);
waiting();
for(i=0;i<n;i++)
{
return read();
if(i<(n-1))
answer();
}
end();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -