文本名为 iic.h #ifndef _iic_h_ #define _iic_h_//pic单片机IIC通信初始化函数声明 void iiccsh(void); //pic单片机IIC通信读外围设备函数声明 //功能:传送一个8位地址,返回一个8位数据 unsigned char iicread(unsigned char data); //pic单片机IIC通信给外围器件发送函数声明 //功能:传送一个8位地址,传送一个8位数据或指令 void iicwrite(unsigned char diz,unsigned char data); #endif 文本名为 iic.c#ifndef _iic_h_ //立即写,立即读,在写读之间要有一定的延时(unsigned int sdf; sdf=400; while(sdf)--sdf;) #define _iic_h_ #include<pic.h> //pic单片机IIC通信初始化函数 void iiccsh(void) { TRISC3=1; TRISC4=1; //PIC单片机(对16F877A单片机而言IIC通信是RC3和RC4引脚)IIC通信时时钟引脚和数据引脚要设置成输入 SSPCON=0X28; //SSPCON同步串口控制寄存器设置成IIC通信功能使能和单片机主控方式 SSPCON2=0; //SSPCON2同步串口控制寄存器置0 SSPSTAT=0X80; //SSPSTAT同步串口状态寄存器设置成采用标准S模式(100Kb/s)和输入电平满足IIC总线标准 SSPADD=9; //SSPADD iic通信波特率寄存器 } //pic单片机IIC通信读外围设备函数 //功能:传送一个8位地址,返回一个8位数据 unsigned char iicread(unsigned char address) //address位 { unsigned char data; SSPIF=0; SEN=1; //在SDA和SCL线上建立和发送一个启动信号时序 while(!SSPIF); //判断是启动信号否发送完毕,SSPIF为1的时候是真 为0的时候是假 !SSPIF(1)为非真,为假退出语句 SSPIF=0; //软件清零 不会自动清零 SSPBUF=0XA0; //发送外设IIC器件地址和写信号 while(!SSPIF); SSPIF=0; SSPBUF=address; //发送要读外设IIC器件数据的地址 while(!SSPIF); //判断是否发送完毕 SSPIF=0; RSEN=1; //发送启动重启信号 while(!SSPIF); SSPIF=0; SSPBUF=0XA1; //发送外设IIC器件地址和读数据信号 while(!SSPIF); //每发送一个数据都要检测是否成功 SSPIF=0; RCEN=1; //设置读允许 while(SSPIF==0); data=SSPBUF; // while(SSPIF==0); SSPIF=0; ACKDT=0; //写入应答信号 ACKEN=1; //发送应答信号 while(!SSPIF); SSPIF=0; RCEN=0; PEN=1; //在SDA和SCL线上建立和发送一个停止信号时序 while(!SSPIF); //如果收到停止信号同样会置位 SSPIF=0; return(data); } //pic单片机IIC通信给外围器件发送函数声明 //功能:传送一个8位地址,传送一个8位数据或指令 void iicwrite(unsigned char diz,unsigned char data) { SSPIF=0; SEN=1; //在SDA和SCL线上建立和发送一个启动信号时序 while(!SSPIF); //判断是启动信号否发送完毕,SSPIF为1的时候是真 为0的时候是假 !SSPIF(1)为非真,为假退出语句 SSPIF=0; //软件清零 不会自动清零 SSPBUF=0XA0; //发送外设IIC器件地址和写信号 while(!SSPIF); //判断是否发送完毕 SSPIF=0; SSPBUF=diz; //发送要读外设IIC器件数据的地址 while(!SSPIF); //每发送一个数据都要检测是否成功 SSPIF=0; SSPBUF=data; //发送要读外设IIC器件要存储的数据或命令 while(!SSPIF); //每发送一个数据都要检测是否成功 SSPIF=0; PEN=1; //在SDA和SCL线上建立和发送一个停止信号时序 while(!SSPIF); //如果收到停止信号同样会置位 SSPIF=0; } #endif