金牌会员
- 积分
- 1291
- 威望
- 595
- 贡献
- 390
- 兑换币
- 195
- 注册时间
- 2012-11-15
- 在线时间
- 153 小时
- 毕业学校
- 德州学院
|
void iic_delay() //5us延时
{
_asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop);
_asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop);
_asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop);
}
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=124;j>0;j--);
}
/*********************************************************************/
/************** I2C通信部分 ***************/
/*********************************************************************/
void iic_start() //函数功能:I2C通信开始
{
scl_dir = 1;
sda_dir = 1;
sda=1;
iic_delay();
scl=1;
iic_delay();
sda=0;
iic_delay();
}
void iic_stop() //函数功能:I2C通信停止
{
scl_dir = 1;
sda_dir = 1;
sda=0;
iic_delay();
scl=1;
iic_delay();
sda=1;
iic_delay();
scl_dir = 0;
sda_dir = 0;
}
void iic_ack() //函数功能:I2C通信查应答位
{
char i=0;
scl_dir = 1;
sda_dir = 0;
scl = 0;
iic_delay();
iic_delay();
scl = 1;
iic_delay();
// if(sda == 1)
// {
// for(;;);
// }
while((sda==1)&&(i<250))i++;
iic_delay();
scl = 0;
iic_delay();
iic_delay();
}
void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节
{
uchar i,temp,temp1;
scl_dir = 1;
sda_dir = 1;
temp1=wdata;
for(i=0;i<8;i++)
{
scl = 0;
iic_delay();
temp=temp1;
temp=temp&0x80;
if(temp==0x80)
sda=1;
else
sda=0;
iic_delay();
scl=1;
iic_delay();
scl=0;
iic_delay();
temp1=temp1<<1;
}
sda_dir = 0;
}
char iic_read_byte(void) //函数功能:从I2C从机中读出一个字节
{
uchar op;
char data_data;
scl_dir = 1;
sda_dir = 0;
for(op=0;op<8;op++)
{
data_data=data_data<<1;
sda=1;
iic_delay();
scl=0;
iic_delay();
scl=1;
iic_delay();
if(sda==1)
data_data|=0x01;
}
return data_data;
}
void iic_write(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据
{
uchar t;
t=(IIC_WRITE<<1);
iic_start();
iic_write_byte(t);
iic_ack();
iic_write_byte(byte_add);
iic_ack();
iic_write_byte(wdata);
iic_ack();
iic_stop();
}
char iic_read(uchar byte_add) //函数功能:按地址读出一字节数据
{
uchar t;
char m;
t=(IIC_WRITE<<1);
iic_start();
iic_write_byte(t);
iic_ack();
iic_write_byte(byte_add);
iic_ack();
t=((IIC_READ<<1)|0x01);
iic_start();
iic_write_byte(t);
iic_ack();
m=iic_read_byte();
//iic_ack();
iic_stop();
return m;
} |
|