原创 I2C+1602

2007-11-21 09:49 3216 0 1 分类: MCU/ 嵌入式

         刚开blog不久,充实下,发个I2C(24c64)+1602的程序,供大家参考,请多多指教pdf


rar


部分如下:


//调试用
const char error[]={"ERROR writeACK  "};
const char error2[]={"ERROR  readACK  "};
const char error3[]={" ERROR readACK3 "};
void delay_I2C()
   {
     int x;
  x++;
  x++;
   }



void I2C_send_start()
   {
     SCL="1";
  SDA="1";
  delay_I2C();
  SDA="0";
  delay_I2C();         //generate start condition
  SCL="0";          //generate clock pules
   }



void I2C_send_stop()
   {
      SCL="0";
   SDA="0";
   delay_I2C();
   SCL="1";         //generate stop condition
    delay_I2C();
   SDA="1";
   }



bit I2C_get_ACK_from_slave()
   {
     SCL="1";
  SDA="1";
 delay_I2C();
 if(SDA)
    {SCL=0;return 1;}
    SCL=0;
 return 0;        //OK!
   }



bit I2C_write_byte(char Data)
   {
      char Bit="0";
      for(Bit=0;Bit<8;Bit++)
     {
     SDA=(bit)((Data&0x80)>>7);


     SCL="1";
     delay_I2C();
     SCL="0";
     Data<<=1;
  }
      if(I2C_get_ACK_from_slave())
     {
    return 1;
  }
      return 0;
   }



char I2C_read_byte()
   {
      char Bit="0";
   char result="0";
      for(Bit=0;Bit<8;Bit++)
    {
      SCL="1";
   SDA="1";
   delay_I2C();
   result<<=1;
   if(SDA)
   {result|=0x01;}
      SCL="0";
   delay_I2C();//1.2us
     }
   return (result); 
   }



void I2C_master_ACK()
   {
     SDA="0";
  SCL="1";
  delay_I2C();
  SCL="0"; 
   }



void I2C_master_NACK()
   {
    SDA="1";
  SCL="1";
  delay_I2C();
  SCL="0";
   }


void I2C_write_byte_at24c64(const int address,const char content)
   {
     char MSbyte;
  char LSbyte ;


     I2C_send_start();
     if(I2C_write_byte(0xA0))
     {
   delay(50);
   write_string_LCD(0,error);//调试用,下同。可删除
   return ;
  }


      MSbyte=(address>>8)&0x00FF;
   LSbyte="address"&0x00FF;


   if(I2C_write_byte(MSbyte))
     {
   delay(50);
   write_string_LCD(0,error);
   return ;
  }
  
      if(I2C_write_byte(LSbyte))
     {
   delay(50);
   write_string_LCD(0,error);
   return ;
  }
      if(I2C_write_byte(content))
     {
   delay(50);
   write_string_LCD(0,error);
   return ;
  }
       I2C_send_stop();
   }



char I2C_read_byte_at24c64(const int address)
   {
     char MSbyte;
  char LSbyte;
  char result;


     I2C_send_start();
     if(I2C_write_byte(0xA0))
     {
    delay(50);
   write_string_LCD(1,error3);
   return 0;
  }
     MSbyte=((address&0xFF00)>>8);
  LSbyte="address"&0x00FF;


   if(I2C_write_byte(MSbyte))
     {
   delay(50);
   write_string_LCD(1,error2);
   return 0;
  }
      if(I2C_write_byte(LSbyte))
     {
   delay(50);
   write_string_LCD(1,error2);
   return 0;
  }
  
   I2C_send_start();
      if(I2C_write_byte(0xA1))
     {
    delay(50);
   write_string_LCD(1,error2);
   return 0;
  }
    result="I2C"_read_byte();
       I2C_master_NACK();
       I2C_send_stop();
    return (result);
   }

文章评论1条评论)

登录后参与讨论

用户377235 2013-6-6 20:36

能不能告诉我 接线怎么接 sda scl 还有led1602的接口 跪谢了729572773@qq.com

eleclike 2007-10-16 18:36

谢谢你们的捧场
相关推荐阅读
用户1450073 2007-11-27 11:06
PS做128*64LCD显示图片
         成功地利用PS或Windows画图工具制作出了适合128*64LCD显示的图片,(点击清晰)代码:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x...
用户1450073 2007-11-21 22:54
武功与学习
       记得金庸的《天龙八部》里曾有这么一个情节,是关于大名鼎鼎的“南慕容,北乔峰”各自的父亲偷学少林寺武功的。乔峰之父萧远山,和慕容复之父慕容博两人均潜入少林寺四十余年,苦学少林绝技,虽然身怀...
用户1450073 2007-11-20 22:15
学习C语言
      而家系度学紧128*64LCD既驱动,好多人系编写硬件驱动个阵,都中意抄人地的程序,硬件驱动有阵下真系唔难,但就系麻烦,于是系哩度抄D,个度抄D。再拼起来就系下面标上***********...
我要评论
1
0
关闭 站长推荐上一条 /2 下一条