//i2c初始化子程序
void i2_cinit()
{TRISC=0X18;//RC3,RC4设定为输出
SSPADD=19;//8MHZ晶振设定传送率为100KHZ
SSPSTAT=0X80;
SSPCON=0X38;
}
//i2c发送启动信号子程序
void i2_cstart()
{for(n=255;n--;)
{for(m=255;m--;);} //延时一会
SEN=1; // 发送启动信号
while(SSPIF==0);
SSPIF=0;
}
//主程序
main()
{TRISD=0;
TRISB=0;
PORTB=0; //清输出
PORTD=0; //清输出
i2_cinit();
i2_cstart();
SSPBUF=0X29; //发送从机地址选通
while (STAT_BF==1);
while (ACKSTAT); //等待从机应答
while (SSPIF==0);
SSPIF=0;
RCEN=1;
while(SSPIF==0);
ACKDT=0;
ACKEN=1;
PORTB=SSPBUF; //B端口接8个发光二极管,显示从机传来的数据
SSPIF=0;
RCEN=1;
while(SSPIF==0);
PORTD_7=1; //RD7接发光二极管显示是否运行到这步
PORTB=SSPBUF;//B端口接8个发光二极管,显示从机传来的数据
while(1); // 暂停,看显示
}
###############################
###############################
//16F876作为被控发送器发送数据到主控接收器16F877
#include <pic.h>
#include <pic1687x.h>
#define PORTBIT(add,bit) ((unsigned)(&add)*8+(bit)
static bit GO @ PORTBIT(ADCON0,2);
static bit PORTC_0@ PORTBIT(PORTC,0);
static bit PORTC_1@ PORTBIT(PORTC,1);
static bit PORTC_2@ PORTBIT(PORTC,2);
static bit PORTC_3@ PORTBIT(PORTC,3);
void i2c_ini();
//i2c初始化
void i2c_ini()
{SSPCON=0X36;
SSPADD=0X28; //设定地址为0X28
do {;}
while(STAT_S==0);//检测到启动信号
PORTC_0=1;
while(SSPIF==0);
PORTB=SSPBUF; //8位发光二极管显示接受的地址
SSPIF=0;
}
main()
{TRISC=0X18; //RC3,RC4为输入
TRISB=0;
PORTB=0; //清端口B
PORTC=0;
SSPIF=0;
i2c_ini();
SSPBUF=0X73;//发送一个数据0X73
CKP=1;
while(SSPIF==0);
SSPIF=0;
SSPBUF=0XCD;//继续发送一个数据0XCD
CKP=1;
while(SSPIF==0)
PORTB=SSPBUF;
PORTC_2=1;//RC2接一个发光二极管,检测是否运行到这步
while(1);
}