51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机源码 > 详细内容
24C64子程序(C语言)
发布时间:2009/6/4  阅读次数:773  字体大小: 【】 【】【
/*24C64子程序 */
bit     I2C_Start(void);
void   I2C_Stop(void);
void   I2C_Ack(void);
void   I2C_Nack(void);
bit     I2C_Send_Byte( uchar);
uchar I2C_Receive_Byte(void);
void   AT24C64_R(void *mcu_address,uint AT24C64_address,uint count);
void   AT24C64_W(void *mcu_address,uint AT24C64_address,uint count);
void   Delay_10_uS(void)
{
  char i=10;
  while(i--);
}
void Delay_N_mS( uint n_milisecond)   /* n mS delay */
{
  uchar i;
  while(n_milisecond--)
  {
   i=37;
   while(i--);
  }
}
bit I2C_Start(void)
{
  Delay_10_uS();
  I2C_SDA =1;
  Delay_10_uS();
  I2C_SCK =1;
  Delay_10_uS();
  if ( I2C_SDA == 0) return 0;
  if ( I2C_SCK == 0) return 0;
  I2C_SDA = 0;
  Delay_10_uS();
  I2C_SCK = 0;
  Delay_10_uS();
  return 1;
}
void   I2C_Stop(void)
{
  Delay_10_uS();
  I2C_SDA = 0;
  Delay_10_uS();
  I2C_SCK = 1;
  Delay_10_uS();
  I2C_SDA = 1;
  Delay_10_uS();
}
void I2C_Ack(void)
{
  Delay_10_uS();
  I2C_SDA=0;
  Delay_10_uS();
  I2C_SCK=1;
  Delay_10_uS();
  I2C_SCK=0;
  Delay_10_uS();
}
void I2C_Nack(void)
{
  Delay_10_uS();
  I2C_SDA=1;
  Delay_10_uS();
  I2C_SCK=1;
  Delay_10_uS();
  I2C_SCK=0;
  Delay_10_uS();
}
bit I2C_Send_Byte( uchar d)
{
  uchar i = 8;
  bit bit_ack;
  while( i-- )
  {
   Delay_10_uS();
   if ( d &0x80 )     I2C_SDA =1;
   else                         I2C_SDA =0;
   Delay_10_uS();
   I2C_SCK = 1;
   Delay_10_uS();
   I2C_SCK = 0;
   d = d << 1;
  }
  Delay_10_uS();
  I2C_SDA = 1;
  Delay_10_uS();
  I2C_SCK = 1;
  Delay_10_uS();
  bit_ack = I2C_SDA;
  I2C_SCK =0;
  Delay_10_uS();
  return bit_ack;
}
uchar I2C_Receive_Byte(void)
{
  uchar i = 8, d;
  Delay_10_uS();
  I2C_SDA = 1;
  while ( i--)
  {
   d = d << 1;
   Delay_10_uS();
   I2C_SCK =1;
   if ( I2C_SDA ) d++;
   Delay_10_uS();
   I2C_SCK =0;
  }
  return d;
}
void AT24C64_W(void *mcu_address,uint AT24C64_address,uint count)
{
  DOG_WDI=!DOG_WDI;
  DOGTIME=0;
  while(count--)
  {
   I2C_Start();
   /*I2C_Send_Byte( 0xa0 + AT24C64_address /256 *2);*/   /* 24C16   USE */
   I2C_Send_Byte( 0xa0 );
   I2C_Send_Byte(   AT24C64_address/256 );
   I2C_Send_Byte( AT24C64_address %256 );
   I2C_Send_Byte( *(uchar*)mcu_address );
   I2C_Stop();
   Delay_N_mS(10);             /* waiting for write cycle to be completed */
   ((uchar*)mcu_address)++;
   AT24C64_address++;
  }
}
void AT24C64_R(void *mcu_address,uint AT24C64_address,uint count)
{
  DOG_WDI=!DOG_WDI;
  DOGTIME=0;
  while(count--)
  {
   I2C_Start();
   /*I2C_Send_Byte( 0xa0 + AT24C64_address / 256 *2 );*/     /* 24C16 USE */
   I2C_Send_Byte( 0xa0 );
   I2C_Send_Byte( AT24C64_address/256 );
   I2C_Send_Byte( AT24C64_address % 256 );
   I2C_Start();
   /*I2C_Send_Byte( 0xa1 + AT24C64_address /256 *2 );*/
   I2C_Send_Byte( 0xa1 );
   *(uchar*)mcu_address = I2C_Receive_Byte();
   I2C_Nack();
   I2C_Stop();
   ((uchar*)mcu_address)++;
   AT24C64_address++;
  }
}
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号