www.pudn.com > DDS485.rar > iic.c


#include  
#include  
#include  
#include  
//-----***-IIC延时-***-----// 
void wait(void) 
{ 
	_nop_();//01 
	_nop_();//02 
	_nop_();//03 
	_nop_();//04 
	_nop_();//05 
	_nop_();//06 
	_nop_();//07 
	_nop_();//08 
	_nop_();//09 
	_nop_();//10 
} 
 
void iicstart(void)//总线开始 
{ 
     iicsda=1; 
     wait(); 
     iicscl=1; 
     wait(); 
     iicsda=0; 
     wait(); 
     iicscl=0; 
     wait(); 
} 
 
void iicstop(void)//总线结束 
{ 
     iicsda=0; 
     wait(); 
     iicscl=1; 
     wait(); 
     iicsda=1; 
     wait(); 
} 
 
bit ack(void)//检测 
{ 
       bit t; 
       iicsda=1; 
       wait(); 
       iicscl=1; 
       wait(); 
       t=iicsda; 
       iicscl=0; 
       wait(); 
       return t; 
} 
 
void noack(bit ack)//非检测 
{ 
     iicsda=ack; 
     wait(); 
     iicscl=1; 
     wait(); 
     iicscl=0; 
     wait(); 
} 
 
bit w8bitiic(unsigned char templ) 
{ 
    unsigned char i; 
    bit t; 
    for(i=0;i<8;i++) 
   { 
    	if(templ&0x80) 
    	iicsda=1; 
    	else 
    	iicsda=0; 
    	wait(); 
    	iicscl=1; 
    	wait(); 
    	iicscl=0; 
    	templ<<=1; 
    } 
    t=ack(); 
    return t; 
 
} 
 
unsigned char r8bitiic(void) 
{ 
    unsigned char i; 
    unsigned char byte=0; 
    iicsda=1; 
    for(i=0;i<8;i++) 
    	{iicscl=1; 
    	 byte<<=1; 
    	 if(iicsda)byte|=0x01; 
    	 else byte|=0x00; 
    	 iicscl=0; 
    	} 
    return byte; 
} 
 
 
void wbyteiic(unsigned char deviceaddress,unsigned char dateaddress,unsigned char byte) 
{ 
      
     iicwp=0; 
     Delay(500); 
     EA=0; 
     iicstart(); 
     w8bitiic(deviceaddress); 
     w8bitiic(dateaddress); 
     w8bitiic(byte); 
     iicstop(); 
     EA=1; 
     iicwp=1; 
     Delay(500); 
} 
 
unsigned char rbyteiic(unsigned char deviceaddress,unsigned char dateaddress) 
{ 
	unsigned char c; 
	EA=0; 
	iicstart(); 
	w8bitiic(deviceaddress); 
	w8bitiic(dateaddress); 
	iicstart(); 
	w8bitiic(deviceaddress|0x01); 
	c=r8bitiic(); 
	noack(1); 
	iicstop(); 
	EA=1; 
	return(c); 
 
} 
 
//-----***-无扇区读---多字节-***-----// 
//读取指定器件无扇区指定地址多字节数据到指定地址 
//Device=器件地址---单字节  
//DataAdd=字节地址---单字节 
void IicMByteRead(unsigned char deviceaddress,unsigned char dateaddress,unsigned char *DataDptr,unsigned char DataLend) 
{ 
    unsigned char i; 
    EA=0; 
	iicstart(); 
	w8bitiic(deviceaddress); 
	w8bitiic(dateaddress); 
	iicstart(); 
	w8bitiic(deviceaddress|0x01); 
    for(i=0;i