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

📄 24cq512.c

📁 一个基于PIC18F单片机的开发的流量计量仪表
💻 C
字号:
//--------------------------- AT24C512.c ------------------------------//
//             		AT24C512	                 PIC18F6720
//					SCL <------------->	E2_CLK  			RC3/CLK  34
//					SDA <------------->E2_SDA_IN/_OUT	RC4/SDA  35
//					 WP <------------->E2_WP				RC2/CCP1 33
//					 A0 <-----|GND
//					 A1 <-----|GND		
//					 A2 <-----|GND
//---------------------------------------------------------------------//
#include "PIC18F6720_IO.h"
#include "PIC18F6720_PERIPHERYDEVICE.h"
#include "delays.h"		                 //soft delay Head Flie
						                 //Delay1TCY();  delay one TCY
                                         		//Delay10TCYx(uchar t); (255~0)*10TCY 
						                 //.....100........ 
                                         		//.....1K.........
 					                 	//.....10K........
						                 //if uchar t = 0  that delay time = 2560000tCY

//I/O define for PIC18F6720
#define E2PROM_SCLL			LATCbits.LATC3 = 0
#define E2PROM_SCLH			LATCbits.LATC3 = 1

#define E2PROM_SDAL			LATCbits.LATC4 = 0
#define E2PROM_SDAH			LATCbits.LATC4 = 1

#define E2PROM_SDA_SETIN   	DDRCbits.RC4 = 1
#define E2PROM_SDA_SETOUT  	DDRCbits.RC4 = 0

#define E2PROM_SDA_IN	   		PORTCbits.RC4

#define E2PROM_ENW  			LATCbits.LATC2 = 0
#define E2PROM_ENR			LATCbits.LATC2 = 1

#define dly6uS				Delay10TCYx(2)
#define dly10ms				Delay10KTCYx(4)

const unsigned char	E2PROM_CTLBYTE_W1 = 0xa0;		//A2= A1= A0= 0
const unsigned char	E2PROM_CTLBYTE_R1 = 0xa1;		
const unsigned char 	E2PROM_CTLBYTE_W2 = 0xa2;		//A2= A1 = 0 ,A0= 1 
const unsigned char	E2PROM_CTLBYTE_R2 = 0xa3;


//////////////////////////////////
////E2PROM START             //
////                                 //
////                                 //
////                                 //
//////////////////////////////////
void E2PRON_START (void)
{
  E2PROM_SDAH;
  E2PROM_SCLH;
  dly6uS;
  E2PROM_SDAL;
  dly6uS;
  E2PROM_SCLL;
}

//////////////////////////////////
////E2PROM STOP                 //
////                            //
////                            //
////                            //
//////////////////////////////////
void E2PROM_STOP (void)
{
  E2PROM_SDAL;
  dly6uS;
  E2PROM_SCLH;
  dly6uS;
  E2PROM_SDAH;
  dly6uS;
  E2PROM_SCLL;
}

//////////////////////////////////////////
////  MCU RECEIVE E2PROM ACK            //
////  MCU_R_ACK==0X00  ON ACK :ERROR    //
////  MCU_R_ACK==0X01  RECEIVE ACK :OK  //
////                                    //
//////////////////////////////////////////
unsigned char MCU_R_ACK (void)
{
  E2PROM_SCLL;
  dly6uS;
  E2PROM_SDA_SETIN; //SET P1.0 INPUT FOR SDA
  dly6uS;
  E2PROM_SCLH;
  dly6uS;
  if(E2PROM_SDA_IN)
    {
        E2PROM_SCLL;
        E2PROM_SDA_SETOUT;   //SET P1.0 OUTPUT
        dly6uS;
        return 0X00;
    }
  else
    {
        E2PROM_SCLL;
        E2PROM_SDA_SETOUT;   //SET P1.0 OUTPUT
        dly6uS;
        return 0X01;
    }
}

////////////////////////////////////////
////MCU SEND ACK TO E2PROM            //
////                                  //
////                                  //
////                                  //
////////////////////////////////////////
void MCU_T_ACK (void)
{
  E2PROM_SCLL;
  E2PROM_SDAL;
  dly6uS;
  E2PROM_SCLH;
  dly6uS;
  E2PROM_SCLL;
}

////////////////////////////////////////
////MCU SEND NOACK TO E2PROM          //
////                                  //
////                                  //
////                                  //
////////////////////////////////////////
void MCU_T_NOACK (void)
{


  E2PROM_SDAH;
  dly6uS;
  E2PROM_SCLH;
  dly6uS;
  E2PROM_SCLL;
  dly6uS;
}

////////////////////////////////////////
////MCU SEND 8BIT(BYTE) DATA TO E2PROM//
////                                  //
////                                  //
////                                  //
////////////////////////////////////////
void MCU_T_1BYTE (unsigned char tempiii)
{
  unsigned char iMTB;
//  E2PROM_ENW;
  dly6uS;
  for(iMTB=8;iMTB>0;iMTB--)
    {
      E2PROM_SCLL;
      if(tempiii&0X80)
      {
         E2PROM_SDAH;
         dly6uS;
      }
      else
      {
         E2PROM_SDAL;
         dly6uS;
      }
      tempiii=tempiii<<1;
      E2PROM_SCLH;
      dly6uS;
    }
  E2PROM_SCLL;
//  E2PROM_ENR;

}

/////////////////////////////////////////////
////MCU RECEIVE 8BIT(BYTE) DATA FROM E2PROM
////
////
////
/////////////////////////////////////////////
unsigned char MCU_R_1BYTE (void)
{
  unsigned char temp1MRB,iii1;
  E2PROM_SCLL;
  E2PROM_SDA_SETIN; //SET P1.0 INPUT FOR SDA
  for(iii1=8;iii1>0;iii1--)
      {
        temp1MRB = (temp1MRB<<1);
		dly6uS;
        E2PROM_SCLH;
		dly6uS;
        if(E2PROM_SDA_IN)
          temp1MRB += 0x01;
		dly6uS;
        E2PROM_SCLL;
		dly6uS;
      }
  E2PROM_SDA_SETOUT;               //SET P1.0 IS OUTPUT FOR SDA
  return temp1MRB;
}

////////////////////////////////////////////////////////////////////
////    MCU WRITE ONE BYTE DATA TO ONE ADDRESS IN THE E2PROM      //
////															  //
////															  //
////															  //
////////////////////////////////////////////////////////////////////
void WRITE_E2PROM(unsigned char *mcu_ramadd,unsigned int e2promadd,unsigned char nwe,unsigned char chipn)//n<=16
{
  unsigned char e2promaddl,e2promaddh;
//  DSGIE;
  E2PROM_ENW;
  e2promaddl = e2promadd & 0x00ff;//low addr
  e2promaddh = (e2promadd & 0xff00)>>8; 
  E2PRON_START();
  if(chipn == 0)		
  	MCU_T_1BYTE(E2PROM_CTLBYTE_W1);
  if(chipn ==1)
  	MCU_T_1BYTE(E2PROM_CTLBYTE_W2);
  MCU_R_ACK();
  MCU_T_1BYTE(e2promaddh);
  MCU_R_ACK();
  MCU_T_1BYTE(e2promaddl);
  MCU_R_ACK();
  while(nwe>0)
  {
     MCU_T_1BYTE(*mcu_ramadd);
     MCU_R_ACK();
     mcu_ramadd++;
     nwe--;
  }
  E2PROM_STOP();
  E2PROM_ENR;
  dly10ms;
  E2PROM_SCLH;////////////////////////////////////////////////////////////////////////////
//  ENGIE; 
}

////////////////////////////////////////////////////////////
////E2PROM READ n BYTES DATA FROM ONE ADDRESS
////
////
////
////////////////////////////////////////////////////////////
void READ_E2PROM(unsigned char *mcu_ramadd,unsigned int e2promadd,unsigned char nre,unsigned char chipn)
{
  unsigned char e2promaddl,e2promaddh;
//  DSGIE;
  e2promaddl = e2promadd & 0x00ff;
  e2promaddh = (e2promadd & 0xff00)>>8; 
  E2PRON_START();
  if(chipn == 0)		
  	MCU_T_1BYTE(E2PROM_CTLBYTE_W1);
  if(chipn ==1)
  	MCU_T_1BYTE(E2PROM_CTLBYTE_W2);
  MCU_R_ACK();
  MCU_T_1BYTE(e2promaddh);
  MCU_R_ACK();
  MCU_T_1BYTE(e2promaddl);
  MCU_R_ACK();
  E2PRON_START();
  if(chipn == 0)		
  	MCU_T_1BYTE(E2PROM_CTLBYTE_R1);
  if(chipn ==1)
  	MCU_T_1BYTE(E2PROM_CTLBYTE_R2);
  MCU_R_ACK();
  while(nre>1)
    {
      *mcu_ramadd = MCU_R_1BYTE();
      mcu_ramadd = mcu_ramadd+1;
      MCU_T_ACK();
      nre--;
    }
  *mcu_ramadd = MCU_R_1BYTE();
  MCU_T_NOACK();
  E2PROM_STOP();
  E2PROM_SCLH;////////////////////////////////////////////////////////////////////////////
//  ENGIE;
}


//////////////////////////////////////////////////////////////////////////////////////////
//
//
//
//////////////////////////////////////////////////////////////////////////////////////////
void WRITE_1_BYTE_E2PROM (unsigned char *mcu_ramadd,unsigned int e2promadd,unsigned char chipn)//singend byte write *n
{
  unsigned char e2promaddl,e2promaddh;
//  DSGIE;
  e2promaddl = e2promadd & 0x00ff;
  e2promaddh = (e2promadd & 0xff00)>>8; 
  E2PROM_ENW;  //WRITE ENABLE
  E2PRON_START();
  if(chipn == 0)		
  	MCU_T_1BYTE(E2PROM_CTLBYTE_W1);
  if(chipn ==1)
  	MCU_T_1BYTE(E2PROM_CTLBYTE_W2);
  MCU_R_ACK();
  MCU_T_1BYTE(e2promaddh);
  MCU_R_ACK();
  MCU_T_1BYTE(e2promaddl);
  MCU_R_ACK();
  MCU_T_1BYTE(*mcu_ramadd);
  MCU_R_ACK();
  E2PROM_STOP();
  dly10ms;
  E2PROM_ENR; //WRITE DISABLE
  E2PROM_SCLH;////////////////////////////////////////////////////////////////////////////
//  ENGIE;
}

////////////////////////////////////////////////////////////
////E2PROM READ 1 BYTES DATA FROM ONE ADDRESS
////
////
////
////////////////////////////////////////////////////////////
void READ_1_BYTE_E2PROM(unsigned char *mcu_ramadd,unsigned int e2promadd,unsigned char chipn)
{
  unsigned char e2promaddl,e2promaddh;
//  DSGIE;
  e2promaddl = e2promadd & 0x00ff;
  e2promaddh = (e2promadd & 0xff00)>>8; 
  E2PRON_START();
  MCU_T_1BYTE(E2PROM_CTLBYTE_W1);
  MCU_R_ACK();
  MCU_T_1BYTE(e2promaddh);
  MCU_R_ACK();
  MCU_T_1BYTE(e2promaddl);
  MCU_R_ACK();
  E2PRON_START();
  if(chipn == 0)		
  	MCU_T_1BYTE(E2PROM_CTLBYTE_R1);
  if(chipn ==1)
  	MCU_T_1BYTE(E2PROM_CTLBYTE_R2);
  MCU_R_ACK();
  *mcu_ramadd = MCU_R_1BYTE();
  MCU_T_NOACK();
  E2PROM_STOP();
  E2PROM_SCLH;////////////////////////////////////////////////////////////////////////////
 // ENGIE;
}


⌨️ 快捷键说明

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