while(!(twcr&_bv(twint)))等待twint置位,twint置位表示开始信号发送完毕。
dog=1;
if(((twsr&0xf8)!=0x08)&(twsr&0xf8)!=0x10))/检查状态寄存器,如果状态字不是start或restart,重新发送开始信号。
goto begin;
twdr=0xa0;//将器件地址写入到twdr寄存器,twint位清零,启动发送地址。
// twdr="0xa0
twcr=_bv(twen)|_bv(twint);
while(!(twcr&_bv(twint)))等待twint置位,twint置位表示总线命令sla+w已发出,及收到应答信号ack/nack
dog=1;
if((twsr&0xf8)!=0x18)//检查twi状态寄存器,如果状态字不是地址ack,重新发送开始信号。
goto begin;
/--发送寄存器地址。
twdr=address_reg1;//写寄存器地址。
/twdr=address_reg1
twcr=_bv(twen)|_bv(twint);
while(!(twcr&_bv(twint)))等待twint置位,twint置位表示总线命令sla+w已发出,及收到应答信号ack/nack
dog=1;
if((twsr&0xf8)!=0x28)//检查twi状态寄存器,如果状态字不是地址ack,重新发送开始信号。
goto begin;
//-发送eeprom的第二个地址。
twdr=address_reg2;//写寄存器地址。
/twdr=address_reg2
twcr=_bv(twen)|_bv(twint);
while(!(twcr&_bv(twint)))等待twint置位,twint置位表示总线命令sla+w已发出,及收到应答信号ack/nack
dog=1;
if((twsr&0xf8)!=0x28)//检查twi状态寄存器,如果状态字不是地址ack,重新发送开始信号。
goto begin;
//-写入数据。
twdr=data_package;//将数据载入到twdr寄存器,twint位清零,启动发送地址。
/twdr=data_package
twcr=_bv(twint)|_bv(twen);
while(!(twcr&_bv(twint)))等待twint置位,twint置位表示总线数据已发出,及收到应答信号ack/nack
dog=1;
if((twsr&0xf8)!=0x28)//检查twi状态寄存器,如果状态字不是数据ack,重新发送开始信号。
goto begin;
twcr=_bv(twint)|_bv(twsto)|_bv(twen);/发送stop信号。
/delay_ms(2,8);
/delay_ms(2,8);
/sei();
/delay_ms(2,8);
/portc&=~1<<6);
/iic读操作。
/address_reg1为寄存器地址,address_reg2为寄存器地址2
uchar twi_read(uchar address_reg1,uchar address_reg2)
uchar result1=0;
sbi(twsr,twps0);/twi预分频为4分频。
cbi(twsr,twps1);
twbr=0x20;//scl频率92160hz
begin:
/delay_ms(2,8);
dog=1;
twcr=(1 if(((twsr&0xf8)!=0x08)&(twsr&0xf8)!=0x10))/检查twi状态寄存器,如果状态字不是start或restart,重新发送开始信号。 goto begin; /--发送器件地址。 twdr=0xa0;//发器件写地址,twint位清零,启动发送。 twcr=(1 if((twsr&0xf8)!=0x18)//检查twi状态寄存器,如果状态字不是地址ack,重新发送开始信号。 goto begin; /--发送寄存器地址。 twdr=address_reg1;//写寄存器地址,twint位清零,启动发送。 twcr=(1 if((twsr&0xf8)!=0x28)//检查twi状态寄存器,如果状态字不是数据ack,重新发送开始信号。 goto begin; /--发送eeprom的第二个地址。 twdr=address_reg2;//写寄存器地址。 /twdr=address_reg2 twcr=_bv(twen)|_bv(twint); while(!(twcr&_bv(twint)))等待twint置位,twint置位表示总线命令sla+w已发出,及收到应答信号ack/nack dog=1; if((twsr&0xf8)!=0x28)//检查twi状态寄存器,如果状态字不是地址ack,重新发送开始信号。 goto begin; /--发送起始信号。 twcr=(1 if(((twsr&0xf8)!=0x08)&(twsr&0xf8)!=0x10))/检查twi状态寄存器,如果状态字不是start或restart,重新发送开始信号。 goto begin; /--发送读命令。 twdr=0xa0+1;//读器件地址写入到twdr寄存器,twint位清零,启动发送。 twcr=(1 if((twsr&0xf8)!=0x40)//检查twi状态寄存器,如果状态字不是地址ack,重新发送开始信号。 goto begin; twcr=(1 if((twsr&0xf8)!=0x58) goto begin; twcr=(1 /delay_ms(2,8); /delay_ms(2,8); /delay_ms(2,8); return result1; void setpa(uchar b,uchar v) if(v==0) porta&=~1< else if(v==1) porta|=(1<} void setpb(uchar b,uchar v) if(v==0) portb&=~1< else if(v==1) portb|=(1<} void setpc(uchar b,uchar v) if(v==0) portc&=~1< else if(v==1) portc|=(1<} void setpd(uchar b,uchar v) if(v==0) portd&=~1< else if(v==1) portd|=(1<} void setpe(uchar b,uchar v) if(v==0) porte&=~1< else if(v==1) porte|=(1<} void setpf(uchar b,uchar v) if(v==0) portf&=~1< else if(v==1) portf|=(1<} void setpg(uchar b,uchar v) if(v==0) portg&=~1< else if(v==1) portg|=(1<}