历史上的今天
返回首页

历史上的今天

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

正在发生

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

2018-03-12 来源: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;
}


推荐阅读

史海拾趣

Fagor Electrónica公司的发展小趣事

如今,Fagor Electrónica已经成为电子和数字领域的领军企业之一。展望未来,公司将继续秉承创新驱动的发展理念,加大在人工智能、物联网等新兴领域的投入。同时,Fagor Electrónica还将积极参与全球市场竞争,拓展更广阔的市场空间。相信在不久的将来,Fagor Electrónica将会创造更加辉煌的业绩。

Fastron公司的发展小趣事

Fastron公司起源于XXXX年的德国,凭借其卓越的技术和产品质量,逐渐在电感器领域崭露头角。随着业务的发展,Fastron不仅保留了德国的精湛工艺和严格品质控制,还成功地将业务拓展到了东欧和东南亚。这些地区的生产设施均通过TS 16949和ISO 14001认证,确保了产品的全球统一品质。

Friedrich Lütze GmbH公司的发展小趣事

在电子行业的萌芽期,Friedrich Lütze GmbH 由弗里德里希·吕策(虚构姓名,代表公司创始人)于20世纪中期创立。当时,电子行业正处于快速发展阶段,吕策凭借对电气技术的深厚理解和敏锐的市场洞察力,决定专注于工业自动化控制领域。公司初期主要研发和生产电子控制元件,如继电器和接触器,这些产品凭借高质量和稳定性迅速在市场上获得认可,为公司的后续发展奠定了坚实基础。

EKIT公司的发展小趣事

2023年10月,华为坤灵(HUAWEI eKit)在香港成功举办了分销新品发布会。针对香港市场的特点,HUAWEI eKit展示了面向SOHO办公、酒店餐饮、商业地产、零售商超等场景的新品,并通过整合政策、产品、解决方案、服务和数字工具平台等措施,助力香港区域分销伙伴不断开拓中小企业市场。通过与联强国际(香港)有限公司(SYNNEX)的紧密合作,HUAWEI eKit成功吸引了超过100名香港分销商参与此次发布会,进一步巩固了其在香港市场的地位。

Fibrefab Limited公司的发展小趣事

面对全球环境问题日益严峻的现状,Fibrefab积极响应环保号召,推动绿色生产和可持续发展。公司采用环保材料和生产工艺,降低产品生产和使用过程中的能耗和排放。同时,Fibrefab还积极参与环保公益活动和社会责任项目,为保护环境贡献自己的力量。这一举措不仅提升了Fibrefab的企业形象和社会责任感,也为其长期发展奠定了坚实基础。

DAVE Embedded Systems公司的发展小趣事

在稳固国内市场的同时,DAVE Embedded Systems也开始积极拓展国际市场。他们参加了多个国际电子展会,与全球各地的潜在客户建立了联系。通过与国际知名企业的合作,公司成功将产品打入欧美市场,并取得了良好的销售业绩。此外,公司还加强了与国际研发机构的合作,共同开发新技术和新产品,以保持在行业中的领先地位。

问答坊 | AI 解惑

2008-2009手机热点展望

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 2007年,随着一声“手机生产核准制正式取消”的赦令,大批所谓的“黑手机”厂商如雨后春笋般破土而出,加之MTK积极的方案提供和技术支持推波助澜,大大降低了手机设计的入行门槛。手机 ...…

查看全部问答>

Lenze有没有可以连接多台电机的驱动器?

Lenze有没有可以连接多台电机的驱动器? 如题,一个驱动器连接多个电机,这需要驱动器有多个电机接口,包括多套UVW输出和多个编码器的输入,Lenze有这样的驱动器吗?其他品牌的伺服有吗?恳请高手指点,谢谢!…

查看全部问答>

I have a dream!IBM T23能否当场个X86结构的嵌入式开发板?

I have a dream! 本人闲置一台IBM T23笔记本,闲来无事,有以下想法: IBM T23能否当场个X86结构的嵌入式开发板? 请大家多多发言...…

查看全部问答>

高分急求带FIFO UART源程序!!!

小妹刚接触VHDL语言不久,求一个带FIFO UART源程序,FIFO:  8位 深度:16,求各位给个源程序,急用,谢谢!…

查看全部问答>

求助这样该如何计算总功率?

 一条生产线,用到多个200W和400W的电机,由于通用和经济的考虑变频器全都用750W的,请问这条生产线根据什么计算总功率?…

查看全部问答>

梦之旅同学EZ430系列学习笔记和智能家居系统项目之DHT11

  虽然之前有同学传了DHT11的程序,但我发现那个程序不好用,呵呵,我的在那时候也调通了,然后现在我参考下那位同学程序,优化了一下相关结构,传下我的DHT11,也说下我的DHT11开发经历,今天上传三章,呵呵,今天这项目算完结了,多谢大家关 ...…

查看全部问答>

请教:uart、can、Eth等通信接口配置好后,如何通过软件查询其是否工作正常?

本人最近用 LM3S 9B81做一个项目,需要随时应答 上位机发送的 各个端口状态查询信息,请问 假如没有数据收发,我如何反应出 各个通信端口状态是正常的呢?谢谢…

查看全部问答>

求交流假电子负载方案

现在准备电子设计竞赛,做一个电子假负载的题目,开始直流模式下的恒流恒压横阻模式已完成,但负载不能进交流,求各路大神提供一下能进交流的电子负载原理电路或方案,要测量交流电源内阻的……小弟在此谢过了。。。谢谢!做了差不多3个星期了,没想 ...…

查看全部问答>

LM3S RTX 任务处理

//*******************************************************************os_tsk_create() #include <rtl.h> OS_TID os_tsk_create (  void (*task)(void),  /* Task to create建立任务 */  U8  priority ); &n ...…

查看全部问答>