/*=============================================*/ /*;***********************************/ /*;起动24C01时序*/ void Start() { SCL=1; SDA=1; SDA=0; SCL=0; } /*;************************************/ /*;停止24C01时序*/ void Stop() { SDA=0; SCL=1; SDA=1; } /*;**************************************/ /*;检测24C01的响应信号*/ bit ACK() { bit c; SDA=1; SCL=1; c=SDA; SCL=0; return c; } /*;************************************/ /*;往24C01发一8位数据*/ void SendChar(unsigned char ch) { unsigned char i; i=8; do { SDA=(ch&0x80); SCL=1; SCL=0; ch<<=1; }while(--i!=0); } /*;**************************************/ /*;从24C01接收一8位数据*/ unsigned char RecChar() { unsigned char i,j; i=8; do { SCL=1; j=(j<<1)|SDA; SCL=0; }while(--i!=0); return j; } //;************************************** /*;********************************/ /*;往24C01写一字节*/ void WriteChar(unsigned int addr,unsigned char ch) { unsigned char c; c=((*((unsigned char *)&addr))<<1)&0x02; Start(); SendChar(0xa0|c); ACK(); SendChar(addr); ACK(); SendChar(ch); ACK(); Stop(); // for(addr=4;addr!=0;addr--) for(ch=0xff;ch!=0;ch--) ; } //;************************************** /*;********************************/ /*;往24C01写多字节*/ void WriteBuf(unsigned int addr,unsigned char idata *buf,unsigned char count) { unsigned char c; c=((*((unsigned char *)&addr))<<1)&0x02; Start(); SendChar(0xa0|c); ACK(); SendChar(addr); ACK(); do { SendChar(*buf++); ACK(); if(count!=1) {if(((++addr)&0x7)==0) { Stop(); for(c=0xff;c!=0;c--) ; c=((*((unsigned char *)&addr))<<1)&0x02; Start(); SendChar(0xa0|c); ACK(); SendChar(addr); ACK(); } } else { Stop(); for(c=0xff;c!=0;c--) ; } }while(--count!=0); } /*;**********************************/ /*;从24C01读一字节*/ /*;入口:R0中为要读出内容的地址*/ /*;出口:A中为读到的内容*/ unsigned char ReadChar(unsigned int addr) { unsigned char ch; ch=((*((unsigned char *)&addr))<<1)&0x02; Start(); SendChar(0xa0|ch); ACK(); SendChar(addr); ACK(); Start(); SendChar(0xa1|ch); ACK(); ch=RecChar(); Stop(); return ch; } /**********************************/ /*至少读2字节*/ void ReadBuf(unsigned int addr,unsigned char idata *buf,unsigned char count) { unsigned char ch; ch=((*((unsigned char *)&addr))<<1)&0x02; Start(); SendChar(0xa0|ch); ACK(); SendChar(addr); ACK(); Start(); SendChar(0xa1|ch); ACK(); count--; do { *buf++=RecChar(); SDA=0; SCL=1; SCL=0; SDA=1; }while(--count!=0); *buf=RecChar(); Stop(); }