⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m8-iic读写.c

📁 AVR例子程序和protues仿真
💻 C
字号:
 
 /************24c02读写******************************/
 #include <avr/io.h>
 #include "M8-IIC.h"
 #define w24c02_address 0xa0
 #define r24c02_address 0xa1
 /*****************************************************/
  void IIC_init()  //主机模式,高位先传输
  {
    DDRC=0x00;  //PC4 PC5输入,使能上拉电阻
    PORTC=0xff;	
  }

/**********************************************************/
   void IIC_START()
  {
   TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //TWINT中断标志位 置位时SCL低电平延长,TWSTA:START状态标志,发送START信号申请成为主机  TWEN TW使能位
 
  }	
     

  /**************************************************/
  void IIC_STOP()
  {
	   TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); //发送停止信号
  }			   
  /**************************************************/

  void IIC_WT_BYTE(unsigned char BYTE)		   
  { 
     TWDR=BYTE;
     TWCR=(1<<TWINT)|(1<<TWEN); 
  }	   
 /**************************************************/
  void AT24C_WRITE(unsigned char reg_addr,unsigned char BYTE)
  {

    IIC_START(); //发送起始信号并读取发送状态
    
    wait(); 
	if((TWSR&0xf8)!=START_OK) //检测状态与成功标志不符
    goto last ; //出错处理

	 else
     IIC_WT_BYTE(w24c02_address);
  
       wait(); 
	 if((TWSR&0xf8)!=W_ADDR_ACK) //检测状态与成功标志不符
     goto last ; //出错处理

     else
      IIC_WT_BYTE(reg_addr);

       wait(); 
	  if((TWSR&0xf8)!=W_DATA_ACK) //检测状态与成功标志不符
      goto last ; //出错处理

	  else
       IIC_WT_BYTE(BYTE);

        wait(); 
	   if((TWSR&0xf8)!=W_DATA_ACK) //检测状态与成功标志不符
       goto last ; //出错处理

        else
	 	  IIC_STOP(); 
		 
   last: 
         error();	
  }	
 /**************************************************/

  unsigned char AT24C_READ(unsigned char reg_addr)
  {
    unsigned char data;
	IIC_START(); //发送起始信号并读取发送状态
	  
    wait(); 
	if((TWSR&0xf8)!=START_OK) //检测状态与成功标志不符
    goto last ; //出错处理

	 else
     IIC_WT_BYTE(w24c02_address);

     wait(); 
	 if((TWSR&0xf8)!=W_ADDR_ACK) //检测状态与成功标志不符
     goto last ; //出错处理

     else
      IIC_WT_BYTE(reg_addr);

      wait(); 
	  if((TWSR&0xf8)!=W_DATA_ACK) //检测状态与成功标志不符
      goto last ; //出错处理

	  else
       IIC_START(); //发送起始信号并读取发送状态 

	    wait();  
	   if((TWSR&0xf8)!=START_REPEAT) //检测状态与成功标志不符
       goto last ; //出错处理

        else
         IIC_WT_BYTE(r24c02_address);
	      wait();  
	     if((TWSR&0xf8)!=R_ADDR_ACK) //检测状态与成功标志不符
         goto last ; //出错处理
         else
          TWCR=(1<<TWINT)|(1<<TWEN);
		   wait(); 
		  if((TWSR&0xf8)!=R_DATA_NACK) //检测状态与成功标志不符
          goto last ; //出错处理

		  data=TWDR;
          send_UART(data);

		  IIC_STOP(); 
		  return data;
   last: 
         error();	
  }	
 /**************************************************/
   void wait()
   {
    while(!(TWCR&(1<<TWINT))); 
    
   }

   void delayus(unsigned char i)
   {
     i=5;
	while(i--);
   }
  /**************************************************/
  void error()
  {
     // sendstr("write   error!! ");
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -