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

📄 ac15-3.c

📁 AVR的MEGA16通过TWI接口读写AT24C02
💻 C
字号:
#include <iom8v.h>			
#include <macros.h>
//-----------------------------------------------
#define uchar unsigned char	
#define uint unsigned int

//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


#define rd_device_add 0xa1
#define wr_device_add 0xa0

#define DS12_CONTROL_PORT        PORTB 
#define CS                       PB3 
#define CS_ON()   ( DS12_CONTROL_PORT &= ~(1<<CS) ) 
#define CS_OFF()  ( DS12_CONTROL_PORT |=  (1<<CS) )

//常用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 xtal 8   			

flash unsigned char dis_7[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; 
flash unsigned char position[]={0x10,0x20};
unsigned char dis_buff[2]={0,0},posit;

//========函数声明=========

void port_init(void);
void delay_ms(unsigned int time);
void delay_us(int time);
//=======================

void Delay_2us()
{
	NOP();NOP();NOP();
}

void _delay_us(unsigned int xus)
{
	 while (xus--)
       	Delay_2us();
}

void delay_ms(unsigned int  xms) //crystal=8MHz
{
	unsigned int i,j; //variable:declare Word
	for(i=0; i<xms; i++)
		for(j=0; j<498;j++)
		{
			NOP();NOP();NOP();NOP();
			NOP();NOP();NOP();NOP();NOP();		
			
		}
}

void display(unsigned char adc1) // 2 位LED 数码管动态扫描函数
{
   dis_buff[1]=adc1 /10;

    dis_buff[0]=adc1 %10;
  
  //PORTB = 0x00;
  for(posit=0; posit<2;posit++)
  {
   
   PORTD = dis_7[dis_buff[posit]];
   PORTB = position[posit];
   
  _delay_us(100);
   //PORTB &= ~position[posit];
  
  }
}

/********************端口初始化******************/
void port_init(void)
{
 //PORTA = 0x00;
 //DDRA  = 0xFF;
// PORTB = 0x00;
 DDRB  = 0xFF;
// PORTC = 0x00; 
 DDRC  = 0x30;
// PORTD = 0xFF;
 DDRD  = 0xFF;
}


/******************************************
               I2C总线读一个字节
			   如果读失败返回0
*******************************************/
unsigned char i2c_Read(unsigned char RomAddress) 
      {
	   unsigned char temp;
	   Start();
	   Wait();
	   if (TestAck()!=START) return 0;	   
	   Write8Bit(wr_device_add);
	   Wait(); 
	   if (TestAck()!=MT_SLA_ACK) return 0;
	   Write8Bit(RomAddress);
	   Wait();
	   if (TestAck()!=MT_DATA_ACK) return 0;
	   Start();
	   Wait();
	   if (TestAck()!=RE_START)  return 0;
	   Write8Bit(rd_device_add);
	   Wait();
	   if(TestAck()!=MR_SLA_ACK)  return 0;
	   Twi();
	   Wait();
	   if(TestAck()!=MR_DATA_NOACK) return 0;	
	   temp=TWDR;
       Stop();
	   return temp;
      }
	  
/******************************************
               I2C总线写一个字节
			    返回0:写成功
				返回非0:写失败
*******************************************/
unsigned char i2c_Write(unsigned char RomAddress,unsigned char Wdata) 
{
	  Start();
	  Wait();
	  if(TestAck()!=START) return 1;
	  Write8Bit(wr_device_add);
	  Wait();
	  if(TestAck()!=MT_SLA_ACK) return 1;
	  Write8Bit(RomAddress);
	  Wait();
	  if(TestAck()!=MT_DATA_ACK) return 1;
	  Write8Bit(Wdata);
	  Wait();
	  if(TestAck()!=MT_DATA_ACK) return 1;	
	  Stop();
 	  delay_ms(10);
	  return 0;
}


void twi_init(void)
{
 	  TWCR= 0X00; //disable twi 
    TWBR= 0x12; //set bit rate 
    TWSR= 0x01; //set prescale 
    TWCR= 0x04; //enable twi 



}
//******************************************
void main(void)				
{
 	uchar key_val,wr_val=0,rd_val,i,j;	
	uint k;
	port_init();
	CS_OFF();
    delay_ms(10);			
	delay_ms(10);
	//twi_init();
		while(1)              
		{
	   	   	rd_val=12;	
	   		 
			//for(i=1; i<255;i++)
			//{
			// i2c_Write(i,i);
			//  _delay_us(20);
	   		  
			  //adc_to_disbuffer1(16);	
	   		 	
			 // 
			//}
			for( j=1; j<255;j++)
			{
			  for( k=1; k<1025;k++)
			  {
			   rd_val=i2c_Read(j); 
			   display(rd_val); 
			   //delay_ms(1);
			    // _delay_us(5);
			  }
			}
  		 }				
	
}
		   

⌨️ 快捷键说明

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