欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: EEPROM.H頭文件下載<51單片機使用Flash ROM模擬EEPROM 先擦除后編輯> [打印本頁]

作者: liuqq    時間: 2015-5-19 01:47
標題: EEPROM.H頭文件下載<51單片機使用Flash ROM模擬EEPROM 先擦除后編輯>
EEPROM.H stc單片機片內存儲器的操作頭文件下載:

#ifndef
_EERPOM_H_
#define _EEPROM_H_

#include <reg51.h>
#include "intrins.h"

#define nop() _nop_()

#define uint8   unsigned char
#define uint16  unsigned int

/*Declare SFR associated with the IAP */
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 ISP/IAP/EEPROM command*/
#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 ISP/IAP/EEPROM operation const for IAP_CONTR*/
        //#define ENABLE_IAP 0x80       //if SYSCLK<30MHz
#define ENABLE_IAP 0x81       //if SYSCLK<24MHz
        //#define ENABLE_IAP 0x82       //if SYSCLK<20MHz
        //#define ENABLE_IAP 0x83       //if SYSCLK<12MHz
        //#define ENABLE_IAP 0x84       //if SYSCLK<6MHz
        //#define ENABLE_IAP 0x85       //if SYSCLK<3MHz
        //#define ENABLE_IAP 0x86       //if SYSCLK<2MHz
        //#define ENABLE_IAP 0x87       //if SYSCLK<1MHz

        //Start address for STC11/10xx EEPROM
        //#define IAP_ADDRESS 0x0400

        //Start address for STC12C5A60S2 EEPROM
#define IAP_ADDRESS 0x0000





void EEPROMDelay(uint8 n)
{
    uint16 x;

    while (n--)
    {
        x =125;
        while (x--);
    }
}

/*----------------------------
* 名稱 : IapIdle();
* 功能 : 關閉IAP EEPROM編輯功能,安全操作
----------------------------*/
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
}


/*----------------------------
* 名稱 : IapReadByte(0x0000);
* 功能 : 讀扇區
----------------------------*/
uint8 IapReadByte(uint16 addr)
{
    uint8 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();                    //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
}

/*----------------------------
* 名稱 : IapEraseSector(0x0000);
* 功能 : 扇區擦除
----------------------------*/
void IapEraseSector(uint16 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();                    //MCU will hold here until ISP/IAP/EEPROM operation complete
    IapIdle();
}


/*----------------------------
* 名稱 : IapProgramByte(0x0000,data);
* 功能 : 扇區編輯
----------------------------*/
void IapProgramByte(uint16 addr, uint8 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();                      //MCU will hold here until ISP/IAP/EEPROM operation complete
    IapIdle();
}

/*----------------------------
* 名稱 : IapProgramWord(0x0000,data);
* 功能 : 十六位扇區編輯
----------------------------*/
void IapProgramWord(uint16 addr, uint16 dat)
{   
    uint8 dat_L,dat_H;
    dat_L=dat;
    dat_H=dat >> 8;

      IAP_CONTR = ENABLE_IAP;         
    IAP_CMD = CMD_PROGRAM;         
    IAP_ADDRL = addr+0x0001;               
    IAP_ADDRH = (addr+0x0001)>> 8;
    IAP_DATA = dat_H;
    IAP_TRIG = 0x5a;
    IAP_TRIG = 0xa5;
    nop();            
    IapIdle();

      IAP_CONTR = ENABLE_IAP;
    IAP_CMD = CMD_PROGRAM;
    IAP_ADDRL = addr;
    IAP_ADDRH = addr >> 8;
    IAP_DATA = dat_L;  
    IAP_TRIG = 0x5a;  
    IAP_TRIG = 0xa5;  
    nop();        
    IapIdle();

}

/*----------------------------
* 名稱 : IapReadWord(0x0000);
* 功能 : 讀十六位扇區
----------------------------*/
uint16 IapReadWord(uint16 addr)
{
    uint16 dat;                   //Data buffer
    uint8 dat_H,dat_L;

      IAP_CONTR = ENABLE_IAP;     //Open IAP function, and set wait time
    IAP_CMD = CMD_READ;           //Set ISP/IAP/EEPROM READ command
    IAP_ADDRL = (addr+0x0001);           //Set ISP/IAP/EEPROM address low
    IAP_ADDRH = (addr+0x0001) >> 8;      //Set ISP/IAP/EEPROM address high
    IAP_TRIG = 0x5a;              //Send trigger command1 (0x5a)
    IAP_TRIG = 0xa5;              //Send trigger command2 (0xa5)
    nop();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
    dat_H = IAP_DATA;             //Read ISP/IAP/EEPROM data
    IapIdle();

    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();                      //MCU will hold here until ISP/IAP/EEPROM operation complete
    dat_L= IAP_DATA;            //Read ISP/IAP/EEPROM data
    IapIdle();                  //Close ISP/IAP/EEPROM function

        dat=(dat_H << 8)+dat_L;

    return dat;                 //Return Flash data
}


#endif












歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1