void Start(void)
{
SDA=1;
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
}
void Stop(void)
{
SDA=0;
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
}
void Ack(void)
{
SDA=0;
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
SDA=1;
}
void NoAck(void)
{
SDA=1;
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
SDA=0;
}
void SendByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
SDA=(bit)(dat&0x80);
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
dat<<=1;
}
}
uchar RcvByte(void)
{
uchar i,dat=0;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
dat<<=1;
if(SDA==1)dat|=0x01;
SCL=0;
}
return dat;
}
void PCF8591_DAC(uchar dat)
{
Start();
SendByte(0x90);
Ack();
SendByte(0x40);
Ack();
SendByte(dat);
Ack();
Stop();
}
uchar PCF8591_ADC(uchar ch)
{
uchar dat;
Start();
SendByte(0x90);
Ack();
SendByte(0x40|ch);
Ack();
Start();
SendByte(0x91);
Ack();
dat=RcvByte();
NoAck();
Stop();
return dat;
}
|