本人初学C,曾为这个问题大伤脑筋^_^,就是一个单片机系统有两个以上的相同地址的I2C设备,无法用两个同一对SDA/SCL引脚
- #include "stc89c51.h"
- #include "iic.h"
- sbit scl0=P3^5;
- sbit sda0 = P3^4;
- sbit scl1= P3^3;
- sbit sda1 = P3^2;
- //这里只写了两个I2C设备,如果需要可以再加上 sbit scl2=xx; sbit sda2=xx; 实际上多个设备的scl脚可以共用
- unsigned char iic_delay_time = 8;
- void scl(device,value);
- void sda(device,value);
- bit sdasense(char device);
- // delay
- void iic_delay(unsigned char m)
- {
- unsigned char n;
- for(n=0;n<m;n++);
- }
- //
- void scl(device,value)
- {
- if (device==0) //设备1
- scl1=value;
- if (device==1) //设备2
- scl2=value;
- }
- void sda(device,value)
- {
- if (device==0) //设备1
- sda1=value;
- if (device==1) //设备2
- sda2=value;
- }
- bit sdasense(char device)
- {
- switch(device)
- {
- case 1: return sda1;
- break;
- case 2: return sda2;
- break;
- }
- }
- //启动I2C总线的函数,当scl为高电平时使sda产生一个负跳变
- void iic_start(device)
- {
- sda(device,1);
- scl(device,1);
- iic_delay(iic_delay_time);
- sda(device,0);
- iic_delay(iic_delay_time);
- scl(device,0);
- iic_delay(iic_delay_time/2);
- }
- //终止I2C总线,当scl为高电平时使sda产生一个正跳变
- void iic_stop(device)
- {
- scl(device,0);
- sda(device,0);
- scl(device,1);
- iic_delay(iic_delay_time);
- sda(device,1);
- iic_delay(iic_delay_time);
- }
- //发送应答信号
- void iic_ack(device) {
- sda(device,0);
- scl(device,1);
- scl(device,0);
- sda(device,1);
- }
- //发送无应答信号
- void iic_noack(device)
- {
- sda(device,1);
- scl(device,1);
- scl(device,0);
- }
- //检测应答信号
- bit iic_testack(device)
- {
- bit errorbit; //真确应答,返回0
- sda(device,1);
- iic_delay(iic_delay_time);
- scl(device,1);
- iic_delay(iic_delay_time);
- errorbit=sdasense(device);
- scl(device,0);
- iic_delay(iic_delay_time);
- return(errorbit);
- }
- //发送一个字节
- void iic_write8bit(device,unsigned char input)
- {
- unsigned char temp;
- for(temp=0;temp<8;temp++)
- {
- if((input<<temp)&0x80)
- sda(device,1);
- else
- sda(device,0);
- scl(device,1);
- iic_delay(iic_delay_time);
- scl(device,0);
- }
- }
- //读一个字节
- unsigned char iic_read8bit(device)
- {
- unsigned char temp,rbyte=0;
- for(temp=0;temp<8;temp++)
- {
- scl(device,1);
- iic_delay(iic_delay_time);
- if(sdasense(device))
- rbyte=(rbyte<<1)+1;
- else
- rbyte=rbyte<<1;
- scl(device,0);
- }
- return(rbyte);
- }