//在pic16f877a外围挂接一个AT24C1024芯片
//向其中依次写入0到9,再依次读出,数码管显示
//用I2C通信实现
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3b31);
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f};
uchar read_data[9];
void delay(uint z);
void I2Cinit();
void I2Cwrite();
void I2Cread();
void main()
{
I2Cinit();
I2Cwrite();
delay(50);
I2Cread();
while(1)
{
uchar i;
for(i=0;i<9;i++)
{
PORTD=read_data[i];
delay(500);
RA0=1;RA1=1;//加入指示灯调程序
delay(100);
RA0=0;RA1=0;
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void I2Cinit()
{
INTCON=0;
PIE1=0;
PIE2=0;
TRISC=1;//设置为输入
TRISD=0;
TRISA=0;
SSPSTAT=0x80;//标准速度100K其他的都为检测位先设为零
SSPCON=0x38;//使能同步串口SSP 时钟为100K
SSPCON2=0;
SSPADD=0x09;
RA0=1;
delay(10);//调程序标志
RA0=0;
}
void I2Cwrite()
{
uchar i;
SSPIF=0;
SEN=1; //使能ssp通信
while(!SSPIF);//通过检测 sspif 代替应答信号
SSPIF=0;
SSPBUF=0xA0; //发送器件地址P0=0;A=0;
while(!SSPIF);
SSPIF=0;
SSPBUF=0; //发送写的地址的高八位
while(!SSPIF);
SSPIF=0;
SSPBUF=0x01; //发送写的地址的低八位0x01
while(!SSPIF);
SSPIF=0;
for(i=0;i<9;i++)
{
SSPBUF=table[i];//依次写入要写的9个数
while(!SSPIF);
SSPIF=0;
RA0=1;
delay(100);
RA0=0;
}
PEN=1; //发送停止信号
while(!SSPIF);
SSPIF=0;
}
void I2Cread()
{
uchar i;
SSPIF=0;
SEN=1;
while(!SSPIF);
SSPIF=0;
SSPBUF=0xA0;
while(!SSPIF);
SSPIF=0;
SSPBUF=0; //发送写的地址的高八位
while(!SSPIF);
SSPIF=0;
SSPBUF=0x01; //发送写的地址的低八位0x01;
while(!SSPIF);
SSPIF=0;
// SSPIF=0;
RSEN=1; //发送开始信号
while(!SSPIF);
SSPIF=0;
SSPBUF=0xA1; //读指令
while(!SSPIF);
SSPIF=0;
for(i=0;i<9;i++)
{
RCEN=1;
while(!SSPIF);
read_data[i]=SSPBUF;
while(!SSPIF);
SSPIF=0;
RA1=1;
delay(100);
RA1=0;
if(i>=8)
{
ACKDT=1;
}
else
{
ACKDT=0;
}
ACKEN=1;
while(!SSPIF);
SSPIF=0;
}
PEN=1;
while(!SSPIF);
SSPIF=0;
}
就是不出结果,搞不定了 |