⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at24c08.c

📁 用PIC单片机的I2C接口读写片外EEPROM(AT24C08,也可以直接用到AT24C01/02/04/16)
💻 C
字号:
/***************************************************
说明:本程序是的开发环境是microchip MPLAB 7.20,
       编译器是PICC18V8.35
	   本人使用的MCU是PIC18F4520,EEPROM 是AT24C08
	   使用的是I2C接口

原型:Delay(unsigned int)  
功能:延时子程序

原型:void IIC_ByteWrite(unsigned int Addr,unsigned char WData)
功能:写数据WData到地址Addr

原型:unsigned char IIC_RandomRead(unsigned int Addr)
功能:读取地址Addr的数据

原型:void IIC_PageWrite(unsigned int Addr,far unsigned char *Buf,unsigned char NByte)
功能:从指针Buf开始取NByte个字节写到Addr开始的EEPROM(NByte<=16)

原型:void IIC_SeqRead(unsigned int Addr,far unsigned char *Buf,unsigned char NByte)
功能:从地址Addr开始连续读取NByte个字节,并存放到指针Buf指向的空间
****************************************************/
#define WRITE   0XA0
#define READ    0XA1

void IIC_ByteWrite(unsigned int Addr,unsigned char WData)
{
   unsigned char Page,PageAddr;
   Page=(unsigned char)(Addr/256);
   PageAddr=(unsigned char)(Addr%256);
   SEN=1;
   do{}while(SSPIF==0);
   SSPIF=0;
   Delay(5);
   SSPBUF=WRITE|(Page<<1);
   do{}while(SSPIF==0);
   SSPIF=0;
   Delay(5);
   SSPBUF=PageAddr;
   do{}while(SSPIF==0);
   SSPIF=0;
   Delay(5);
   SSPBUF=WData;
   do{}while(SSPIF==0);
   SSPIF=0;  
   while(BF);
   Delay(5);
   PEN=1;
   do{}while(SSPIF==0);
   SSPIF=0;
   Delay(300);
   return;
}
unsigned char IIC_RandomRead(unsigned int Addr)
{
   unsigned char RData;
   unsigned char Page,PageAddr;
   Page=(unsigned char)(Addr/256);
   PageAddr=(unsigned char)(Addr%256);
   SEN=1;
   do{}while(SSPIF==0);
   SSPIF=0;
   Delay(5);
   SSPBUF=WRITE|(Page<<1);
   do{}while(SSPIF==0);
   SSPIF=0;
   SSPBUF=PageAddr;
   do{}while(SSPIF==0);
   SSPIF=0;
   Delay(5);
   RSEN=1;
   do{}while(SSPIF==0);
   SSPIF=0;
   SSPBUF=READ|(Page<<1);
   do{}while(SSPIF==0);
   SSPIF=0;
   RCEN=1;
   do{}while(SSPIF==0);
   SSPIF=0;
   while(BF==0);
   RData=SSPBUF;
   PEN=1;
   do{}while(SSPIF==0);
   SSPIF=0;
   Delay(30);
   return RData;

}

void IIC_PageWrite(unsigned int Addr,far unsigned char *Buf,unsigned char NByte)
{
   char i;
   unsigned char Page,PageAddr;
   Page=(unsigned char)(Addr/256);
   PageAddr=(unsigned char)(Addr%256);
   SEN=1;
   do{}while(SSPIF==0);
   SSPIF=0;
   Delay(5);
   SSPBUF=WRITE|(Page<<1);
   do{}while(SSPIF==0);
   SSPIF=0;
   Delay(5);
   SSPBUF=PageAddr;
   do{}while(SSPIF==0);
   SSPIF=0;
   Delay(5);
   for(i=NByte;i>0;i--)
   {
      SSPBUF=*Buf++;
      do{}while(SSPIF==0);
      SSPIF=0;
      while(RW);
      Delay(5);
   }
   PEN=1;
   do{}while(SSPIF==0);
   SSPIF=0;
   Delay(300);
   return;
}

void IIC_SeqRead(unsigned int Addr,far unsigned char *Buf,unsigned char NByte)
{
   char i;
   unsigned char Page,PageAddr;
   Page=(unsigned char)(Addr/256);
   PageAddr=(unsigned char)(Addr%256);
   SEN=1;
   do{}while(SSPIF==0);
   SSPIF=0;
   SSPBUF=WRITE|(Page<<1);
   do{}while(SSPIF==0);
   SSPIF=0;
   SSPBUF=PageAddr;
   do{}while(SSPIF==0);
   SSPIF=0;
   Delay(5);
   RSEN=1;
   do{}while(SSPIF==0);
   SSPIF=0;
   SSPBUF=READ|(Page<<1);
   do{}while(SSPIF==0);
   SSPIF=0;
   for(i=NByte;i>1;i--)
   {
     RCEN=1;
     do{}while(SSPIF==0);
     SSPIF=0;
     while(BF==0);
     *Buf++=SSPBUF;
     ACKDT=0; 
     ACKEN=1;
     do{}while(SSPIF==0);
     SSPIF=0;
     Delay(5);
   }
   RCEN=1;
   do{}while(SSPIF==0); 
   SSPIF=0;
   while(BF==0);
   *Buf=SSPBUF;
   PEN=1;
   do{}while(SSPIF==0);
   SSPIF=0;
   Delay(30);
   return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -