当前位置:首页 > 技术学院 > 热搜器件
[导读]其实早就应该养成一个良好的程序备份习惯,现在放在这里即方便自己随时在其他地方调用、备份,也可以帮到需要的人。

其实早就应该养成一个良好的程序备份习惯,现在放在这里即方便自己随时在其他地方调用、备份,也可以帮到需要的人。
对于stc自带EEPROM来说,用起来唯一不太方便的地方就是每次修改任何一个字节需要将整个扇区都擦除才能修改,所以每次修改都要讲整个扇区内容用数组全部读出缓存起来,进行擦除操作,讲需要修改的内容在相应的数组位置修改好,再讲整个数组内容重新写入到EEPROM里,头文件中我已经将接口函数都写好啦。直接调用就行,不用考虑任何问题,而且地址也直接从0开始到 USING_CHAR_NUM-1(USING_CHAR_NUM最大可到512)

EEPROM.h-----------------------------------------------------------------------------------------------------
#ifndef __EEPROM_H__
#define __EEPROM_H__


unsigned char EepromReadByte(unsigned char addr);

void EepromWriteByte(unsigned char addr, unsigned char dat);
#endif

EEPROM.c-----------------------------------------------------------------------------------------------------
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;

sfr  IAP_DATA      =   0xC2;               //Flash data register
sfr  IAP_ADDRH     =   0xC3;              //Flash address HIGH
sfr  IAP_ADDRL     =   0xC4;              //Flash address LOW
sfr  IAP_CMD       =   0xC5;              //Flash command register
sfr  IAP_TRIG      =   0xC6;              //Flash command trigger
sfr  IAP_CONTR     =   0xC7;              //Flash control register

#define   CMD_IDLE      0                 //Stand-By
#define   CMD_READ      1                 //Byte-Read
#define   CMD_PROGRAM   2                 //Byte-Program
#define   CMD_ERASE     3                 //Sector-Erase

#define   ENABLE_IAP    0x82              //if SYSCLK<20MHz
//Start address for STC12C5A60S2 series EEPROM
#define   IAP_ADDRESS   0x0000
#define      USING_CHAR_NUM   11

void IapIdle();
BYTE IapReadByte(WORD addr);
void IapProgramByte(WORD addr, BYTE dat);
void IapEraseSector(WORD addr);

unsigned char EepromReadByte(unsigned char addr)
{
    return(IapReadByte(addr));
}

void EepromWriteByte(unsigned char addr, unsigned char dat)
{
    unsigned char eepromBUF[USING_CHAR_NUM];
    unsigned char i;
    for(i=0; i< USING_CHAR_NUM; i++)
    {
        eepromBUF[IAP_ADDRESS+i] = IapReadByte(IAP_ADDRESS+i);  
    }
    if(addr < USING_CHAR_NUM)
    {
        eepromBUF[IAP_ADDRESS+addr] = dat;
        IapEraseSector(IAP_ADDRESS);

        for(i=0; i< USING_CHAR_NUM; i++)
        {
            IapProgramByte(IAP_ADDRESS+i, eepromBUF[IAP_ADDRESS+i]);  
        }
    }
}
//void EepromInit(void)
//{
//    unsigned int tmp = 0;
//    _nop_();
//    _nop_();
//    _nop_();
//    tmp = IapReadByte(IAP_ADDRESS+1);
//    tmp = (tmp << 8) + IapReadByte(IAP_ADDRESS);
//    if(0xffff == tmp)
//    {
//        IapProgramByte(IAP_ADDRESS,(BYTE)0);
//        IapProgramByte(IAP_ADDRESS+1,(BYTE)0);
//        tmp = 0;  
//    }
//    tmp++;
//    IapEraseSector(IAP_ADDRESS);
//    IapProgramByte(IAP_ADDRESS,(BYTE)tmp );
//    IapProgramByte(IAP_ADDRESS+1,(BYTE)(tmp>>8) );
//      
//}


void IapIdle()
{
      IAP_CONTR = 0;      //Close IAP function
      IAP_CMD = 0;            //Clear command to standby
      IAP_TRIG = 0;                      //Clear trigger register
      IAP_ADDRH = 0x80;                 //Data ptr point to non-EEPROM area
      IAP_ADDRL = 0;                     //Clear IAP address to prevent misuse
}

BYTE IapReadByte(WORD addr)
{
      BYTE dat;                          //Data buffer
      IAP_CONTR = ENABLE_IAP;   //Open IAP function, and set wait time
      IAP_CMD = CMD_READ;        //Set ISP/IAP/EEPROM READ command
      IAP_ADDRL = addr;                 //Set ISP/IAP/EEPROM address low
      IAP_ADDRH = addr >> 8;      //Set ISP/IAP/EEPROM address high
      IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
      IAP_TRIG = 0xa5;                  //Send trigger command2 (0xa5)
      _nop_();  _nop_();                          //MCU will hold here until ISP/IAP/EEPROM
      //operation complete
      dat = IAP_DATA;            //Read ISP/IAP/EEPROM data
      IapIdle();                         //Close ISP/IAP/EEPROM function
      return dat;                        //Return Flash data
}

void IapProgramByte(WORD addr, BYTE dat)
{
  IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
      IAP_CMD = CMD_PROGRAM;     //Set ISP/IAP/EEPROM PROGRAM command
      IAP_ADDRL = addr;                 //Set ISP/IAP/EEPROM address low
      IAP_ADDRH = addr >> 8;            //Set ISP/IAP/EEPROM address high
      IAP_DATA = dat;                  //Write ISP/IAP/EEPROM data
      IAP_TRIG = 0x5a;                   //Send trigger command1 (0x5a)
      IAP_TRIG = 0xa5;                   //Send trigger command2 (0xa5)
      _nop_();   _nop_();                        //MCU will hold here until ISP/IAP/EEPROM
      //operation complete
      IapIdle();
}

void IapEraseSector(WORD addr)
{
      IAP_CONTR = ENABLE_IAP;  //Open IAP function, and set wait time
      IAP_CMD = CMD_ERASE;      //Set ISP/IAP/EEPROM ERASE command
      IAP_ADDRL = addr;                //Set ISP/IAP/EEPROM address low
      IAP_ADDRH = addr >> 8;         //Set ISP/IAP/EEPROM address high
      IAP_TRIG = 0x5a;                   //Send trigger command1 (0x5a)
      IAP_TRIG = 0xa5;                   //Send trigger command2 (0xa5)
      _nop_();  _nop_();                         //MCU will hold here until ISP/IAP/EEPROM
      //operation complete
      IapIdle();
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

单片机是STC12C5A60S2,用的是单片机的硬件SPI驱动的nRF24L01+,这个是从机(接收机的)。主机(发射机)是用的STC12C5A60S2单片机,软件模拟SPI。这个是硬件全貌。 STC12C5A60S2...

关键字: stc12c5a60s2 单片机 SPI程序

本程序是在基于STC12C5A60S2芯片基础上采用硬件PCA/PWM模块编写。

关键字: stc12c5a60s2 51单片机 C KEIL 头文件

在众多的51系列单片机中,要算国内STC 公司的1T增强系列更具有竞争力,因他不但和8051指令、管脚完全兼容,而且其片内的具有大容量程序存储器且是FLASH工艺的,如STC12C5A60S2单片机内部就自带高达60K...

关键字: stc12c5a60s2 51单片机 C KEIL

P430颅内出血检测设备的研制策略 1 引言 在中国有许多因创伤性颅脑损伤的患者急需抢救,但相当一部分颅内出血患者因未能及时诊断,延误了抢救和治疗时机.因而出现脑血肿或脑疝后压

关键字: 单片机 LCD 医疗设备 eeprom

1 前言   近年来,数字化电视技术迅猛发展,特别是遥控系统的面市,各厂商在电视机中加人微处理器(MCU),各种人工智能化彩电完全替代了老式电视手动(机械式)控制和记忆方式。随着电视专用

关键字: eeprom 串行通信 i2c总线

  U 盘即闪存盘,是一种用闪存进行数据存储的介质,通常使用USB 插头。U 盘体积极小、重量轻、可热插拔也可以重复写入。U 盘所储存的数据,现今仍大多通过计算机提取并进行处理,这也局限了U 盘

关键字: u盘 stc12c5a60s2 音频播放器

  根据国家统计局最新数据显示,上半年楼市明显回暖。但与之紧密相关的家居建材行业却仍旧低迷。低迷的行情令家居建材行业竞争更加激烈,家居电商、智能家具等“互联网+”概念则不

关键字: stc12c5a60s2 单片机 智能家居

物联网(IoT)没有表现出短期流行的迹象。每一新应用都添加许多端点到互联网。不同的无线技术激增,在大部分射频(RF)频谱运行,就是最好的证明。 工程师在对广泛的IoT端点进行调

关键字: eeprom RFID 物联网

通过在单个器件中集成EEPROM存储和RFID联接,工程师可以设计IoT端点,使其可存储工作数据并与服务工程师通信,即使电源故障或完全断电。 这呈现了服务和维护的全新范例,并且完全适用于IoT。

关键字: eeprom RFID 电源资讯

24C02:256 个字节的 EEPROM。一般情况下,EEPROM 拥有 30 万到 100 万次的寿命。基于 I2C 通信协议的器件。I2C 是一个通信协议,它拥有严密的通信时序逻辑要求,而EEPROM 是一个器件,...

关键字: 51单片机 eeprom
关闭
关闭