底层驱动
#define DELAY_TIME 11
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
/*void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}*/
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
somenop
SDA = 0;
somenop
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
somenop
SDA = 1;
somenop
}
//发送应答
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit; // 0:应答,1:非应答
somenop
SCL = 1;
somenop
SCL = 0;
SDA = 1;
somenop
}
//等待应答
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
somenop
ackbit = SDA;
SCL = 0;
somenop
return ackbit;
}
//通过I2C总线发送数据
void IIC_WriteByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
somenop
if(byt & 0x80) SDA = 1;
else SDA = 0;
somenop
SCL = 1;
byt <<= 1;
somenop
}
SCL = 0;
}
//从I2C总线上接收数据
u8 IIC_ReadByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
somenop
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
somenop
}
return da;
}
u8 AD_Get(u8 add)
{
u8 dat;
IIC_Start();
IIC_WriteByte(0x90);
IIC_WaitAck();
IIC_WriteByte(add);//通道add|0x40,0x40是允许DA模拟输出
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_WriteByte(0x91);
IIC_WaitAck();
dat = IIC_ReadByte();
IIC_Stop();
return dat;
}
void set