1 得有返回值 void I2C_Ack() { SDA = 0; SCL = 1; delayNOP(); SCL = 0; //启动应答发送 SDA = 1; //取反 }
//得发送非应答子函数 //如下: void I2C_NAck() { SDA = 1; SCL = 1; delayNOP(); SCL = 0; //启动非应答发送 SDA = 0; //取反 } //你查下2401的芯片读写怎么具体,一次能写多少!如2408 每次写只能写16个数据 读 能读64个数据 你读写程序没具体写明要读和写多少个数据 只给出你部分程序 可用做参考你!这程序可行!
uchar SendString(uchar Slave,uchar Subaddr,uchar *Source,uchar Num) { uchar s;
I2C_start(); SendByte(Slave); if(ack==0) return(0); SendByte(Subaddr); if(ack==0) return(0);
for(s=0; s<Num; s++) { SendByte(*Source); if(ack==0) return(0); Source++; } I2C_stop(); return(1); }
// 接收多字节数据函数(0xa0,0x00,数组地址,数据个数)
uchar RecString(uchar Slave,uchar Subaddr,uchar *Source,uchar Num) { uchar s;
I2C_start(); SendByte(Slave); //发送器件地址 if(ack==0) return(0); SendByte(Subaddr); //发送器件子地址 if(ack==0) return(0); I2C_start(); SendByte(Slave+1); //发送器件地址,读模式 if(ack==0) return(0);
for(s=0; s<Num; s++) { *Source=RecByte(); I2C_Ack(); Source++; } I2C_NAck(); I2C_stop(); return(1); } main(void) { uchar i,j,k,a,b,c,d,e,f,h,o=0; I2C_init(); while(key==1); P1=0xfe; for(o=0;o<4;o++) { RecString(0xa0,h,display1,64); delayms(30); h+=0x40; j=0; SendString(0xa8,k,p+j,64); k+=0x40; j+=64; delayms(30); } h=0; for(o=0;o<4;o++) { RecString(0xa2,h,display1,64); delayms(30); h+=0x40; b=0; SendString(0xaa,a,p+b,64); a+=0x40; b+=64; delayms(30); } } } |