《2831.CX1多功能家居控制系统及应用设计 AT24C08读程序》由会员分享,可在线阅读,更多相关《2831.CX1多功能家居控制系统及应用设计 AT24C08读程序(4页珍藏版)》请在金锄头文库上搜索。
1、/DataBuff为读写数据输入输出缓冲区的首址/ByteQuantity 为要读写数据的字节数量/Address 为EEPROM的片内地址/ControlByte 为EEPROM的控制字节,具体形式为 /表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;/EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256;/函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;/ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1/SDA和SCL由用户自定义,这里暂定
2、义为P00和P01;/其余的用户不用管,只要把只子程序放在你的程序中并调用它就可以了;/*/bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address, unsigned char ControlByte,enum eepromtype EepromType)void Delay(unsigned char DelayCount);void IICStart(void);void IICStop(void);bit IICRecAck(void);void IICNoAck(void);v
3、oid IICAck(void);unsigned char IICReceiveByte(void);void IICSendByte(unsigned char sendbyte);unsigned char data j,i=ERRORCOUNT;while(i-) IICStart(); IICSendByte(ControlByte&0xfe); if(IICRecAck() continue; if(EepromTypeM2416) IICSendByte(unsigned char)(Address8); if(IICRecAck() continue; IICSendByte(
4、unsigned char)Address); if(IICRecAck() continue; if(!(ControlByte&0x01) j=ByteQuantity; errorflag=0; /*clr errorflag while(j-) IICSendByte(*DataBuff+); if(!IICRecAck() continue; errorflag=1; break; if(errorflag=1) continue; break; else IICStart(); IICSendByte(ControlByte); if(IICRecAck() continue; w
5、hile(-ByteQuantity) *DataBuff+=IICReceiveByte(); IICAck(); *DataBuff=IICReceiveByte(); /read last byte data IICNoAck(); errorflag=0; break; IICStop();if(!(ControlByte&0x01) Delay(255); Delay(255); Delay(255); Delay(255); /*以下是对IIC总线的操作子程序*/*启动总线*/void IICStart(void)SCL=0; /SDA=1;SCL=1;_nop_();_nop_(
6、);_nop_();SDA=0;_nop_();_nop_();_nop_();_nop_();SCL=0;SDA=1; /*停止IIC总线*/void IICStop(void)SCL=0;SDA=0;SCL=1;_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();_nop_();SCL=0; /*从IIC总线上读数据子程序*/unsigned char IICReceiveByte(void)register receivebyte,i=8;SCL=0;while(i-) SCL=1; receivebyte=(receivebyte1)|SDA; SCL=0; return(receivebyte);/*一个简单延时程序*/(选用液晶显示廷时程序)void Delay(unsigned char DelayCount)