微控梦想

搜索:
您的位置: 首页 > 单片机 > » 正文

24LCxx系列的读写EEPROM的例C语言源程序实例

时间:   来源:嵌入网   作者:佚名   阅读:

PIC:读写24LCxx系列的EEPROM的实例C语言程序

//********************************************************* 
//*            Using I2C Master Mode for access Slave (EEPRM)  
//*                
//* Written by:  Richard Yang                                
//*              Sr. Corporate Application Engineer            
//*              Microchip Technology Inc.                
//* Date:        Oct. 3nd '2002                            
//* Revision: 1.00
//* Language tools : MPLAB-C18 v2.09.13
//*      MPLINK v3.10
//*      MPLAB-IDE v6.00.17 & ICD2                                  
//***********************************************************
/* Include Header files  */

#i nclude <p18f452.h>
#i nclude <i2c.h>   // Load I2C Header file from defult direct
#i nclude <timers.h>
#i nclude "P18LCD.h"   // Load P18LCD Header file form current working direct

/* Declare the Function Prototype */

void Initialize_I2C_Master(void);
void EE_Page_Write(unsigned char,unsigned char,unsigned char,unsigned char *);
void EE_SEQU_Read(unsigned char,unsigned char,unsigned char,unsigned char *);
void EEPROM_Write(unsigned char,unsigned char,unsigned char);
void EEPROM_ACK(unsigned char);
unsigned char EEPROM_Read(unsigned char,unsigned char);
void I2C_Done(void);
void Initialize_Timer2(void);
void isr_high_direct(void);
void isr_high(void);

#pragma romdata My_romdata=0x1000
const rom far unsigned char LCD_MSG1[]="SW2: Byte Write ";
const rom far unsigned char LCD_MSG2[]="SW6: Random Read";
const rom far unsigned char LCD_MSG3[]="Byte Write Mode ";
const rom far unsigned char LCD_MSG4[]="Random Read Mode";
const rom far unsigned char LCD_MSG5[]="Sended:         ";
const rom far unsigned char LCD_MSG6[]="Send:           ";
const rom unsigned char I2C_Write_Buffer[]="Microchip Technology";
#pragma romdata

/* Define following array in data memory */

unsigned char I2C_Read_Buffer [32];

/* define following variable in data memory at Access Bank */
#pragma udata access My_RAM
near unsigned char Debounce;
near unsigned char Send_Addr;
near unsigned char Send_Data;
near unsigned char Send_Length;
near unsigned char Read_Data;
near unsigned char P_SW2;
near unsigned char P_SW6;
#pragma udata

#define Page_Length 8
#define SW2  PORTAbits.RA4
#define SW6  PORTEbits.RE1
#define Bounce_Time 6
#define EE_CMD 0xA0

//***********************************************************
/*                 */
/*       Main  Program        */
/*                 */
//***********************************************************


void main(void)
{
 ADCON1=0b00000110;  // Disable A/D Function
 TRISAbits.TRISA4=1;  // Set SW2 for input
 TRISEbits.TRISE1=1;  // Set SW6 for Input
 Initialize_Timer2( );
 Initialize_I2C_Master( );
 OpenLCD( );
 
 if (SW2 & SW6)Debounce=0;
 else Debounce = Bounce_Time;
 
 while(1)
 {
  LCD_Set_Cursor(0,0);    // Put LCD Cursor on (0,0)
  putrsLCD(LCD_MSG1);
  LCD_Set_Cursor(1,0);    // Put LCD Cursor on (1,0)
  putrsLCD(LCD_MSG2);
 
  P_SW2=P_SW6=0;
  Send_Addr=0;
 
  while(1)
  {
   if (P_SW2)
   {
    P_SW2=0;
    Debounce = Bounce_Time;
    LCD_Set_Cursor(0,0);    // Put LCD Cursor on (0,0)
    putrsLCD(LCD_MSG3);
    LCD_Set_Cursor(1,0);    // Put LCD Cursor on (0,0)
    putrsLCD(LCD_MSG5);
   
    do
    {
     while (!P_SW2);
     P_SW2=0;
     LCD_Set_Cursor(1,8);
     Send_Data=I2C_Write_Buffer[Send_Addr];
     EEPROM_Write(EE_CMD,Send_Addr,Send_Data);
     puthexLCD(EE_CMD);
     putcLCD(' ');
     puthexLCD(Send_Addr);
     putcLCD(' ');
     puthexLCD(Send_Data);
     EEPROM_ACK(EE_CMD);
     Send_Addr++;
    } while (I2C_Write_Buffer[Send_Addr]!=0x00);
   break;
   }
  
   if (P_SW6)
   {
    P_SW6=0;
    Debounce = Bounce_Time;
    LCD_Set_Cursor(0,0);    // Put LCD Cursor on (0,0)
    putrsLCD(LCD_MSG4);
    LCD_Set_Cursor(1,0);    // Put LCD Cursor on (0,0)
    putrsLCD(LCD_MSG6);
   
  
    while(1)
    {
     if (P_SW6)
     {
     P_SW6=0;
     LCD_Set_Cursor(1,5);
     Read_Data = EEPROM_Read(EE_CMD,Send_Addr);
     puthexLCD(EE_CMD);
     putcLCD(' ');
     puthexLCD(Send_Addr);
     putcLCD(' ');
     puthexLCD(EE_CMD);
     putcLCD(' ');
     puthexLCD(Read_Data);
     Send_Addr++;
     }
     if (P_SW2) break;
    }
    if (P_SW2) break;
   }
   if (P_SW2)
   {
    P_SW2=0;
     break;
   }
  }
 }
}
//************************************************
//*       #pragma Interrupt Declarations         *
//*             *
//* Function: isr_high_direct                    *
//*   - Direct execution to the actual           *
//*     high-priority interrupt code.            *
//************************************************
#pragma code isrhighcode = 0x0008

void isr_high_direct(void)
{         
     _asm      //begin in-line assembly
     goto isr_high   //go to isr_high function
     _endasm     //end in-line assembly
}
------------ ---------- ----------- ---------- --------- -------- ------- ------ ----- ---- --- -- -  -  -