作者:雁舞白沙<br /><br />声明:未经本人同意禁止任何形式的转载<br /><br />信箱:buaijun@yahoo.com.cn<br /><br />博客:redbug.21ic.org<br /><br />更多程序请参见博客...<br /><br />#include <REG932.h><br />#include <Define.h><br />#include <Stdio.h><br />#include <Intrins.h><br />//起始信号<br />//延时等候<br />void IicWait(void)<br />{<br /> _nop_();//01<br /> _nop_();//02<br /> _nop_();//03<br /> _nop_();//04<br /> _nop_();//05<br /> _nop_();//06<br /> _nop_();//07<br /> _nop_();//08<br /> _nop_();//09<br /> _nop_();//10<br /> _nop_();//11<br /> _nop_();//12<br /> _nop_();//13<br /> _nop_();//14<br /> _nop_();//15<br /> _nop_();//16<br /> _nop_();//17<br /> _nop_();//18<br /> _nop_();//19<br /> _nop_();//20<br /> _nop_();//21<br /> _nop_();//22<br /> _nop_();//23<br /> _nop_();//24<br /> _nop_();//25<br />}<br />void IicStart(void) <br />{<br /> IicSda=1;<br /> IicWait();<br /> IicScl=1;<br /> IicWait();<br /> IicSda=0;<br /> IicWait();<br /> IicScl=0;<br /> IicWait();<br />}<br />//停止信号<br />void IicStop(void) <br />{<br /> IicSda=0;<br /> IicWait();<br /> IicScl=1;<br /> IicWait(); <br /> IicSda=1;<br /> IicWait();<br />}<br /><br />//应答信号<br />void SendAcknowledge(bit ack) <br />{<br /> IicSda=ack;<br /> IicScl=1;<br /> IicWait();<br /> IicScl=0;<br /> IicWait();<br />} <br />//从slave端读取一个数据*/<br />unsigned char IicReceiveByte(void)<br />{<br /> unsigned char data i;<br /> unsigned char data bytedata=0;<br /> IicSda=1;<br /> for(i=0;i<8;i++)<br /> {<br /> IicScl=1;<br /> IicWait();<br /> bytedata<<=1;<br /> if (IicSda) bytedata |=0x01;<br /> IicScl=0;<br /> IicWait();<br /> }<br /> return bytedata;<br />}<br />//传送一个 Byte 数据到 slave */<br />bit IicSentByte(unsigned char DataByte) <br />{<br /> unsigned char data i;<br /> bit ack;<br /> for(i=0;i<8;i++)<br /> {<br /> if(DataByte & 0x80)<br /> {<br /> IicSda=1;<br /> }<br /> else<br /> {<br /> IicSda=0;<br /> }<br /> DataByte <<=1;<br /> IicWait();<br /> IicScl=1;<br /> IicWait();<br /> IicScl=0;<br /> IicWait();<br /> }<br /> IicSda=1;<br /> IicWait();<br /> IicScl=1;<br /> IicWait();<br /> ack=IicSda;<br /> IicScl=0;<br /> IicWait();<br /> return ack;<br />}<br /><br />unsigned char FgTimeout;<br />//无扇区读---单字节<br />//读取指定器件无扇区指定地址单字节的数据<br />//Device=器件地址---单字节<br />//DataAdd=字节地址---单字节<br />unsigned char IicByteRead(unsigned char Device,unsigned char DataAdd) <br />{<br /> unsigned char data bytedata;<br /> EA=0;<br /> IicStart();<br /> IicSentByte(Device);<br /> IicSentByte(DataAdd);<br /> IicStart();<br /> IicSentByte(Device|0x01);<br /> bytedata=IicReceiveByte();<br /> SendAcknowledge(1);<br /> IicStop();<br /> EA=1;<br /> return bytedata;<br />}<br />//无扇区读---多字节<br />//读取指定器件无扇区指定地址多字节数据到指定地址<br />//Device=器件地址---单字节 <br />//DataAdd=字节地址---单字节<br />void IicMuchByteRead(unsigned char Device,unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend)<br />{<br /> unsigned char data i;<br /> EA=0;<br /> IicStart();<br /> IicSentByte(Device);<br /> IicSentByte(DataAdd);<br /> IicStart();<br /> IicSentByte(Device|0x01);<br /> for(i=0;i<DataLend-1;i++)<br /> {<br /> *DataDptr=IicReceiveByte();<br /> DataDptr++;<br /> SendAcknowledge(0);<br /> }<br /> *DataDptr=IicReceiveByte();<br /> SendAcknowledge(1);<br /> IicStop();<br /> EA=1;<br />}<br />/*<br />//有扇区读---单字节<br />//读取指定器件有扇区指定地址中单字节的数据<br />//Device=器件地址---单字节 <br />//DataPage=扇区地址---单字节 <br />//DataAdd=字节地址---双字节)<br />unsigned char IicPageByteRead(unsigned char Device,unsigned char DataPage,unsigned char DataAdd)<br />{<br /> unsigned char data bytedata;<br /> ET1=0;<br /> IicStart();<br /> IicSentByte(Device);<br /> IicSentByte(DataPage);<br /> IicSentByte(DataAdd);<br /> IicStart();<br /> IicSentByte(Device|0x01);<br /> bytedata=IicReceiveByte();<br /> SendAcknowledge(1);<br /> IicStop();<br /> ET1=1;<br /> return bytedata;<br />}<br />//有扇区读---多字节<br />//读取指定器件有扇区指定地址中的多字节数据<br />//Device=器件地址---单字节 <br />//DataPage=扇区地址---单字节 <br />//DataAdd=字节地址---双字节)<br />void IicPageMuchByteRead(unsigned char Device,unsigned char DataPage,unsigned char DataAdd,unsigned char DataLend) //读取指定器件指定地址中的数据<br />{<br /> unsigned char i;<br /> ET1=0;<br /> IicStart();<br /> IicSentByte(Device);<br /> IicSentByte(DataPage);<br /> IicSentByte(DataAdd);<br /> IicStart();<br /> IicSentByte(Device|0x01);<br /> for(i=0;i<DataLend-1;i++)<br /> {<br /> IIcBuf=IicReceiveByte();<br /> SendAcknowledge(0);<br /> }<br /> IIcBuf=IicReceiveByte();<br /> SendAcknowledge(1);<br /> IicStop();<br /> ET1=1;<br />}<br />*/<br />//无扇区写---单字节<br />//写入指定器件无扇区指定地址中的单字节数据<br />//Device=器件地址---单字节<br />//DataAdd=字节地址---双字节<br />void IicByteWrite(unsigned char Device,unsigned char DataAdd,unsigned char DataByte)<br />{<br /> unsigned char data i;<br /> bit ack;<br /> EA=0;<br /> IicWp=0;<br /> Delay(50);<br /> for(i=0;i<3;i++)<br /> {<br /> IicStart();<br /> ack=IicSentByte(Device);if(ack==1){IicStop();continue;}<br /> ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;}<br /> ack=IicSentByte(DataByte);if(ack==1){IicStop();continue;}<br /> IicStop();<br /> if(ack==0)break;<br /> }<br /> IicWp=1;<br /> EA=1;<br /> Delay(500);<br />}<br />//无扇区写---多字节<br />//写入指定器件无扇区指定地址中的多字节数据<br />//Device=器件地址---单字节<br />//DataAdd=字节地址---双字节<br />//DataByte=被存放数据的地址<br />//DataLend=被存放数据的长度<br />void IicMuchByteWrite(unsigned char Device,unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend)<br />{<br /> unsigned char data i,j;<br /> bit ack;<br /> EA=0;<br /> IicWp=0;<br /> for(i=0;i<3;i++)<br /> {<br /> IicStart();<br /> ack=IicSentByte(Device);if(ack==1){IicStop();continue;}<br /> ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;}<br /> for(j=0;j<DataLend;j++)<br /> {<br /> ack=IicSentByte(*DataDptr);if(ack==1){IicStop();continue;} <br /> DataDptr++;<br /> }<br /> IicStop();<br /> if(ack==0)break;<br /> }<br /> IicWp=1;<br /> EA=1;<br /> Delay(500);<br />}<br />/*<br />//有扇区写---单字节<br />//写入指定器件有扇区指定地址中的单字节数据<br />//Device=器件地址---单字节<br />//DataPage=扇区地址---单字节<br />//DataAdd=字节地址---双字节<br />void IicPageByteWrite(unsigned char Device,unsigned char DataPage,unsigned char DataAdd,unsigned char DataByte)<br />{<br /> unsigned char data i;<br /> bit ack;<br /> ET1=0;<br /> FgTimeout=1;<br /> IicWp=0;<br /> for(i=0;i<3;i++)<br /> {<br /> IicStart();<br /> ack=IicSentByte(Device);if(ack==1){IicStop();continue;}<br /> ack=IicSentByte(DataPage);if(ack==1){IicStop();continue;}<br /> ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;}<br /> ack=IicSentByte(DataByte); if(ack==1){IicStop();continue;}<br /> IicStop();<br /> FgTimeout=0;<br /> if(ack==0)break;<br /> }<br /> Delay(50);<br /> IicWp=1;<br /> ET1=1;<br />} <br />//有扇区写---多字节<br />//写入指定器件有扇区指定地址中的多字节数据<br />//Device=器件地址---单字节<br />//DataPage=扇区地址---单字节<br />//DataAdd=字节地址---双字节<br />//DataByte=被存放数据的地址<br />//DataLend=被存放数据的长度<br />void IicPageMuchByteWrite(unsigned char Device,unsigned char DataPage,unsigned char DataAdd,unsigned int *DataDptr,unsigned char DataLend)<br />{<br /> unsigned char data i,j;<br /> bit ack;<br /> ET1=0;<br /> FgTimeout=1;<br /> IicWp=0;<br /> for(i=0;i<3;i++)<br /> {<br /> IicStart();<br /> ack=IicSentByte(Device);if(ack==1){IicStop();continue;}<br /> ack=IicSentByte(DataPage);if(ack==1){IicStop();continue;}<br /> ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;}<br /> for(j=0;j<DataLend;j++)<br /> {<br /> ack=IicSentByte(*DataDptr); if(ack==1){IicStop();continue;} <br /> DataDptr++;<br /> }<br /> IicStop();<br /> FgTimeout=0;<br /> if(ack==0)break;<br /> }<br /> Delay(50);<br /> IicWp=1;<br /> ET1=1;<br />}<br />*/<br /><br /><br />* - 本贴最后修改时间:2007-2-1 10:38:37 修改者:雁舞白沙<br /><br /><br /><br /><br /><br /><br /> 相关链接:<a href='http://redbug.21ic.org'>http://redbug.21ic.org</a> |
|