| 
 
| 
 //TWI状态定义
 //MT 主方式传输  MR 主方式接收
 #define START       0x08
 #define RE_START     0x10
 #define MT_SLA_ACK     0x18
 #define MT_SLA_NOACK     0x20
 #define MT_DATA_ACK      0x28
 #define MT_DATA_NOACK     0x30
 #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))
 #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
 #define Wait()  {while(!(TWCR&(1<<TWINT)));}
 #define TestAck() (TWSR&0xf8)
 #define SetAck() (TWCR|=(1<<TWEA))
 #define SetNoAck() (TWCR&=~(1<<TWEA))
 #define Twi() (TWCR=(1<<TWINT)|(1<<TWEN))
 #define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
 
 #define rd_24c08_add 0xa1
 #define wr_24c08_add 0xa0
 
 uchar bai_wei,shi_wei,ge_wei,read_value;
 
 void ERROR()
 {
 read_value=TWSR&0XF8;
 bai_wei=read_value/100;
 shi_wei=read_value%100/10;
 ge_wei=read_value%10;
 LCD_write_com(0x80);
 LCD_write_data('E');
 LCD_write_data('r');
 LCD_write_data('r');
 LCD_write_data('o');
 LCD_write_data('r');
 LCD_write_data(bai_wei+0x30);
 LCD_write_data(shi_wei+0x30);
 LCD_write_data(ge_wei+0x30);
 
 while(1);
 }
 
 /************************************************/
 uchar i2c_Write_One_24c08(uchar Wdata,uchar RomAddress)
 {
 Start();//I2C启动
 Wait();
 if(TestAck()!=START) ERROR();//ACK
 
 
 
 Write8Bit(wr_24c08_add);//写I2C从器件地址和写方式
 Wait();
 if(TestAck()!=MT_SLA_ACK) ERROR();//ACK
 
 
 
 
 Write8Bit(RomAddress);//写24C08的ROM地址
 Wait();
 if(TestAck()!=MT_DATA_ACK) ERROR();//ACK
 
 
 Write8Bit(Wdata);//写数据到24C32的ROM
 Wait();
 if(TestAck()!=MT_DATA_ACK) ERROR();//ACK
 
 Stop();//I2C停止
 _delay_ms(10);//延时等EEPROM写完
 
 
 return 0;
 }
 
 
 
 /************************************************/
 uchar i2c_Read_One_24c08(uchar RomAddress)
 {
 uchar temp;
 
 Start();//I2C启动
 Wait();
 if (TestAck()!=START) return 0;//ACK
 
 Write8Bit(wr_24c08_add);//写I2C从器件地址和写方式
 Wait();
 if(TestAck()!=MT_SLA_ACK) return 0;//ACK
 
 Write8Bit(RomAddress);//写24c64的ROM高地址
 Wait();
 if(TestAck()!=MT_DATA_ACK) return 0;//ACK
 
 
 Start();//I2C重新启动
 Wait();
 if (TestAck()!=RE_START)  return 0;
 
 
 Write8Bit(rd_24c08_add);//写I2C从器件地址和读方式
 Wait();
 if(TestAck()!=MR_SLA_ACK)  return 0;//ACK
 
 
 Twi();//启动主I2C读方式
 Wait();
 if(TestAck()!=MR_DATA_NOACK) return 0;//ACK
 
 
 temp=TWDR;//读取I2C接收数据
 Stop();//I2C停止 释放总线
 
 return temp;
 }
 
 
 /************************************************
 *函数功能: I2C初始化
 /************************************************/
 void i2c_init(void)
 {
 TWBR=0X20;
 TWSR=00;
 TWCR=0X04;
 }
 
 
 void port_init(void)
 {
 PORTD = 0xFF;
 DDRD  = 0xFF;
 
 }
 
 int main(void)
 {
 
 uchar i;
 port_init();
 
 LCD_PORTinit();                            //系统初始化
 _delay_ms(100);                            //延时100ms
 LCD_init();                               //液晶参数初始化
 LCD_clear();
 
 
 
 i2c_init();                                //IIC初始化
 _delay_ms(5);
 
 i2c_Write_One_24c08(5,0x03);
 _delay_ms(10);                        //一定要延时
 
 
 DDRD  = 0x00;
 i = i2c_Read_One_24c08(0x03);/**/
 
 
 
 while(1)
 {
 LCD_write_char(1,1,i+0x30);
 }
 
 }
 
 
 
 
 
 | 
 |