分享到:
//==============================================
//I2C通信设定↓(时钟线始终设为输出,数据线随读写状态改变)
//----------------------------------------------
void input(void)//read_IO口设置为输入
{
DDR00=0;//时钟线/输出
DDR17=1;//数据线/输入
}
void output(void)//write_IO口设置为输出
{
DDR00=0;//时钟线/输出
DDR17=0;//数据线/输出
}
void IIC_delay(void)//短暂延时
{
Nop();
Nop();
Nop();
Nop();
Nop();
}
void start(void) //开始信号
{
output();
SDA=1;
IIC_delay();
SCL=1;
IIC_delay();
SDA=0;
IIC_delay();
}
void IIC_stop(void) //停止信号
{
output();
SDA=0;
IIC_delay();
SCL=1;
IIC_delay();
SDA=1;
IIC_delay();
DDR00=1;//时钟线/输入
DDR17=1;//数据线/输入
}
void s_respons(void) //从机应答信号
{
uchar i=0;
input();
SCL=1;
IIC_delay();
while((SDA==1)&&(i<250))i++;//超时设定
SCL=0;
IIC_delay();
}
void m_respons(void)//主机应答信号
{
output();
SCL=0;
IIC_delay();
SDA=1;
IIC_delay();
SCL=1;
IIC_delay();
SCL=0;
IIC_delay();
}
void write_byte(uchar date)//写入一个字节Byte
{
uchar j,temp=0;
temp=date;
output();
for(j=0;j<8;j++)
{
SCL=0;
temp=temp<<1;
IIC_delay();
SDA=C;//C位对应最高位移出的值
IIC_delay();
SCL=1;
IIC_delay();
}
SCL=0;
IIC_delay();
SDA=1;
IIC_delay();
}
uchar read_byte(void)//读出一个字节Byte
{
uchar h,k=0;
input();
SCL=0;
IIC_delay();
SDA=1;
IIC_delay();
for(h=0;h<8;h++)
{
SCL=1;
IIC_delay();
k=(k<<1)|SDA;
SCL=0;
IIC_delay();
}
return k;
}
void write_add(uchar address,uchar date)//在任意地址写入一个数
{
start();
write_byte(0xa0);//设备地址
s_respons();
write_byte(address);//数据地址
s_respons();
write_byte(date);//数据
s_respons();
IIC_stop();
}
uchar read_add(uchar address)//读出任意一个地址的数据
{
uchar date=0;
start();
write_byte(0xa0);
s_respons();
write_byte(address);
s_respons();
start();
write_byte(0xa1);
s_respons();
date=read_byte();
m_respons();
IIC_stop();
return date;
}
//I2C通信设定↓(时钟线始终设为输出,数据线随读写状态改变)
//----------------------------------------------
void input(void)//read_IO口设置为输入
{
DDR00=0;//时钟线/输出
DDR17=1;//数据线/输入
}
void output(void)//write_IO口设置为输出
{
DDR00=0;//时钟线/输出
DDR17=0;//数据线/输出
}
void IIC_delay(void)//短暂延时
{
Nop();
Nop();
Nop();
Nop();
Nop();
}
void start(void) //开始信号
{
output();
SDA=1;
IIC_delay();
SCL=1;
IIC_delay();
SDA=0;
IIC_delay();
}
void IIC_stop(void) //停止信号
{
output();
SDA=0;
IIC_delay();
SCL=1;
IIC_delay();
SDA=1;
IIC_delay();
DDR00=1;//时钟线/输入
DDR17=1;//数据线/输入
}
void s_respons(void) //从机应答信号
{
uchar i=0;
input();
SCL=1;
IIC_delay();
while((SDA==1)&&(i<250))i++;//超时设定
SCL=0;
IIC_delay();
}
void m_respons(void)//主机应答信号
{
output();
SCL=0;
IIC_delay();
SDA=1;
IIC_delay();
SCL=1;
IIC_delay();
SCL=0;
IIC_delay();
}
void write_byte(uchar date)//写入一个字节Byte
{
uchar j,temp=0;
temp=date;
output();
for(j=0;j<8;j++)
{
SCL=0;
temp=temp<<1;
IIC_delay();
SDA=C;//C位对应最高位移出的值
IIC_delay();
SCL=1;
IIC_delay();
}
SCL=0;
IIC_delay();
SDA=1;
IIC_delay();
}
uchar read_byte(void)//读出一个字节Byte
{
uchar h,k=0;
input();
SCL=0;
IIC_delay();
SDA=1;
IIC_delay();
for(h=0;h<8;h++)
{
SCL=1;
IIC_delay();
k=(k<<1)|SDA;
SCL=0;
IIC_delay();
}
return k;
}
void write_add(uchar address,uchar date)//在任意地址写入一个数
{
start();
write_byte(0xa0);//设备地址
s_respons();
write_byte(address);//数据地址
s_respons();
write_byte(date);//数据
s_respons();
IIC_stop();
}
uchar read_add(uchar address)//读出任意一个地址的数据
{
uchar date=0;
start();
write_byte(0xa0);
s_respons();
write_byte(address);
s_respons();
start();
write_byte(0xa1);
s_respons();
date=read_byte();
m_respons();
IIC_stop();
return date;
}
(0 )
(0 )


发表回复
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖