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

[复制链接]
2666|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

粉丝
快速回复 在线客服 返回列表 返回顶部