还是不行,程序在下边,请斧正
// //****************************************** //------------------------------------------- //char read02(char adr); //读24c02指定地址内容 //void write02(char adr,char dt); //把参数写入24c02指定地址 //char read8583(char adr); //读8583指定地址内容 //void write8583(char adr,char dt); //写参数到8583指定地址 //------------------------------------------- // // // //00000000000000000000000000000000000000000000 //以下部分未用 // //读adr开始,num个字节,返回数组pm[] // //char read8(char adr,char num,char pm[]) // //自己注意分页问题 // // // //写数组pm[]到adr开始,num个字节, // //void write8(char adr,char num,char pm[]) // // // //数组长度小于8。 // // // // // //-----------------------------------------//
#define w02 0xa0 //写器件地址 #define r02 0xa1 //读器件地址 #define Iio TRISC4 //sda方向
char read02(char adr); //读指定器件,指定地址地址 void write02(char adr,char dt);
void read02series(char adr,char num); //连续读adr后num个字节.存prm void write02series(char adr,char num); //连续写adr地址后num个字节,地址和prm[]顺序一致
char rad (char); void trx (char,char); //返回1=应答有效, 0=应答超时 void start (char); void stop (char); void ack (char); void no_ack (char t); void i2c_delay(char time); //-----------------------------------
/*
//---------------------------------- void read02series(char adr,char num) {
} //----------------- void write02series(char adr,char num) {
} //------------------ */
//adr 起始地址 num 数据长度 数组用general[], void read02series(char adr,char num) { char i,dt,n=0;
start(50); trx(w02,50); trx(adr,50); //02地址 start(50); trx(r02,50); // n=0; for(;num!=0;num--) { clrwdt; dt=rad(50); show0=dt; show0=n; general[n++]=dt; // if(num!=0) ack(50); } no_ack(50); //非应答 stop(50); } //--------------------------------- //连续写adr地址后num个字节,地址和prm[]顺序一致 void write02series(char adr,char num) { char i,dt,n=0; Sprotect=0; //24写保护 start(20); trx(w02,20); trx(adr,20); //02地址 for(;num!=0;num--) { clrwdt; trx(general[n++],20); adr++; if(adr%8==0) { stop(20); delay(5000); start(20); trx(w02,20); trx(adr,20); //02地址 } } stop(20); delay(5000); Sprotect=1; } //----------------------------------
//=================================== // //写1字节 void write02(char adr,char dt) { Sprotect=0; clrwdt; start(20); trx(w02,20); trx (adr,20); //02地址 trx(dt,20); //数据 stop(20); delay(1000); //需要延时才能发下一字节. Sprotect=1; } //------------------------------ //读1字节 char read02(char adr) { char dt; clrwdt; start (20); trx (w02,20); trx (adr,20); //读02地址 start(20); trx(r02,20); // dt=rad(20); //读数据 no_ack(20); //非应答 stop(20);
return dt; } //-----------------------------
//-------------------------------- //接收一个字节 char rad (char t) { char i,dt=0; Iio=1; for(i=8;i!=0;i--) {
Scl=1; dt<<=1; delay(t); if(Sda) dt|=0x1; //else //dt|=0x0; Scl=0; delay(t); }
return (dt); } //----------------------
//-------------------- //返回0=应答有效, 1=应答超时 void trx (char data,char t) { char i; int n=0;
Iio=0; Iictimeover=0; //清除应答超时标志 for(i=8;i!=0;i--) {
Sda=data>>7; data<<=1;
Scl=1; delay(t); Scl=0; delay(t); } //等待应答 Sda=0; delay(t); Iio=1; nop; nop; Scl=1; // delay(t);
n=50; //1ms无返回,及认为超时 while(Sda&!Iictimeover) //返回0=应答有效, 1=应答超时 { //避免在此死循环,造成复位. if(--n==0){Iictimeover=1;} } Scl=0; delay(t);
} //-------------------
//------------------------------
//--------------- void start (char t) { //开始 Iio=0; Sda=1;delay(t); Scl=1;delay(t); Sda=0;delay(t); Scl=0;delay(t); } //------------- void stop (char t) { //停止 Iio=0; delay(t); Sda=0; delay(t); Scl=1; delay(t); Sda=1;
} //------------- void ack (char t) { //应答 Iio=0; delay(t); Sda=0; delay(t); Scl=1; delay(t); Scl=0; } //-------------- void no_ack (char t) { Iio=0; delay(t); Sda=1; delay(t); Scl=1; delay(t); Scl=0; } //-------------
//------------- |