#include "iic.h"
#include "public.h"
void IICstart(void)
{
EA=0;
SDA=1; //先将SDA=1,以准备在SCL=1时,将SDA=0
SCL=1; //时钟总线拉高
delay0(); //略做延时
SDA=0; //SCL=1时,将SDA拉低即产生启动信号
delay0(); //略做延时
SCL=0; //将SCL=0,完成启动信号操作
}
//---------------------------------------
//名称:IIC停止信号函数
//适用:给力者GL9单片机开发学习系统
//公司:宁波芯动电子有限公司
//网址:www.MovingChip.com
//日期:20140215
//---------------------------------------
void IICstop(void)
{
EA=0;
SDA=0; //先将SDA=0,以准备在SCL=1时,将SDA=1
SCL=1; //时钟总线拉高
delay0(); //略做延时
SDA=1; //SCL=1时,将SDA拉高即产生停止信号
delay0(); //略做延时
SCL=0; //将SCL=0,完成启动信号操作
}
//---------------------------------------
//名称:向IIC总线写入1个字节函数
//适用:给力者GL9单片机开发学习系统
//公司:宁波芯动电子有限公司
//网址:www.MovingChip.com
//日期:20140215
//---------------------------------------
void Write1Byte(unsigned char Buf1)
{
unsigned char k; //1个字节要分8次写入,需要定义一个寄存器用来计数
for(k=0;k<8;k++) //做一个8次的循环,每次写入1位,需要写8次
{
if(Buf1&0x80) //从最高位开始写
{
SDA=1; //如果欲写入数据为1,就将数据线置1
}
else
{
SDA=0; //如果欲写入数据为0,就将数据线写0
}
delay0(); //略做延时
SCL=1; //时钟线做一个上升沿,将一位数据写入
Buf1=Buf1<<1; //数据左移一位,将下次要写入的位数据移到最高位
delay0(); //略做延时
SCL=0; //将SCL=0,以准备通过上升沿将数据写入
delay0(); //略做延时
}
SDA=1; //将SDA=1,准备读应答信号
delay0(); //略做延时
SCL=1; //将SCL=1,做个上升沿准备读应答信号
delay0(); //略做延时
SCL=0; //将SCL=0,结束应答信号读操作
}
//---------------------------------------
//名称:从IIC总线读入1个字节函数
//适用:给力者GL9单片机开发学习系统
//公司:宁波芯动电子有限公司
//网址:www.MovingChip.com
//日期:20140215
//---------------------------------------
unsigned char Read1Byte(void)
{
unsigned char k; //1个字节要分8次读出,需要定义一个寄存器用来计数
unsigned char t=0; //定义一个寄存器用保存读出数据
for(k=0;k<8;k++) //做一个8次的循环,每次读入1位,需要读8次
{
t=t<<1; //数据左移一位,空出最低位以准备保存读入的一位数据
SDA=1; //将SDA写1准备读
SCL=1; //将SCL=1,做个上升沿准备读一位数据
delay0(); //略做延时
if(SDA==1) //读一位数据,并判断
{
t=t|0x01; //如果读入数据为1,就将接收缓冲区最低一位置1
}
else
{
t=t&0xfe; //如果读入数据为0,就将接收缓冲区最低一位写0
}
SCL=0; //SCL恢复为0,结束一位数据读操作
delay0(); //略做延时
}
return t; //将读入的一个字节返回
}
//---------------------------------------
//名称:软件模拟IIC向PCF8563指定地址写一个字节函数
//适用:给力者GL9单片机开发学习系统
//公司:宁波芯动电子有限公司
//网址:www.MovingChip.com
//日期:20140215
//---------------------------------------
void WritePCF8563(unsigned char Address,unsigned char Databuf)
{
EA=0; //直接调用本函数即可对PCF8563的Address地址写Databuf
IICstart(); //IIC启动信号
Write1Byte(0xA2); //发送PCF8563的器件地址和写信号
Write1Byte(Address); //发送地址
Write1Byte(Databuf); //发送数据
IICstop(); //产生IIC停止信号
EA=1;
}
//---------------------------------------
//名称:软件模拟IIC从PCF8563指定地址读一个字节函数
//适用:给力者GL9单片机开发学习系统
//公司:宁波芯动电子有限公司
//网址:www.MovingChip.com
//日期:20140215
//---------------------------------------
unsigned ReadPCF8563(unsigned char Address)
{ //直接调用本函数即可从PCF8563的Address地址读出数据返回
unsigned char buf; //定义一个寄存器用来暂存读出的数据
EA=0;
IICstart(); //IIC启动信号
Write1Byte(0xA2); //发送PCF8563的器件地址和写信号
Write1Byte(Address); //发送地址
IICstart(); //IIC启动信号
Write1Byte(0xA3); //发送PCF8563的器件地址和读信号
buf=Read1Byte();//读一个字节数据
IICstop(); //产生IIC停止信号
EA=1;
return(buf); //将读出数据返回
}