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

📄 at24c02.c

📁 记忆IC AT24C01 的序程, 已正常使用.
💻 C
字号:
/* 0xa0--AT24C01的I2C通信的设备地址 */
/* 功能: at24c01开始工作   CLOCK在高电平,DATA从高变低 参数: 无 */
void start_at24c01()
{ bc_at24c01_data=1;  
  bc_at24c01_clk=1;
  _nop_(); _nop_(); _nop_();
  bc_at24c01_data=0;
  _nop_(); _nop_(); _nop_();
  bc_at24c01_clk=0;
  _nop_();
}

/* 功能: at24c01 的结束工作   CLOCK在高电平,DATA从低变高   参数: 无 */
void stop_at24c01()
{ _nop_();	
  bc_at24c01_data=0;
  _nop_(); _nop_(); 
  bc_at24c01_clk=1;
  _nop_(); _nop_(); _nop_();
  bc_at24c01_data=1;
  _nop_();_nop_();_nop_();
  bc_at24c01_clk=0;  
}

/* 功能: 读at24c01的应答位    bc_at24c01_data 应被拉低,表示有应答
   参数: b_ack_at24c01_f 如果b_ack_at24c01_f=0表示有应答, b_ack_at24c01_f=1,表示没应答 */
void get_at24c01_ack()
{ bc_at24c01_clk=1; 
  bc_at24c01_data=1;              // get ack bit from ptat24c01,ack bit is save in 000h
  _nop_();  _nop_();  
  if(bc_at24c01_data==0) b_ack_at24c01_f=1;   /* 有应答 */
  if(bc_at24c01_data==1) b_ack_at24c01_f=0;   /* 有应答 */
  _nop_();
  bc_at24c01_clk=0; 
  _nop_();
}


/* 功能: 写一字节到at24c01 先送最高位, CLOCK低电平时,DATA允许变化; CLOCK高电平时,DATA需稳定
   参数: par_at24c01=一字节的发送数据  */
void send_a_byte_at24c01(uchar par_at24c01)
{
  uchar i;
  for(i=0;i<8;i++ )
    {
      bc_at24c01_clk=0;  
     _nop_(); _nop_();  
     if((par_at24c01&0x80)==0x80)
       { bc_at24c01_data=1; }
     else
       { bc_at24c01_data=0; }
      par_at24c01=par_at24c01<<1;
      _nop_();
     bc_at24c01_clk=1;
      _nop_(); _nop_(); _nop_();  _nop_(); _nop_(); _nop_();
    }
  bc_at24c01_clk=0; 
}


/*在指定的地址和指写页写一数据 参数有地址=par_24c02_add  数据=par_24c02_data  都为全程变量*/
void at24c_write(uchar par_at24c01_add, uchar par_at24c01_data) 
{
  start_at24c01();
  send_a_byte_at24c01(0xa0);                get_at24c01_ack(); 
  send_a_byte_at24c01(par_at24c01_add);     get_at24c01_ack();    /* 写入地址 */ 
  send_a_byte_at24c01(par_at24c01_data);    get_at24c01_ack();    /* 写入数据 */
  stop_at24c01();  
  delay(250);  /* 延时时间,不得小于delay(100) */
  delay(250);  /* 延时时间,不得小于delay(100) */
}

/*指定地址和指写页读一数据 参数有地址=par_24c02_add   数据=par_24c02_data  都为全程变量
  par_24C02在调入函数前是地址,调用函数后返回是所读到的数据 */
uchar at24c_read(uchar par_at24c01_add)
{
  uchar i,par_24c02_data;

  start_at24c01();
  send_a_byte_at24c01(0xa0);             
  get_at24c01_ack();  
  send_a_byte_at24c01(par_at24c01_add);  
  get_at24c01_ack();  

  start_at24c01();
  send_a_byte_at24c01(0xa1);              
  get_at24c01_ack(); 


  for(i=0;i<8;i++)               /* 读数据 */
   { bc_at24c01_clk=0;
     bc_at24c01_data=1;
     _nop_(); _nop_();
     if(bc_at24c01_data==1) par_24c02_data=(par_24c02_data|0x80);
     if(bc_at24c01_data==0) par_24c02_data=(par_24c02_data&0x7f);
     par_24c02_data=_crol_(par_24c02_data,1);
     bc_at24c01_clk=1; 
     _nop_(); _nop_();
    }
   bc_at24c01_clk=0;

  stop_at24c01();
  return par_24c02_data;
}

⌨️ 快捷键说明

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