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