代码前带//是已经注释掉的代码,可以不用。可以作为子程序被主程序调用。
程序已经在设备上使用,完全没问题!
#include #include \"24c02.h\" #include \"delay.h\" //iic总线初始化 void iic_init(void) { sda=1; scl=1; } //24c02开始程序 void iic_start() //数据线拉高 //时钟线拉高 { sda=1; delay10us(); scl=1; delay10us(); sda=0; delay10us(); } //24c02停止程序 void iic_stop()//停止 { sda=0; delay10us(); scl=1; delay10us(); sda=1; delay10us(); } //24c02应答信号 void iic_respons() //应答,在数据传送8 位后,等待或者发送一个应答信号 { uchar i; scl=1; delay10us(); while((sda==1)&&(i<250))i++; scl=0; delay10us(); } //等待应答信号到来 //返回值:1,接收应答失败 // 0,接收应答成功 //u8 iic_wait_ack(void) //{ // u8 ucErrTime=0; // sda=1;delay10us(); // scl=1;delay10us(); // while(sda) // { // ucErrTime++; // if(ucErrTime>250) // { // iic_stop(); // return 1; // } // } // scl=0; // return 0; //} //产生ACK应答 //void iic_ack(void) //{ // scl=0; //时钟输出0 // sda=0; // delay10us(); // scl=1; // delay10us(); // scl=0; //} //不产生ACK应答 //void iic_nack(void) //{ // scl=0; // sda=1; // delay10us(); // scl=1; //高电平应持续4us以上 // delay10us(); // scl=0; //} //IIC发送一个字节 void iic_send_byte(uchar date) { uchar i; scl=0; for(i=0;i<8;i++) { date=date<<1; sda=CY; //将要送入数据送入sda scl=1; //scl 拉高准备写数据 delay10us(); scl=0; //scl 拉低数据写完毕 delay10us(); } } //IIC读出一个字节 u8 iic_read_byte() { uchar i,k; for(i=0;i<8;i++) { scl=1; delay10us(); //scl 拉高准备读数据 k=(k<<1)|sda; //将sda 中的数据读出 scl=0; //scl 拉低数据写完毕 delay10us(); } return k; } //通过iic总线向24c02写数据 void write_add(uchar address,uchar date) { iic_start(); iic_send_byte(0xa0); //写器件地址0xa0 iic_respons(); iic_send_byte(address); iic_respons(); iic_send_byte(date); iic_respons(); iic_stop(); } //通过iic总线24c02中读数据 uchar read_add(uchar address)//从AT24C02 中读出数据 { uchar date; iic_start(); //先把要读的地址写进去,然后再读出来 iic_send_byte(0xa0); //写器件地址0xa0 iic_respons(); iic_send_byte(address); iic_respons(); iic_start(); iic_send_byte(0xa1); //读器件地址0xa1 iic_respons(); date=iic_read_byte(); iic_stop(); return date; } 因篇幅问题不能全部显示,请点此查看更多更全内容