通用24CXX读写程序(适用PIC和51,适用24C01~24C2048)

[复制链接]
8119|17
 楼主| 兰天白云 发表于 2008-7-2 22:49 | 显示全部楼层 |阅读模式
24C02,24C04,24C1024测试通过<br /><br /><br />//-------------------读写串行EEPROM-------------<br />//作者:兰天白云<br />//功能描述:读写串行EEPROM(适用24C01~24C2048)<br />//输入:MCU地址,EEP地址,读写字节数,24的控制字<br />//输出:错误标志,0--正确,1--错误<br />//版本说明:V1.1<br />//注:(1)写数据时不用考虑跨页问题(已有处理)<br />//&nbsp;&nbsp;&nbsp;(2)控制字与24的硬件连接有关<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例:24的1,2,3,4脚都与地连接<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;则:写24的控制字=0xa0,读24的控制字=0xa1<br />//----------------------------------------------<br /><br />//根据使用的24确定<br />#define&nbsp;PAGESIZE&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//页大小&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;24C02=8&nbsp;&nbsp;&nbsp;&nbsp;24C512=128<br />#define&nbsp;EEPALLBYTE&nbsp;256&nbsp;&nbsp;&nbsp;//总字节数&nbsp;&nbsp;&nbsp;&nbsp;24C02=256&nbsp;&nbsp;24C512=65536<br />static&nbsp;&nbsp;bit&nbsp;EEP_flag;&nbsp;&nbsp;&nbsp;&nbsp;//0--运行正确,1--运行错误<br /><br />//根据使用的单片机确定(PIC)<br />#include&nbsp;&ltpic.h&gt<br />#define&nbsp;SDA_DIR&nbsp;TRISC2<br />#define&nbsp;SCL_DIR&nbsp;TRISC3<br />#define&nbsp;SDA&nbsp;RC2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RC2---数据线<br />#define&nbsp;SCL&nbsp;RC3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RC3---时钟线<br />#define&nbsp;SDAinput()&nbsp;&nbsp;{&nbsp;SDA_DIR=1;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;//设端口为输入<br />#define&nbsp;SDAoutput()&nbsp;{&nbsp;SDA_DIR=0;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;//输出<br />#define&nbsp;SCLoutput()&nbsp;{&nbsp;SCL_DIR=0;&nbsp;}<br /><br />//根据使用的单片机确定(51)<br />/*<br />#include&nbsp;&ltreg51.h&gt<br />//#define&nbsp;SDA_DIR&nbsp;TRISC2<br />//#define&nbsp;SCL_DIR&nbsp;TRISC3<br />#define&nbsp;SDA&nbsp;P1^0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据线<br />#define&nbsp;SCL&nbsp;P1^1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//时钟线<br />#define&nbsp;SDAinput()&nbsp;&nbsp;{&nbsp;SDA=1;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;//设端口为输入<br />#define&nbsp;SDAoutput()&nbsp;{&nbsp;_nop_();&nbsp;}&nbsp;&nbsp;//为兼容PIC而保留<br />#define&nbsp;SCLoutput()&nbsp;{&nbsp;_nop_();&nbsp;}&nbsp;&nbsp;//为兼容PIC而保留<br />*/<br /><br />//指明由外部函数调用<br />extern&nbsp;bit&nbsp;RW24CXX(unsigned&nbsp;char&nbsp;*p_data,unsigned&nbsp;int&nbsp;eep_addr,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;n,unsigned&nbsp;char&nbsp;Control);<br />extern&nbsp;bit&nbsp;copy(unsigned&nbsp;int&nbsp;SSAddres,unsigned&nbsp;int&nbsp;DSAddres,unsigned&nbsp;int&nbsp;n);<br />extern&nbsp;bit&nbsp;insert(unsigned&nbsp;char&nbsp;*p_data,unsigned&nbsp;int&nbsp;eep_addr,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;n,unsigned&nbsp;char&nbsp;Control);<br />extern&nbsp;bit&nbsp;delete(unsigned&nbsp;int&nbsp;eep_addr,unsigned&nbsp;int&nbsp;n,unsigned&nbsp;char&nbsp;Control);<br /><br /><br />//IO口配置<br />static&nbsp;void&nbsp;EEP_IO(void)<br />{&nbsp;SCLoutput();<br />&nbsp;&nbsp;SDAoutput();<br />}<br />//为了兼容大多数24CXX,至少延时2uS&nbsp;与晶振有关,定义成静态函数<br />static&nbsp;void&nbsp;delayus(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />{&nbsp;unsigned&nbsp;char&nbsp;t1=0x01;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(--t1);<br />}<br />////延时10mS&nbsp;与晶振有关,定义成静态函数<br />static&nbsp;void&nbsp;delay10ms(void)&nbsp;&nbsp;&nbsp;<br />{&nbsp;unsigned&nbsp;int&nbsp;t1=0xffff;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(--t1);<br />}<br />//不管IO口以前怎么用<br />//从现在起用作IIC总线<br />static&nbsp;void&nbsp;I2C_Start(void)&nbsp;&nbsp;&nbsp;//启动总线<br />{&nbsp;EEP_IO();<br />&nbsp;&nbsp;SCL=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//确保时钟=低<br />&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;SDA=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;SCL=1;<br />&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;SDA=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动总线<br />&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;SCL=0;<br />&nbsp;&nbsp;delayus();<br />}<br />//停止时,数据手册要求时钟和数据线都为1<br />//但本人认为时钟线设为0抗干扰更好<br />static&nbsp;void&nbsp;I2C_Stop(void)&nbsp;&nbsp;&nbsp;&nbsp;//停止总线<br />{&nbsp;&nbsp;&nbsp;SCL=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;&nbsp;&nbsp;SDA=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;&nbsp;&nbsp;SDA=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设为0抗干扰更好&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;delayus();<br />}<br /><br />static&nbsp;void&nbsp;I2C_RecAck(void)&nbsp;&nbsp;//读应答信号,用于写<br />{<br />&nbsp;&nbsp;SCL=0;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;SDAinput();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设数据线为输入<br />&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;SCL=1;<br />&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;EEP_flag=SDA;<br />&nbsp;&nbsp;SCL=0;<br />&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;SDAoutput();<br />&nbsp;&nbsp;delayus();<br />}<br />static&nbsp;void&nbsp;I2C_SendAck(void)&nbsp;&nbsp;//发送应答信号,用于连续读&nbsp;<br />{<br />&nbsp;SDA=0;<br />&nbsp;delayus();<br />&nbsp;SCL=1;<br />&nbsp;delayus();<br />&nbsp;SCL=0;<br />&nbsp;delayus();<br />}<br />static&nbsp;void&nbsp;I2C_NoAck(void)&nbsp;&nbsp;&nbsp;&nbsp;//不发送应答信号,用于停止读&nbsp;<br />{<br />&nbsp;SDA=1;<br />&nbsp;delayus();<br />&nbsp;SCL=1;<br />&nbsp;delayus();<br />&nbsp;SCL=0;<br />&nbsp;delayus();<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br />//写一字节到EEPROM<br />static&nbsp;void&nbsp;I2C_wbyte(unsigned&nbsp;char&nbsp;wbyte)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />{unsigned&nbsp;char&nbsp;i=8;<br />&nbsp;//SDAoutput();<br />&nbsp;delayus();<br />&nbsp;for(;i&gt0;i--)<br />&nbsp;&nbsp;{SCL=0;<br />&nbsp;&nbsp;&nbsp;if(wbyte&0x80){SDA=1;}<br />&nbsp;&nbsp;&nbsp;else&nbsp;{SDA=0;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;&nbsp;SCL=1;<br />&nbsp;&nbsp;&nbsp;wbyte&lt&lt=1;<br />&nbsp;&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;}<br />}&nbsp;<br /><br />//从EEPROM读1字节数据返回<br />static&nbsp;unsigned&nbsp;char&nbsp;I2C_rbyte(void)&nbsp;<br />{unsigned&nbsp;char&nbsp;i=8;<br />&nbsp;unsigned&nbsp;char&nbsp;rbyte;<br />&nbsp;SDAinput();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设数据线为输入<br />&nbsp;while(i--)<br />&nbsp;&nbsp;&nbsp;{SCL=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;&nbsp;&nbsp;rbyte=(rbyte&lt&lt1)|SDA;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;delayus();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;SDAoutput();<br />&nbsp;return(rbyte);<br />}<br />//读写n字节数据<br />//数据地址由p_data确定,EEPROM地址由eep_addr确定&nbsp;<br />//数据数量由n确定,读写由Control确定<br />bit&nbsp;RW24CXX(unsigned&nbsp;char&nbsp;*p_data,unsigned&nbsp;int&nbsp;eep_addr,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;n,unsigned&nbsp;char&nbsp;Control)<br />{&nbsp;unsigned&nbsp;int&nbsp;i=0,j=3;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;while(1)&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_Start();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_wbyte(Control&0xfe);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_RecAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(EEP_flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(EEPALLBYTE&gt256)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//有16位地址吗?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{I2C_wbyte(eep_addr/256);&nbsp;&nbsp;//16位地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_RecAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(EEP_flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_wbyte(eep_addr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//8位地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_RecAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(EEP_flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!(Control&0x01))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{while(n--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_wbyte(*p_data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_RecAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(EEP_flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_data++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eep_addr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((eep_addr%PAGESIZE==0))&nbsp;&nbsp;&nbsp;//跨页<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{i2c_stop();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay10ms();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(n==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{i2c_stop();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay10ms();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(EEP_flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if(j--==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//允许重试3次<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读-----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{I2C_Start();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_wbyte(Control);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_RecAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(EEP_flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(n--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{*p_data++=I2C_rbyte();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(n&gt0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_SendAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{I2C_NoAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_Stop();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;return(EEP_flag);<br />}<br />//用数据FData填充从eep_addr开始的区域<br />bit&nbsp;fill(unsigned&nbsp;char&nbsp;FData,unsigned&nbsp;int&nbsp;eep_addr,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;n,unsigned&nbsp;char&nbsp;Control)<br />{unsigned&nbsp;char&nbsp;j=3;<br />&nbsp;while(1)&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_Start();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_wbyte(Control&0xfe);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_RecAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(EEP_flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(EEPALLBYTE&gt256)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//有16位地址吗?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{I2C_wbyte(eep_addr/256);&nbsp;&nbsp;//16位地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_RecAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(EEP_flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_wbyte(eep_addr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//8位地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_RecAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(EEP_flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(n--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_wbyte(FData);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_RecAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(EEP_flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eep_addr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((eep_addr%PAGESIZE==0))&nbsp;&nbsp;&nbsp;//跨页<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{i2c_stop();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay10ms();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(n==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{i2c_stop();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay10ms();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(EEP_flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if(j--==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//允许重试3次<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;return(EEP_flag);<br />}<br />//先把原来的数据搬走(用copy),再插入新数据<br />bit&nbsp;insert(unsigned&nbsp;char&nbsp;*p_data,unsigned&nbsp;int&nbsp;eep_addr,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;n,unsigned&nbsp;char&nbsp;Control)<br />{<br />}<br />//先删除,再把数据搬过来(用copy)<br />bit&nbsp;delete(unsigned&nbsp;int&nbsp;eep_addr,unsigned&nbsp;int&nbsp;n,unsigned&nbsp;char&nbsp;Control)<br />{fill(0xff,eep_addr,n,Control);<br />}<br />//复制<br />bit&nbsp;copy(unsigned&nbsp;int&nbsp;SSAddres,unsigned&nbsp;int&nbsp;DSAddres,unsigned&nbsp;int&nbsp;n)<br />{unsigned&nbsp;char&nbsp;buff[8];&nbsp;&nbsp;//每次复制的数量由数组决定<br />&nbsp;unsigned&nbsp;char&nbsp;i=8;<br />&nbsp;while(n&gt0)<br />&nbsp;&nbsp;&nbsp;{if(n&gt=8)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{i=8;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n-=8;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{i=n;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;RW24CXX(buffer,SSAddres,i,Control|0x01);<br />&nbsp;&nbsp;&nbsp;&nbsp;RW24CXX(buffer,DSAddres,i,Control&0xfe);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(EEP_flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;SSAddres+=8;<br />&nbsp;&nbsp;&nbsp;&nbsp;DSAddres+=8;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;return(EEP_flag);<br />}
yewuyi 发表于 2008-7-3 08:31 | 显示全部楼层

做个记号

  
发表于 2008-7-3 11:22 | 显示全部楼层

hao....

  
 楼主| 兰天白云 发表于 2008-7-4 21:40 | 显示全部楼层

如果有新的24测试通过,请告知,如果有问题,请指正

  
hotpower 发表于 2008-7-5 19:58 | 显示全部楼层

为何不硬件I2C???

  
xil 发表于 2008-7-5 20:07 | 显示全部楼层

因为8051没有硬件I2C

  
hotpower 发表于 2008-7-5 20:21 | 显示全部楼层

80c51有的有SMBus

  
 楼主| 兰天白云 发表于 2008-7-5 22:53 | 显示全部楼层

这样通用

  
meteor01 发表于 2008-7-6 00:31 | 显示全部楼层

其实了解了I2C工作原理自己写也是很简单

<br /> 相关链接:<a href='http://www.openlib.org.cn/'>http://www.openlib.org.cn/</a>
ayb_ice 发表于 2008-7-9 14:42 | 显示全部楼层

51上可行吗

#define&nbsp;SDA&nbsp;P1^0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据线<br />#define&nbsp;SCL&nbsp;P1^1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//时钟线<br />上面的定义肯定达不到效果。<br />你在51是验证过吗。
01dxwlm 发表于 2008-7-9 16:12 | 显示全部楼层

来帖上我在51上使用的,移植在PIC上也运行正常

#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEPROM_DRIVER<br />/******************************************************************************<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;单片机&nbsp;I/O口模拟I2C通信读写EEPROM&nbsp;24C0X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />*******************************************************************************<br />*Copyright:&nbsp;&nbsp;&nbsp;&nbsp;MASNK&nbsp;Corporation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />*File&nbsp;name:&nbsp;&nbsp;&nbsp;&nbsp;EEPromDriver.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />*Author:&nbsp;&nbsp;&nbsp;&nbsp;Kenny_wang&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />*Version:&nbsp;&nbsp;&nbsp;&nbsp;V1.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />*Date:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2008/06/25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />*******************************************************************************/<br />/******************************************************************************<br />*Modify&nbsp;List:<br />*<br />*1.2008/06/25&nbsp;&nbsp;&nbsp;&nbsp;Kenny_wang&nbsp;<br />*----(1).release&nbsp;the&nbsp;original&nbsp;version.&nbsp;<br />*<br />*******************************************************************************/<br /><br />#include&nbsp;&nbsp;&nbsp;&nbsp;&quot;DriverEepromPortsI2chdports.h&quot;<br />#include&nbsp;&nbsp;&nbsp;&nbsp;&quot;DriverEepromEEPromDriver.h&quot;<br /><br />/*******************************************************************************<br />*&nbsp;Constant&nbsp;Define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />********************************************************************************/<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cPageSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cMaxAddrSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;255<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cI2CAck&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cI2CNak&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br /><br />/********************************************************************************<br />*&nbsp;Variable&nbsp;Declaration&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />********************************************************************************/<br />unsigned&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;wCheckSum&nbsp;=&nbsp;0;<br /><br />/********************************************************************************<br />*&nbsp;Internal&nbsp;Function&nbsp;Declaration&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />********************************************************************************/<br />void&nbsp;&nbsp;&nbsp;&nbsp;sI2CBitStart(void);<br />void&nbsp;&nbsp;&nbsp;&nbsp;sI2CBitStop(void);<br />void&nbsp;&nbsp;&nbsp;&nbsp;sI2CBitOut(unsigned&nbsp;char&nbsp;bBit);<br />unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;sI2CBitIn(void);<br />unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;sI2CAckIn(void);<br />void&nbsp;&nbsp;&nbsp;&nbsp;sI2CByteOut(unsigned&nbsp;char&nbsp;bData);<br />unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;sI2CByteIn(void);<br />void&nbsp;&nbsp;&nbsp;&nbsp;sI2CReset(void);<br />unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;sEepromPageWrite(unsigned&nbsp;int&nbsp;bAddr,unsigned&nbsp;int&nbsp;bLength,const&nbsp;unsigned&nbsp;char&nbsp;*pbData);<br /><br /><br /><br />/********************************************************************************<br />*Description:&nbsp;&nbsp;&nbsp;&nbsp;START&nbsp;BIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />*SDA:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ayb_ice 发表于 2008-7-9 16:48 | 显示全部楼层

用个预处理很容易搞定的

如:<br />#ifdef&nbsp;__KEIL__<br /><br />#endif<br /><br />#ifdef&nbsp;__PICC__<br /><br />#endif<br />...
LXRLXR 发表于 2008-7-11 17:04 | 显示全部楼层

不错........

  
ljwmf 发表于 2008-8-4 18:07 | 显示全部楼层

在MCC18 提示 syntax error

在MCC18里面&nbsp;static&nbsp;&nbsp;bit&nbsp;和&nbsp;bit&nbsp;都会提示“syntax&nbsp;error”,<br />请问在MCC18里面怎样定义位变量啊?
 楼主| 兰天白云 发表于 2008-8-5 08:37 | 显示全部楼层

其中之一

union<br />{struct&nbsp;{<br />&nbsp;unsigned&nbsp;rb0:1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;unsigned&nbsp;rb1:1;&nbsp;<br />&nbsp;unsigned&nbsp;rb2:1;<br />&nbsp;unsigned&nbsp;rb3:1;<br />&nbsp;unsigned&nbsp;rb4:1;<br />&nbsp;unsigned&nbsp;rb5:1;<br />&nbsp;unsigned&nbsp;rb6:1;<br />&nbsp;unsigned&nbsp;rb7:1;<br />&nbsp;};<br />&nbsp;unsigned&nbsp;char&nbsp;rb;<br />}rb_bits;<br /><br /><br />其中之二<br />#define&nbsp;AD_CS&nbsp;&nbsp;PORTBbits.RB0
ljwmf 发表于 2008-8-11 09:18 | 显示全部楼层

发现读或写操作返回EEP_flag都为1

请教一下版主这个程序我用MCC18编译,然后下载到18F65调试,发现读或写操作返回EEP_flag都为1,也就是错误,<br />我在MCC18上修改是这样的。<br /><br />#define&nbsp;SDA&nbsp;&nbsp;&nbsp;LATFbits.LATF5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RF5---数据线<br />#define&nbsp;SCL&nbsp;&nbsp;&nbsp;LATFbits.LATF4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RF4---时钟线<br />#define&nbsp;SDA_DIR&nbsp;TRISFbits.TRISF5<br />#define&nbsp;SCL_DIR&nbsp;TRISFbits.TRISF4<br /><br />
 楼主| 兰天白云 发表于 2008-8-12 21:14 | 显示全部楼层

PIC18FXXX上有输出锁存,你直接用IO口操作试试

  
lhkjg 发表于 2008-8-19 07:47 | 显示全部楼层

不错。

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

115

主题

2961

帖子

7

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