#include <pic.h> //采用SSP模块I2C从模式,写入24C02中0-255数,并读出以三位数码管显示
__CONFIG(0x3B31);
unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};//0-F--共阴极数码管注:
unsigned char tmp[]={0,0,0};
void delay1ms(unsigned int x)
{
unsigned char i;
for(;x>0;x--)
for(i=0;i<165;i++);
}
void init()
{
TRISA=0x00;
PORTA=0x00;
TRISD=0x00;
PORTD=0x00;
TRISC=0x18; //使用RC3-SCL,RC4-SDA
SSPSTAT=0x80; //0x00,采用400KHz模式
SSPCON=0x38;//001(SSPEN开串行通讯)1(CKP高电平空闲,因为I2C必须加上拉电阻,所以设定高电平空闲)1000 I2C主控方式,时钟=Fosc/[4*(SSPAD+1)]
SSPCON2=0X00; //
SSPADD=0X09; //在I2C主控器的工作方式下,该寄存器被用作波特率发生器的定时参数装载寄存器
}
void write(unsigned char add,unsigned char data)
{
SSPIF=0;
SEN=1;
while(SSPIF==0);
SSPIF=0;
SSPBUF=0xA0; //写器件地址
while(SSPIF==0);
SSPIF=0;
SSPBUF=add; //写EEPROM内数据地址
while(SSPIF==0);
SSPIF=0;
SSPBUF=data; //写入EEPROM数据
while(SSPIF==0);
SSPIF=0;
PEN=1; //停止I2C总线
while(SSPIF==0);
SSPIF=0;
delay1ms(10);
}
unsigned char read(unsigned char add)
{
unsigned char tmp;
SSPIF=0;
SEN=1;
while(SSPIF==0);
SSPIF=0;
SSPBUF=0xA0; //发送器件地址
while(SSPIF==0);
SSPIF=0;
SSPBUF=add; //发送要读EEPROM数据地址
while(SSPIF==0);
SSPIF=0;
RSEN=1; //重启信号
while(SSPIF==0);
SSPIF=0;
SSPBUF=0xA1; //装入地址同时1表示读
while(SSPIF==0);
SSPIF=0;
RCEN=1; //允许接收
while(SSPIF==0);
tmp=SSPBUF;
while(SSPIF==0);
SSPIF=0;
ACKDT=1; //写入应答信号
ACKEN=1; //发送应答信号
while(SSPIF==0);
SSPIF=0;
PEN=1; //停止总线
while(SSPIF==0);
SSPIF=0;
return(tmp);
}
void display()
{
unsigned char i,LED;
LED=0x01;
for(i=0;i<3;i++)
{
PORTD=tab[tmp[i]];
PORTA=LED;
delay1ms(2);
LED<<=1;
PORTD=0x00;
}
}
void main()
{
unsigned char i,read_data,nums;
init();
for(i=0;i<255;i++)
write(i,i);
while(1)
{
for(i=0;i<255;i++)
{
read_data=read(i);
tmp[2]=read_data/100%10;
tmp[1]=read_data/10%10;
tmp[0]=read_data%10;
for(nums=0;nums<200;nums++)
display();
}
}
}
评论0