#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單片機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