#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define start 0x08
#define restart 0x10
//主机发送
#define mt_sla_ack 0x18
#define mt_sla_noack 0x20
#define mt_data_ack 0x28
#define mt_data_noack 0x30
//sla_wa已发送接收ack
//sla_wn已发送接收noack
//数据已发送ack
//数据已发送noack
//主机接收
#define mr_sla_ack 0x40
#define mr_sla_noack 0x48
#define mr_data_ack 0x50
#define mr_data_noack 0x58
//TWI操作宏定义
#define Start() (TWCR=((1<<TWINT) |(1<<TWSTA) |(1<<TWEN))) //发出start信号
#define Stop() (TWCR=(1<<TWINT) |(1<<TWEN) |(1<<TWSTO))
#define Wait() {while(!(TWCR &(1<<TWINT)));} //等待TWINT置位
#define Test() (TWSR & 0XF8) //检查TWI
#define Ack() (TWCR |=(1<<TWEA))
#define Noack() (TWCR |=~(1<<TWEA))
#define Write(x) {TWDR=(x);TWCR=(1<<TWINT) |(1<<TWEN);} //发送数据和地址
#define Twi() (TWCR=(1<<TWINT) |(1<<TWEN)) //启动IIC
void twi_init()
{
DDRB=0xff;
PORTB=0xff;//LED灯部分的初始化
TWBR=0X20;
TWCR=0X04; //TWIN=WRITE(1)
TWSR=0;
}
uchar iic_write(unsigned char add,unsigned char dat)
{
Start();
Wait();
if(Test()!=start)
return 1;
Write(0xa0);
Wait();
if(Test()!=mt_sla_ack)
return 1;
Write(add);
Wait();
if(Test()!=mt_data_ack)
return 1;
Write(dat);
Wait();
if(Test()!=mt_data_ack)
return 1;
Stop();
return 0;
}
uchar iic_read(unsigned char add)
{
unsigned char d;
Start();
Wait();
if(Test()!=start)
return 1;
Write(0xa0); //器件地址
Wait();
if(Test()!=mt_sla_ack)
return 1;
Write(add); //数据地址
Wait();
if(Test()!=mt_data_ack)
return 1;
Start();
Wait();
if(Test()!=restart)
return 1;
Write(0xa1);
Wait();
if(Test()!=mr_sla_ack)
return 1;
Twi();
Wait();
if(Test()!=mr_data_noack)
return 1;
d=TWDR;
Stop();
return d;
}
void main()
{
unsigned char id;
twi_init();
id=iic_read(0x1f);
id++;
id=id%10;
iic_write(0x1f,id);
PORTB=id;
}