- 请问“连接多个相同地址I2C设备的C51程序”device,value函数类型怎么声明?
- #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); - }
|