新闻中心

EEPW首页>嵌入式系统>设计应用> PIC16F877A单片机 I2C模块 24CXXX存储器实现路径记忆

PIC16F877A单片机 I2C模块 24CXXX存储器实现路径记忆

作者: 时间:2016-11-24 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/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()//写函数
{
uchar i;
SSPIF=0;
SEN=1;//启动信号
while(!SSPIF);//1的时候是真0的时候是假!SSPIF为非真,为假退出语句
SSPIF=0;//软件清零不会自动清零
SSPBUF=0XA0;//发送设备片选地址 即1010 A0 A1 A2 R/W
while(!SSPIF);//判断是否发送完毕
SSPIF=0;
SSPBUF=add;//发送E2PROM内存储地址00~FF
while(!SSPIF);//监测数据是否发完
SSPIF=0;
//此处似乎缺ACK应答
for(i=0;i<6;i++)//写入数据
{
SSPBUF=ee_data[i];//每发送一个数据都要检测是否成功
while(!SSPIF);//判断
SSPIF=0;
}
PEN=1;//发送停止信号
while(!SSPIF);//如果收到停止信号同样会置位
SSPIF=0;
didi(1);//如果写成功发出两声嘀嘀此处可有可无

}
void read()//读函数
{
uchar i;
SSPIF=0;
SEN=1;//启动信号
while(!SSPIF);//如果启动成功 置位
SSPIF=0;//同样清零
SSPBUF=0XA0;//发送片选地址 即1010 A0 A1 A2 R/W
while(!SSPIF);//判断是否发送完毕
SSPIF=0;
//此处似乎也需要应答ACK
SSPBUF=add;//E2PROM片内写数据地址从00到FF中的任意一个
while(!SSPIF);//监测数据是否发完
SSPIF=0;
SSPIF=0;
//又一个ACK应答
RSEN=1;//重启信号
while(!SSPIF);//监测数据是否发完
SSPIF=0;
SSPBUF=0XA1;//传输方向即开始读取数据
while(!SSPIF);//监测数据是否发完
SSPIF=0;
for(i=0;i<6;i++)//接受的数据
{
RCEN=1;
while(!SSPIF);
read_data[i]=SSPBUF;//read_data[i]为SSPBUF中读回来的数 每读一次IIC地址自动加1
while(!SSPIF);
SSPIF=0;//等待read_data[i]将数据读走标志位清零

if(i>=5)
{ ACKDT=1;}//应答标志
else { ACKDT=0;}

ACKEN=1;
while(!SSPIF);
SSPIF=0;
}
//此处好像有一个ACK应答
PEN=1;//读操作完毕
while(!SSPIF);//监测
SSPIF=0;
didi(3);
}


上一页 1 2 下一页

评论


技术专区

关闭