void Delay5us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 11;
while (--i);
}
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
//起始条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
Delay5us();
SDA = 0;
Delay5us();
SCL = 0;
}
//停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
Delay5us();
SDA = 1;
}
//应答
void IIC_Ack(unsigned char ackbit)
{
if(ackbit)
{
SDA = 0;
}
else
{
SDA = 1;
}
Delay5us();
SCL = 1;
Delay5us();
SCL = 0;
SDA = 1;
Delay5us();
}
//等待应答
bit IIC_WaitAck(void)
{
SDA = 1;
Delay5us();
SCL = 1;
Delay5us();
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
//向IIC发送一个字节
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byt&0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
Delay5us();
SCL = 1;
byt <<= 1;
Delay5us();
SCL = 0;
}
}
//从IIC接收一个字节
unsigned char IIC_RecByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++)
{
SCL = 1;
Delay5us();
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
Delay5us();
}
return da;
}
/*PCF8591初始化 */
void Pcf8591Init(unsigned char channel)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(channel);
IIC_WaitAck();
IIC_Stop();
Delay10ms();
}
/*PCF8591读取数据 */
unsigned Pcf8591Reard(void)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_Ack(0);
IIC_Stop();
return temp;
}
/*向AT24C02写数据 */
void Write_AT24C02(unsigned char add,unsigned char date)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(date);
IIC_WaitAck();
IIC_Stop();
Delay10ms();
}
/*从AT24C02读数据*/
unsigned char Read_AT24C02(unsigned char add)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_Ack(0);
IIC_Stop();
return temp;
}
版权声明:本文为hjy0304原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。