本文引用地址:http://m.butianyuan.cn/article/201611/321068.htm該過程的部分程序:
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void init() //端口初始化
{
TRISB=0X00;
PORTB=0X00;
TRISD=0x00;
PORTD=0x00;
TRISC=0XFF; //TRISC<4:3>=11即可
// PORTC=0X00;
SSPSTAT=0X80;
SSPCON=0X38;
SSPCON2=0X00;
SSPADD=0x09;
}
void didi(uchar num) //蜂鳴器,檢測讀寫是否完成
{
uchar di_num;
for(di_num=num;di_num>0;di_num--)
{
RD0=1;
delay(500);
RD0=0;
delay(500);
}
}
void write() //寫函數(shù)
{
uchar i;
SSPIF=0;
SEN=1; //啟動信號
while(!SSPIF); //1的時候是真 0的時候是假 !SSPIF為非真,為假退出語句
SSPIF=0; //軟件清零 不會自動清零
SSPBUF=0XA0; //發(fā)送設備片選地址 即1010 A0 A1 A2 R/W
while(!SSPIF); //判斷是否發(fā)送完畢
SSPIF=0;
SSPBUF=add; //發(fā)送E2PROM內(nèi)存儲地址00~FF
while(!SSPIF); //監(jiān)測數(shù)據(jù)是否發(fā)完
SSPIF=0;
//此處似乎缺ACK應答
for(i=0;i<6;i++) //寫入數(shù)據(jù)
{
SSPBUF=ee_data[i];//每發(fā)送一個數(shù)據(jù)都要檢測是否成功
while(!SSPIF); //判斷
SSPIF=0;
}
PEN=1; //發(fā)送停止信號
while(!SSPIF);//如果收到停止信號同樣會置位
SSPIF=0;
didi(1); //如果寫成功發(fā)出兩聲嘀嘀 此處可有可無
}
void read() //讀函數(shù)
{
uchar i;
SSPIF=0;
SEN=1; // 啟動信號
while(!SSPIF);//如果啟動成功 置位
SSPIF=0; //同樣清零
SSPBUF=0XA0; //發(fā)送片選地址 即1010 A0 A1 A2 R/W
while(!SSPIF); //判斷是否發(fā)送完畢
SSPIF=0;
//此處似乎也需要應答ACK
SSPBUF=add; //E2PROM片內(nèi)寫數(shù)據(jù)地址從00到FF中的任意一個
while(!SSPIF); //監(jiān)測數(shù)據(jù)是否發(fā)完
SSPIF=0;
SSPIF=0;
//又一個ACK應答
RSEN=1; //重啟信號
while(!SSPIF); //監(jiān)測數(shù)據(jù)是否發(fā)完
SSPIF=0;
SSPBUF=0XA1; //傳輸方向即開始讀取數(shù)據(jù)
while(!SSPIF); //監(jiān)測數(shù)據(jù)是否發(fā)完
SSPIF=0;
for(i=0;i<6;i++) //接受的數(shù)據(jù)
{
RCEN=1;
while(!SSPIF);
read_data[i]=SSPBUF;//read_data[i]為SSPBUF中讀回來的數(shù) 每讀一次IIC地址自動加1
while(!SSPIF);
SSPIF=0; //等待read_data[i]將數(shù)據(jù)讀走標志位清零
if(i>=5)
{ ACKDT=1;} //應答標志
else { ACKDT=0;}
ACKEN=1;
while(!SSPIF);
SSPIF=0;
}
//此處好像有一個ACK應答
PEN=1; //讀操作完畢
while(!SSPIF); //監(jiān)測
SSPIF=0;
didi(3);
}
評論