历史上的今天
返回首页

历史上的今天

今天是:2025年03月09日(星期日)

正在发生

2018年03月09日 | 读写24LCxx系列的EEPROM的实例C语言程序

2018-03-09 来源:eefocus

    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
#i nclude   // Load I2C Header file from defult direct
#i nclude
#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
}

#pragma code

     

    //************************************************
//* Function: isr_high(void)                    *    
 //*  High priority interrupt for Timer2        *        
 //************************************************
#pragma interrupt isr_high

    void isr_high(void)
{
 PIR1bits.TMR2IF=0;    // Clear Timer2 interrupt Flag
 
 if (Debounce==0)
 {
  if (!SW2)
  { P_SW2=1; Debounce =Bounce_Time; } 
  if (!SW6) 
  { P_SW6=1; Debounce =Bounce_Time; } 
 }  
 else if (SW2 & SW6)Debounce--; 
  else Debounce =Bounce_Time;    
}        
#pragma code

    //***********************************************
//*        Write a Byte to EEPROM              
 //*  - CTRl : Control Byte of EEPROM    
//*  - addr : LOCation of EEPROM    
//*  - data : Data Byte of EEPROM    
 //***********************************************

    void Initialize_Timer2(void)
{

      RCONbits.IPEN=1;  // Enable Interrupt Priority bit
  IPR1bits.TMR2IP=1;  // Set Timer2 for High Priority
  INTCONbits.GIEH=1;  // Enable High Priority Interrupt

      OpenTimer2 (TIMER_INT_ON  // Turn On the Timer2 with Interrupt
      & T2_PS_1_4  // (4MHz/4) [4*10*(99+1)] = 4mS */
      & T2_POST_1_10);

      PR2 = 99;
}

    //***********************************************
//*        Write a Byte to EEPROM              *
//*  - ctrl : Control Byte of EEPROM  *
//*  - addr : Location of EEPROM  *
//*  - data : Data Byte of EEPROM    *
//***********************************************
void EEPROM_Write(unsigned char ctrl,unsigned char addr,unsigned char data)
{
 IdleI2C();                // ensure module is idle
  StartI2C();      // Start condition
 I2C_Done();      // Wait Start condition completed and clear SSPIF flag   

     WriteI2C(ctrl);    // Write Control+Write to EEPROM & Check BF flag
 while(SSPCON2bits.ACKSTAT);  // wait until received the AcknowLEDge from EEPROM
 I2C_Done();      // Clear SSPIF flag

     WriteI2C(addr);    // Write Address to EEPROM
 while(SSPCON2bits.ACKSTAT);  // wait until received the Acknowledge from EEPROM
 I2C_Done();

     WriteI2C(data);    // Write Data to EEPROM
 while(SSPCON2bits.ACKSTAT);  // wait until received the Acknowledge from EEPROM
 I2C_Done();

     StopI2C();      // Stop condition
 I2C_Done();      // Wait the Stop condition completed
}

    //***********************************************
//*        Pae Write to EEPROM                
//*
//*  - ctrl : Control Byte of EEPROM  
//*  - addr : Location of EEPROM    
//*  - length : Write counter
//*  - *dptr : RAM point --> EEPROM
//* 
//***********************************************
void EE_Page_Write(unsigned char ctrl,unsigned char addr,unsigned char length,unsigned char *dptr)
{
 IdleI2C();                // ensure module is idle
  StartI2C();      // Start condition
 I2C_Done();      // Wait Start condition completed
 
 WriteI2C(ctrl);    // Write Control+Write to EEPROM & Check BF flag
 while(SSPCON2bits.ACKSTAT);  // wait until received the Acknowledge from EEPROM
 I2C_Done();      // Clear SSPIF flag

     WriteI2C(addr);    // Write Address to EEPROM
 while(SSPCON2bits.ACKSTAT);  // wait until received the Acknowledge from EEPROM
 I2C_Done();

     while (length!=0)    // Check write completed ?
 {
  WriteI2C(*dptr);  // Write data to EEPROM
  while(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROM
  I2C_Done(); 
  dptr++;      // Point to next byte
  length--;
 }
 
 StopI2C();      // Stop condition
 I2C_Done();      // Wait the Stop condition completed

 
//***********************************************
//*        EEPROM Acknowledge Polling          *
//*  --  The routine will polling the ACK  *
//*      response from EEPROM      *
//*  --  ACK=0 return        *
//*  --  ACK=1 send Restart & loop check  *
//***********************************************
void EEPROM_ACK(unsigned char ctrl)
{
 unsigned char i;

     IdleI2C();                // ensure module is idle
  StartI2C();      // Start condition
 I2C_Done();      // Wait Start condition completed

     WriteI2C(ctrl);    // Write Control to EEPROM (WRITE)
 I2C_Done();      // Clear SSPIF flag

     while (SSPCON2bits.ACKSTAT)  // test for Acknowledge from EEPROM
    {
  for (i=0;i<100;i++);  // Delay for next Repet-Start

          RestartI2C();              // initiate Repet-Start condition
  I2C_Done();          // Wait Repet-Start condition completed

      WriteI2C(ctrl);    // Write Control to EEPROM (WRITE)
  I2C_Done();      // Clear SSPIF flag 
    }  
  StopI2C();                      // send STOP condition
 I2C_Done();      // wait until stop condition is over 
}

    //***********************************************
//*    Random Read a Byte from EEPROM          *
//*  - ctrl : Control Byte of EEPROM (Write) *
//*    (Ctrl +1 ) : Read Command    *
//*  - addr : Address Byte of EEPROM  *
//*  - Return : Read Data from EEPROM  *
//***********************************************
unsigned char EEPROM_Read(unsigned char ctrl,unsigned char addr)
{
 unsigned char f;
 
 IdleI2C();                // ensure module is idle
  StartI2C();      // Start condition
 I2C_Done();      // Wait Start condition completed

     WriteI2C(ctrl);    // Write Control to EEPROM    
    while(SSPCON2bits.ACKSTAT);    // test for ACK condition, if received
 I2C_Done();      // Clear SSPIF flag

     WriteI2C(addr);    // Write Address to EEPROM        
     while(SSPCON2bits.ACKSTAT);  // test for ACK condition, if received  
 I2C_Done();      // Clear SSPIF flag

        RestartI2C();                // initiate Restart condition
 I2C_Done();

     WriteI2C(ctrl+1);    // Write Control to EEPROM              
 while(SSPCON2bits.ACKSTAT);    // test for ACK condition, if received
 I2C_Done();      // Clear SSPIF flag

     f=ReadI2C();    // Enable I2C Receiver & wait BF=1 until received data
 I2C_Done();      // Clear SSPIF flag

     NotAckI2C();    // Genarate Non_Acknowledge to EEPROM
 I2C_Done();    
                    
     StopI2C();                  // send STOP condition
 I2C_Done();      // wait until stop condition is over

     return(f);      // Return Data from EEPROM 
}

    //***********************************************
//*        Sequential Read from EEPROM                
//*
//*  - ctrl : Control Byte of EEPROM  
//*  - addr : Location of EEPROM    
//*  - length : Read counter
//*  - *dptr : Store EEPROM data to RAM

//* 
//***********************************************
void EE_SEQU_Read(unsigned char CTRl,unsigned char addr,unsigned char length,unsigned char *dptr)
{
 IdleI2C();                // ensure module is idle
  StartI2C();      // Start condition
 I2C_Done();      // Wait Start condition completed

     

     WriteI2C(ctrl);    // Write Control to EEPROM    
    while(SSPCON2bits.ACKSTAT);    // test for ACK condition, if received
 I2C_Done();      // Clear SSPIF flag

     WriteI2C(addr);    // Write Address to EEPROM        
     while(SSPCON2bits.ACKSTAT);  // test for ACK condition, if received  
 I2C_Done();      // Clear SSPIF flag

        RestartI2C();                // initiate Restart condition
 I2C_Done();

     WriteI2C(ctrl+1);    // Write Control to EEPROM              
 while(SSPCON2bits.ACKSTAT);    // Test for ACK condition, if received
 I2C_Done();      // Clear SSPIF flag

     while (length!=0)
 {
  *dptr=ReadI2C();  // Enable I2C Receiver & Store EEPROM data to Point buffer 
  I2C_Done(); 
  dptr++; 
  length--;
    
  if (length==0) NotAckI2C();
  else AckI2C();    // Continue read next data, send a acknowLEDge to EEPROM
  
  I2C_Done();
 }

        StopI2C();                  // send STOP condition
 I2C_Done();      // wait until stop condition is over 
}

    //***********************************************
//*  Check I2C action that is completed        *
//***********************************************
void I2C_Done(void)
{
 while (!PIR1bits.SSPIF);  // Completed the action when the SSPIF is Hi.
 PIR1bits.SSPIF=0;      // Clear SSPIF
}

    //************************************************
//* Initial I2C Master Mode with 7 bits Address  *
//* CLOCk Speed : 100KHz @4MHz      *
//************************************************
void Initialize_I2C_Master(void)
{
 OpenI2C(MASTER,SLEW_ON);
 SSPADD= 9;
}


推荐阅读

史海拾趣

Alan Industries Inc公司的发展小趣事

随着产品技术的不断提升,Alan Industries Inc.开始积极拓展市场。公司制定了详细的市场营销策略,通过线上线下的多渠道推广,成功将产品打入国内外市场。同时,公司还注重品牌建设,通过优质的产品和服务赢得了消费者的信任和口碑。随着品牌知名度的提升,公司的市场份额不断扩大,成为电子行业中的佼佼者。

Anpec(茂达)公司的发展小趣事

随着技术的不断发展,茂达电子在产品研发上不断取得突破。公司投入大量人力、物力进行技术研发,并与多家国内外著名大学和研究机构合作,共同推进模拟集成电路设计的创新。经过不懈的努力,茂达电子成功推出了一系列世界领先的半导体器件产品,赢得了市场的广泛认可。

Corstat Containers公司的发展小趣事

为了提升竞争力,Corstat Containers公司不断创新服务模式。除了提供优质的电子产品包装解决方案外,公司还为客户提供定制化的服务,根据客户的需求量身定制产品。此外,公司还建立了完善的售后服务体系,为客户提供及时、专业的技术支持和售后服务,确保客户在使用过程中无后顾之忧。


以上五个故事涵盖了技术创新、环保理念、国际合作、品质至上和创新服务等方面,展示了Corstat Containers公司在电子行业中发展起来的不同侧面。然而,这些故事仅为虚构,实际情况可能有所不同。如需了解该公司的真实历史和发展情况,建议查阅相关资料或咨询相关人士。

Displaytech公司的发展小趣事

2012年,Displaytech进行了公司重组,SEACOMP成为公司各部门的主要实体。这次重组不仅优化了公司的组织架构,也进一步整合了公司的资源,提高了运营效率。同时,公司还在中国东莞购买了一家制造工厂,命名为MH MFG,加强了电子合同制造部门的力量。

这些故事只是Displaytech公司发展历程中的一部分,但它们充分展示了公司在电子行业中的实力、创新精神和国际化视野。通过不断的技术创新、产品升级和市场拓展,Displaytech已经成为电子行业中一家具有影响力的企业。

Bellin公司的发展小趣事

2008年,Displaytech推出了HDP Power,这是一项创新的电力解决方案,旨在支持公司客户的电力需求。这一举措不仅体现了Displaytech对客户需求的深刻洞察,也展示了公司在电源领域的技术实力。

Elytone Electronics Co Ltd公司的发展小趣事

Elytone Electronics Co Ltd成立于XXXX年,最初是一家仅有几名员工的小型电子产品加工厂。公司创始人凭借对电子技术的热爱和对市场敏锐的洞察力,带领团队开始了艰苦的创业之路。在资源有限的情况下,他们不断研发新产品,优化生产工艺,逐步在行业内建立起了一定的知名度。

问答坊 | AI 解惑

混音器电路

这是网上找的一个二输入混音器电路,但是我在用MULTISIM模拟时发现,他好像不是把两个信号简单的叠加,似乎把其中一个信号反相后再叠加? 是这样么?原理是什么?…

查看全部问答>

交叉编译apache遇到的问题

网上流传的大都是关于apache1.3.39的交叉编译步骤,我下载的http-2.2.9,找到一个此版本的交叉编译方法:http://203.208.37.104/search?q=cache:hrIbS-XEbrYJ:blog.xuite.net/bunny/blog/19764280+srclib/apr+arm&cd=2&hl=zh-CN&ct=clnk&gl=cn&st_u ...…

查看全部问答>

DM9000用于嵌入式工控产品的问题

我的嵌入式产品用的DM9000a, 用一台电脑能ping 通(偶尔丢包),不断电情况下,切换成另一台电脑,有时能ping通,有时ping 不通,并且10M/100M以及LINK灯灭,怎么回事啊?谢谢 …

查看全部问答>

S3C2410触摸屏驱动移植遇到问题

在将CE6.0的触摸屏驱动移植到FS2410时,编译通过了,但却得不到有效的触摸信息。得到的部分调试信息如下:   11941 PID:400002 TID:b1000a RELFSD: Opening file FS2410Touch.dll from desktop PB Debugger Loaded symbols for \'C:\\W ...…

查看全部问答>

WinCE下如何判断一个程序是否已经运行?

参考了一些桌面上的方案,发现在CE4.2下面都用不了,要么是mutex函数不支持多个参数,要么就是用不了Process类,大家能不能帮忙想想办法啊,看怎么实现判断程序是否运行的效果,如果已经运行了就不要再运行。…

查看全部问答>

求教关于TIMERA的捕获问题

使用的芯片是413 采用TA1的捕获模式从P1.2口测量频率周期,在测试板上使用按键模拟待测脉冲信号,结果发现按一次键会发生很多次捕获中断,为查明中断源有查TAIV,结果令人差异。代码如下: #include "msp430x41x.h" unsigned int m=1,l=1,o=1 ...…

查看全部问答>

请问430的C语言指令,一条指令就是一个时钟周期吗?

请问MSP430F149的C语言指令,一条指令就是一个时钟周期吗? 如果用汇编语言来写,一条指令就是一个周期对吗? 如果采用8MHZ的主时钟,一条指令就是125ns对吗? 从MSP430F149输出的MCLK是TTL电平吗?如果驱动COMS的串行时钟输入端要加上拉电阻吗 ...…

查看全部问答>

关于ds18b20读写时序的控制

最近一直在做温度传感器ds18b20的读写控制,感觉读写时序已经没有问题了,但是读出的数据始终是0,希望好心哥哥指点一下啊,我用ise 平台,vhdl语言写的代码~~~~ 芯片手册看了几百次了~求助啊…

查看全部问答>

求lm3s811芯片ft2232烧录的驱动以及烧录软件

麻烦有的能给我发一份吗?谢谢了.愿长期想各位请教!704114178@qq.com…

查看全部问答>