打印

新人报到 附上在学校时学的I2C

[复制链接]
1516|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lincoln1000|  楼主 | 2010-7-6 20:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg51.h"
#include <intrins.h>
sbit SCL=P2^0;
sbit SDA=P2^1;

#define uchar unsigned char
/********************************************************************
Function Name   :   void DelayFun(int para)
Purpose         :   delay  
Input Parameter :   ms
                    
Return          :   
Remark          :   
***********************************************************************/
void DelayFun(int para)
{
int loop;
for (loop = 0;loop < para; loop++)
  _nop_();
}
/********************************************************************
Function Name   :   void StartFun(void)
Purpose         :   start signal   
Input Parameter :   
                    
Return          :   
Remark          :   
***********************************************************************/
void StartFun(void)
{
SDA = 1;
DelayFun(1);
SCL = 1;
DelayFun(5);
SDA = 0;
DelayFun(5);
SCL = 0;
}

/********************************************************************
Function Name   :   void EndFun(void)
Purpose         :   end signal   
Input Parameter :   
                    
Return          :   
Remark          :   
***********************************************************************/
void EndFun(void)
{
SDA = 0;
DelayFun(1);
SCL = 1;
DelayFun(5);
SDA = 1;
DelayFun(5);
SCL = 0;
}
/********************************************************************
Function Name   :   void WriteoneByteFun(unsigned char dat)
Purpose         :   Write one byte   
Input Parameter :   write data
                    
Return          :   
Remark          :   
***********************************************************************/
void WriteoneByteFun(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
  SDA=1;
   if((dat&0x80)==0x00)
    SDA=0;
  DelayFun(1);
  SCL=1;
  DelayFun(5);
  SCL=0;
  DelayFun(1);
  dat=dat<<1;
  }
  SDA=1;
  SCL=1;
  DelayFun(5);
  SCL=0;
  DelayFun(5);
}
/********************************************************************
Function Name   :   uchar ReadoneByteFun(uchar ack)
Purpose         :   Read one byte   
Input Parameter :   应答信号
                    
Return          :   read data
Remark          :   
***********************************************************************/
uchar ReadoneByteFun(uchar ack)
{
  char i,dat;
dat=0x00;
  SDA=1;
  DelayFun(1);
for(i=0;i<8;i++)
  {
    SCL=1;
    dat=dat<<1;
    if(SDA)
   dat|=0x01;
    SCL=0;
  DelayFun(5);
  }
  if(ack)
  SDA=0;
  SCL=1;
DelayFun(5);
  SCL=0;
DelayFun(5);
  return dat;
}
/********************************************************************
Function Name   :  void Write_24c04Fun(uchar Data[],uchar Address,uchar Num)
Purpose         :   write 24c04   
Input Parameter :   data,addr to write,write num
                    
Return          :   none
Remark          :   
***********************************************************************/
void Write_24c04Fun(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
  StartFun();
  WriteoneByteFun(0xa0);
  WriteoneByteFun(Address+i);
  WriteoneByteFun(*(PData+i));
  EndFun();
  DelayFun(20);
}
}
/********************************************************************
Function Name   :  void Read_24c04Fun(uchar Data[],uchar Address,uchar Num)
Purpose         :   read 24c04   
Input Parameter :   store addr,read addr,read num
                    
Return          :   none
Remark          :   
***********************************************************************/
void Read_24c04Fun(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
  StartFun();
  WriteoneByteFun(0xa0);
  WriteoneByteFun(Address+i);
  StartFun();
  WriteoneByteFun(0xa1);
  *(PData+i)=ReadoneByteFun(0);
  DelayFun(20);
  EndFun();
}
}

相关帖子

沙发
hotpower| | 2010-7-7 07:16 | 只看该作者
很好,如中断方式又如何编写?

使用特权

评论回复
板凳
tangyue2008| | 2010-7-7 08:49 | 只看该作者
没看懂

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

61

帖子

1

粉丝