文本名為 iic.h #ifndef _iic_h_ #define _iic_h_//pic單片機(jī)IIC通信初始化函數(shù)聲明 void iiccsh(void); //pic單片機(jī)IIC通信讀外圍設(shè)備函數(shù)聲明 //功能:傳送一個(gè)8位地址,返回一個(gè)8位數(shù)據(jù) unsigned char iicread(unsigned char data); //pic單片機(jī)IIC通信給外圍器件發(fā)送函數(shù)聲明 //功能:傳送一個(gè)8位地址,傳送一個(gè)8位數(shù)據(jù)或指令 void iicwrite(unsigned char diz,unsigned char data); #endif 文本名為 iic.c#ifndef _iic_h_ //立即寫,立即讀,在寫讀之間要有一定的延時(shí)(unsigned int sdf; sdf=400; while(sdf)--sdf;) #define _iic_h_ #include<pic.h> //pic單片機(jī)IIC通信初始化函數(shù) void iiccsh(void) { TRISC3=1; TRISC4=1; //PIC單片機(jī)(對(duì)16F877A單片機(jī)而言IIC通信是RC3和RC4引腳)IIC通信時(shí)時(shí)鐘引腳和數(shù)據(jù)引腳要設(shè)置成輸入 SSPCON=0X28; //SSPCON同步串口控制寄存器設(shè)置成IIC通信功能使能和單片機(jī)主控方式 SSPCON2=0; //SSPCON2同步串口控制寄存器置0 SSPSTAT=0X80; //SSPSTAT同步串口狀態(tài)寄存器設(shè)置成采用標(biāo)準(zhǔn)S模式(100Kb/s)和輸入電平滿足IIC總線標(biāo)準(zhǔn) SSPADD=9; //SSPADD iic通信波特率寄存器 } //pic單片機(jī)IIC通信讀外圍設(shè)備函數(shù) //功能:傳送一個(gè)8位地址,返回一個(gè)8位數(shù)據(jù) unsigned char iicread(unsigned char address) //address位 { unsigned char data; SSPIF=0; SEN=1; //在SDA和SCL線上建立和發(fā)送一個(gè)啟動(dòng)信號(hào)時(shí)序 while(!SSPIF); //判斷是啟動(dòng)信號(hào)否發(fā)送完畢,SSPIF為1的時(shí)候是真 為0的時(shí)候是假 !SSPIF(1)為非真,為假退出語(yǔ)句 SSPIF=0; //軟件清零 不會(huì)自動(dòng)清零 SSPBUF=0XA0; //發(fā)送外設(shè)IIC器件地址和寫信號(hào) while(!SSPIF); SSPIF=0; SSPBUF=address; //發(fā)送要讀外設(shè)IIC器件數(shù)據(jù)的地址 while(!SSPIF); //判斷是否發(fā)送完畢 SSPIF=0; RSEN=1; //發(fā)送啟動(dòng)重啟信號(hào) while(!SSPIF); SSPIF=0; SSPBUF=0XA1; //發(fā)送外設(shè)IIC器件地址和讀數(shù)據(jù)信號(hào) while(!SSPIF); //每發(fā)送一個(gè)數(shù)據(jù)都要檢測(cè)是否成功 SSPIF=0; RCEN=1; //設(shè)置讀允許 while(SSPIF==0); data=SSPBUF; // while(SSPIF==0); SSPIF=0; ACKDT=0; //寫入應(yīng)答信號(hào) ACKEN=1; //發(fā)送應(yīng)答信號(hào) while(!SSPIF); SSPIF=0; RCEN=0; PEN=1; //在SDA和SCL線上建立和發(fā)送一個(gè)停止信號(hào)時(shí)序 while(!SSPIF); //如果收到停止信號(hào)同樣會(huì)置位 SSPIF=0; return(data); } //pic單片機(jī)IIC通信給外圍器件發(fā)送函數(shù)聲明 //功能:傳送一個(gè)8位地址,傳送一個(gè)8位數(shù)據(jù)或指令 void iicwrite(unsigned char diz,unsigned char data) { SSPIF=0; SEN=1; //在SDA和SCL線上建立和發(fā)送一個(gè)啟動(dòng)信號(hào)時(shí)序 while(!SSPIF); //判斷是啟動(dòng)信號(hào)否發(fā)送完畢,SSPIF為1的時(shí)候是真 為0的時(shí)候是假 !SSPIF(1)為非真,為假退出語(yǔ)句 SSPIF=0; //軟件清零 不會(huì)自動(dòng)清零 SSPBUF=0XA0; //發(fā)送外設(shè)IIC器件地址和寫信號(hào) while(!SSPIF); //判斷是否發(fā)送完畢 SSPIF=0; SSPBUF=diz; //發(fā)送要讀外設(shè)IIC器件數(shù)據(jù)的地址 while(!SSPIF); //每發(fā)送一個(gè)數(shù)據(jù)都要檢測(cè)是否成功 SSPIF=0; SSPBUF=data; //發(fā)送要讀外設(shè)IIC器件要存儲(chǔ)的數(shù)據(jù)或命令 while(!SSPIF); //每發(fā)送一個(gè)數(shù)據(jù)都要檢測(cè)是否成功 SSPIF=0; PEN=1; //在SDA和SCL線上建立和發(fā)送一個(gè)停止信號(hào)時(shí)序 while(!SSPIF); //如果收到停止信號(hào)同樣會(huì)置位 SSPIF=0; } #endif