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

📄 at24c64.c

📁 at24c64驱动 开发环境 iar 芯片 atmega169
💻 C
字号:
//IAR+24系列读写。支持24C01到24C512,直接粘贴即可以用。 



#include<iom169p.h> 
#include<ioavr.h> 
#include<comp_a90.h> 
#include<intrinsics.h>
//#include"oil_include.h" 


#define uchar unsigned char 
#define uint unsigned int 


#define SYSTEM_CLOCK 11059200  

#define _NOP_nop(i)    __delay_cycles(i)
#define _NOP_us(i)  __delay_cycles((i*(unsigned long long)SYSTEM_CLOCK)/1000000)
#define _NOP_ms(i)  __delay_cycles((i*(unsigned long long)SYSTEM_CLOCK)/1000)
#define _NOP_s(i)  __delay_cycles((i*(unsigned long long)SYSTEM_CLOCK)/1)

#define SET_BIT(sfr,bit) (sfr|=(1<<bit))     //置位
#define CLEAR_BIT(sfr,bit) (sfr&=~(1<<bit))  //清零
#define REVERSE_BIT(sfr,bit) (sfr^|=(1<<bit))//反向
#define VALUE_BIT(sfr,bit) ((sfr>>bit)&1)//取值

unsigned char iic_data[32] =
{
    0x00,0x80,0x00,0x80,0xFC,0x80,0x05,0xFE,0x85,0x04,0x4A,0x48,0x28,0x40,0x10,0x40,
    0x18,0x40,0x18,0x60,0x24,0xAf,0x24,0x90,0xff,0x18,0x86,0x0E,0x38,0x04,0x00,0xff
};
unsigned char iic_read_data[32];
volatile uchar temp_iic; 



#define SDA 6
#define SCL 7

#define DDRIIC DDRE
#define PORTIIC PORTE
#define PINIIC PINE

#define IIC_ADDRESS 0xA0

//设置IIC的延时时间 
void delay_iic(void) 
{ 
    _NOP_us(5);
} 

//IIC初始化SCL SDA均为输出 "1" 
void iic_init(void) 
{ 
  SET_BIT(PORTIIC,SCL); 
  SET_BIT(DDRIIC,SCL); 
  SET_BIT(PORTIIC,SCL); 

  SET_BIT(PORTIIC,SDA); 
  SET_BIT(DDRIIC,SDA); 
  SET_BIT(PORTIIC,SDA); 
} 


//IIC起始 
uchar iic_start(void) 
{ 
  SET_BIT(PORTIIC,SCL); 
  _NOP_us(5);
  SET_BIT(PORTIIC,SDA); 
  SET_BIT(DDRIIC,SDA); 
  CLEAR_BIT(PORTIIC,SDA); 
  _NOP_us(5);
  CLEAR_BIT(PORTIIC,SCL); 

    return(0); 
} 

//IIC结束 
uchar iic_stop(void) 
{ 
  SET_BIT(DDRIIC,SDA); 
  CLEAR_BIT(PORTIIC,SDA); 
  CLEAR_BIT(PORTIIC,SCL); 
  SET_BIT(PORTIIC,SCL); 
  _NOP_us(5);
  SET_BIT(PORTIIC,SDA); 
  _NOP_us(5);

    return(0); 
} 
 

//IIC写一个字节 
uchar iic_write_byte(uchar write_byte) 
{ 
  uchar i; 
  for(i=0;i<8;i++) 
  { 
    CLEAR_BIT(PORTIIC,SCL); 
    if(((write_byte<<i) & 0x80) == 0)CLEAR_BIT(PORTIIC,SDA); 
    else SET_BIT(PORTIIC,SDA); 
    SET_BIT(PORTIIC,SCL); 
  } 
  CLEAR_BIT(PORTIIC,SCL); 
  SET_BIT(PORTIIC,SDA); 
  CLEAR_BIT(DDRIIC,SDA); 
  SET_BIT(PORTIIC,SDA); 
  SET_BIT(PORTIIC,SCL); 
  _NOP_us(5);
  i=VALUE_BIT(PINIIC,SDA); 
  CLEAR_BIT(PORTIIC,SCL); 
  SET_BIT(DDRIIC,SDA); 
  return(i); 
} 

//IIC写N个字节 
uchar iic_write_nbyte(uint data_address,uchar write_nbyte) 
{ 
  uchar chip_address=IIC_ADDRESS; 
  uchar data_addressh,data_addressl; 
  uchar iic_dpr=0x00; 
  data_addressl=data_address; 
  data_addressh=data_address>>8; 
  iic_start(); 
  temp_iic=iic_write_byte(chip_address); 
  temp_iic=iic_write_byte(data_addressh); 
  temp_iic=iic_write_byte(data_addressl); 
  while(write_nbyte--) 
  { 
    temp_iic=iic_write_byte(iic_data[iic_dpr++]); 
  } 
  iic_stop(); 

    return(temp_iic); 
} 

//IIC读一个字节 
uchar iic_read_byte(void) 
{ 
  uchar i; 
  CLEAR_BIT(PORTIIC,SCL); 
  CLEAR_BIT(DDRIIC,SDA); 
  SET_BIT(PORTIIC,SDA); 
  temp_iic=0x00; 
  for(i=0;i<8;i++) 
  { 
    SET_BIT(PORTIIC,SCL); 
    if(VALUE_BIT(PINIIC,SDA)) 
    { 
      SET_BIT(temp_iic,(7-i)); 
    } 
    else 
    { 
      CLEAR_BIT(temp_iic,(7-i)); 
    } 
    CLEAR_BIT(PORTIIC,SCL); 
  } 
  SET_BIT(DDRIIC,SDA); 

    return(temp_iic); 
} 

//IIC读N个字节 
uchar iic_read_nbyte(uint data_address,uchar read_nbyte) 
{ 
  uchar chip_address=IIC_ADDRESS; 
  uchar data_addressh,data_addressl; 
  uchar iic_dpr=0x00; 
  data_addressl=data_address; 
  data_addressh=data_address>>8; 
  iic_start(); 
  temp_iic=iic_write_byte(chip_address); 
  temp_iic=iic_write_byte(data_addressh); 
  temp_iic=iic_write_byte(data_addressl); 
  iic_start(); 
  temp_iic=iic_write_byte(chip_address | 0x01); 
  while(read_nbyte--) 
  { 
    iic_read_data[iic_dpr++]=iic_read_byte(); 
    if(read_nbyte != 0x00) 
    { 
      CLEAR_BIT(PORTIIC,SDA); 
      _NOP_nop(4);
      SET_BIT(PORTIIC,SCL); 
    } 
  } 
  iic_stop(); 

    return(temp_iic); 
} 

//IIC写命令 
uchar iic_write_command(uchar write_byte) 
{ 
    return(0); 
} 


void USART_Init( unsigned int baud )
{
    /* 设置波特率*/
    UBRR0H=(unsigned char)((0x0fff&(SYSTEM_CLOCK/(16*(unsigned long)baud)-1))>>8);
    UBRR0L=(unsigned char)(0x0fff&(SYSTEM_CLOCK/(16*(unsigned long)baud)-1));

    /* 接收器与发送器使能*/
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    /* 设置帧格式: 异步  无校验  8 个数据位, 1 个停止位*/
    UCSR0C = (0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);    
}

void USART_Transmit( unsigned char data )
{
    /* W 等待发送缓冲器为空 */
    while ( !( UCSR0A & (1<<UDRE0)) )
    ;
    /* 将数据放入缓冲器,发送数据 */
    UDR0 = data;
}





void main()
{
  
  USART_Init(9600);
  iic_init();
  

  iic_write_nbyte(0,32);   
  _NOP_s(1);
  iic_read_nbyte(0,32); 
    
    
  for(unsigned char i=0; i<32; ++i)
    USART_Transmit(iic_read_data[i]);
  
  while(1);

  
}

⌨️ 快捷键说明

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