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

📄 i2c.c

📁 基于ADE7166/7169的单相表程序
💻 C
字号:
/*************读写EEPROM卡**********************/
/*************I2c读写**********************/
//#define DELAY_5us	asm("NOP");asm("NOP");asm("NOP");
__idata uchar IC_data;
#define	SDA P2_bit.P21
#define SCL P2_bit.P22


//#define I2C_INPUT	1		/* data direction input */
//#define I2C_OUTPUT	0		/* data direction output */
//sbit    ICout=IC_data^7;
//sbit    ICin=IC_data^0;
/*******pcf8563*********/
	/**  移位字节 **/
//sbit    ICout1=IC1_data^7;
//sbit    ICin1=IC1_data^0;

/************************************************
** 函数原型: void IC_init(void);               **
** 功    能: IC总线初始化.在main()函数中应首先 **
**           调用本函数,然后再调用其它函数.    **
************************************************/
//void IC_init(void)
//{
// SCL=1;SCL=1;
// SDA=1;SDA=1;
// WP=1;
//}

/************************************
** 函数原型: void IC_start(void);  **
** 功    能: IC总线起始位.         **
************************************/
void IC_start()
{

 SCL=1;                                 /** Send Start **/
 SDA=1;

 //DELAY_5us;
 SDA=0;


// DELAY_5us;
 SCL=0;

}

/**********************************
** 函数原型: void IC_stop(void); **
** 功    能: IC总线停止位.       **
**********************************/
void 
IC_stop()
{
 SCL=0;                                 /** Send Stop **/
 SDA=0;

// DELAY_5us;
 SCL=1;

 //DELAY_5us;
 SDA=1;
 //
}

/***************************************************
** 函数原型: bit IC_writebyte(uchar wdata);       **
** 功    能: 向IC总线发送8位数据,并请求一个应答信 **
**           号ACK.如果收到ACK应答则返回1(TRUE),  **
**           否则返回0(FALSE).                    **
***************************************************/
unsigned char IC_WriteByte( uchar wdata)
{
 uchar i;

 for(i=0;i<8;i++){
     
     SCL=0;
     if(wdata&0x80) SDA=1;
     else SDA=0;
//     SDA=ICout;
//     SDA=ICout;
	
     SCL=1;
     wdata<<=1;
 }
 
 SCL=0;

 SCL=1;
 
  i=0;
  while(SDA){
   if(++i>12)
   {
     SCL=0;
     ei();
     return(0);
   }
 }
 SCL=0;
// EA=1;
 return(1);
}

/***********************************************
** 函数原型: uchar IC_readbyte(void);         **
** 功    能: 从IC总线上接收8位数据,并将接受到 **
**           8位数据作为一个字节返回,不回送应 **
**           答信号ACK.                       **
***********************************************/
uchar IC_ReadByte(void)
{
 uchar i;
IC_data=0;
// EA=0;
 SCL=0;

 SDA=1;
 
 for(i=0;i<8;i++){
  //   SDA=1;
    SDA=1;
     
     SCL=1;
     IC_data<<=1;
     IC_data|=SDA;
     SCL=1;
     SCL=0;
 }
 SCL=0;
// EA=1;
 return(IC_data);
}

/***************************************************************
** 函数原型: bit readEEone(uchar instr,uchar addr,uchar num); **
** 功    能: 从S42WD42中读取num个字节的数据,采用序列读操作方  **
**           式从片内Address地址开始连续读取数据.S42WD42不接  **
**           受指定的地址则返回0(FALSE).                      **
***************************************************************/
unsigned char readEEone24(uchar instr,uchar addr,uchar num)
{
 uchar i;
 di();
 IC_start();
 if(!IC_WriteByte(WRITE+instr)){
     IC_stop(); return(0);
 }
  if(!IC_WriteByte(addr)){
     IC_stop(); return(0);
 }
 IC_start();
 if(!IC_WriteByte(READ+instr)){
    IC_stop(); return(0);
 }
 for(i=0;i<num-1;i++){
     EEbuf[i]=IC_ReadByte();
     SDA=0;                             // Send ACK 
     SDA=0;
     SCL=1;
 }
 EEbuf[num-1]=IC_ReadByte();
 SDA=1;                                 // Send Read End 
 SDA=1;
 SCL=1;
 IC_stop();
 ei();
// Dismark();
 return(1);
 
}

/***************************************************************
** 函数原型: bit readEE(uchar instr,uchar addr,uchar num);    **
** 功    能: 从S42WD42中读取num个字节的数据,采用序列读操作方  **
**           式从片内Address地址开始连续读取数据.S42WD42不接  **
**           受指定的地址则返回0(FALSE).                      **
***************************************************************/
unsigned char readEE24(uchar instr,uchar addr,uchar num)
{
 uchar i;

 for(i=0;i<3;i++){
     if(readEEone24(instr,addr,num))
     {
       ei();
       return(1);
     }
 }
 ei();
 
 return(0);
}

/****************************************************************
** 函数原型: bit writeEEone(uchar instr,uchar addr,uchar num); **
** 功    能: 将EEbuf[]单元中的数据写入S42WD42的num个字节.    **
**           采用页写操作方式,每次写入时都需要指定片内地址.    **
**           如果S42WD42不接受指定的地址或某个传送的字节未收到 **
**           应答信号ACK,则返回0(FALSE).                       **
****************************************************************/
unsigned char writeEEone24(uchar instr,uchar addr,uchar num)
{
 uchar i;
 di();
 
 IC_start();
 if(!IC_WriteByte(WRITE+instr)){
     IC_stop();  return(0);
 }
  if(!IC_WriteByte(addr)){
     IC_stop();  return(0);
 }
 for(i=0;i<num;i++){
     if(!IC_WriteByte(EEbuf[i])){
         IC_stop();  return(0);
     }
 }
 IC_stop();
 ei();
 
 Delay(6);
 

 return(1);
}

/****************************************************************
** 函数原型: bit writeEE(uchar instr,uchar addr,uchar num);    **
** 功    能: 将EEbuf[]单元中的数据写入S42WD42的num个字节.    **
**           采用页写操作方式,每次写入时都需要指定片内地址.    **
**           如果S42WD42不接受指定的地址或某个传送的字节未收到 **
**           应答信号ACK,则返回0(FALSE).                       **
****************************************************************/
unsigned char writeEE24(uchar instr,uchar addr,uchar num)
{
 uchar i;

 for(i=0;i<3;i++){
    if(writeEEone24(instr,addr,num)){ei();return(1);}
 }
 ei();
 
 return(0);
}

⌨️ 快捷键说明

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