×
单片机 > 单片机程序设计 > 详情

单片机成长之路(51基础篇) - 022 N76e003 APROM模拟EEPROM驱动

发布时间:2021-01-20 发布时间:
|

N76e003单片机内部没有EEPROM,但是可以使用 APROM模拟EEPROM功能,代码如下:


eeprom.h


 1 #ifndef _EEPROM_H_

 2 #define _EEPROM_H_

 3 

 4 //EEPROM 指令

 5 #define BYTE_PROGRAM_AP 0x21    //APROM 字节编程(数据写入)

 6 #define PAGE_ERASE_AP     0x22    //APROM 页擦除 (128字节)

 7 #define BYTE_Read_AP    0x00    //APROM 字节读 (数据字节)

 8 

 9 

10 // EEPROM起始地址

11 #define EEPROM_START_ADDRESS          0x0200

12 

13 void Eeprom_Unlock(void);

14 void Eeprom_Locked(void);

15 void Eeprom_IAP_process(void);

16 void Eeprom_Erase_page(unsigned short address,unsigned char Data);

17 void Eeprom_Byte_write(unsigned short address,unsigned char Data);

18 unsigned char Eeprom_Erase_read(unsigned short address);

19 

20 

21 #endif  /* _EEPROM_H_ */


eeprom.c


  1 #include

  2 #include "eeprom.h"

  3 #include "data.h"

  4 

  5 volatile unsigned char code Data_Flash[128] _at_ EEPROM_START_ADDRESS;                //不被优化

  6 

  7 /**************************************************************************

  8 Function:    Eeprom_Unlock

  9 Description: 解锁 Eeprom

 10 Input:       no

 11 Output:      no

 12 Return:      no

 13 **************************************************************************/

 14 void Eeprom_Unlock(void){

 15     //开启 在线编程模式(LDROM和APROM)

 16     TA = 0xAA;                            //CHPCON受TA保护

 17     TA = 0x55;

 18     CHPCON |= 0x01;                        //IAPEN = 1, 启用IAP模式(CHPCON芯片控制寄存器)

 19     //开启 编程程序模式(APROM)

 20     TA = 0xAA;                            //IAPUEN受TA保护

 21     TA = 0x55;

 22     IAPUEN |= 0x01;                        //APUEN = 1, 启用APROM更新(更新使能)

 23 }

 24 /**************************************************************************

 25 Function:    Eeprom_Locked

 26 Description: 解锁 Eeprom

 27 Input:       no

 28 Output:      no

 29 Return:      no

 30 **************************************************************************/

 31 void Eeprom_Locked(void)

 32 {

 33     //关闭 编程程序模式(APROM)

 34     TA = 0xAA;                             //IAPUEN受TA保护

 35     TA = 0x55;

 36     IAPUEN &= ~0x01;                      //APUEN = 0,禁用APROM更新

 37     //关闭 在线编程模式(LDROM和APROM)

 38     TA = 0xAA;                             //CHPCON受TA保护

 39     TA = 0x55;

 40     CHPCON &= ~0x01;                     //IAPEN = 0,禁用IAP模式

 41 }

 42 /**************************************************************************

 43 Function:    Eeprom_IAP_process

 44 Description: IAP 处理

 45 Input:       no

 46 Output:      no

 47 Return:      no

 48 **************************************************************************/

 49 void Eeprom_IAP_process(void){

 50     bit EA_status;

 51     //IAP 执行

 52     EA_status = EA;

 53     EA = 0;

 54     TA = 0xAA;

 55     TA = 0x55;

 56     IAPTRG |= 0x01;                     //IAP 执行(设置该位为1开始执行IAP。该指令后,CPU保持程序计数器(PC) ,IAP硬件自动管理控制该过程。IAP完成后,程序计数器继续执行下一个指令。IAPGO位自动清零,保持为0。在触发IAP动作前,如果中断打开应该临时关闭因为硬件限制。)    Eeprom_Unlock();            //Eeprom 上锁

 57     EA = EA_status;

 58 }

 59 /**************************************************************************

 60 Function:    Eeprom_Erase_page

 61 Description: 擦除页面 Eeprom

 62 Input:       - address  指定擦除页面的绝对地址

 63              - Data  Eeprom擦除后的数据

 64 Output:      no

 65 Return:      no

 66 **************************************************************************/

 67 void Eeprom_Erase_page(unsigned short address,unsigned char Data)

 68 {

 69     unsigned char High_address = address >> 8;    //取高位

 70     unsigned char Low_address = address;        //取低位

 71     Eeprom_Unlock();                            //Eeprom 解锁

 72     //擦除页面

 73     IAPCN = PAGE_ERASE_AP;                //页擦除

 74     IAPAH = High_address;                //页面地址高8位

 75     IAPAL = Low_address;                //页面地址低8位

 76     IAPFD = Data;                        //擦除数据值

 77     //IAP 执行

 78     Eeprom_IAP_process();                //执行上面设置

 79     Eeprom_Locked();                    //Eeprom 上锁

 80 }

 81 /**************************************************************************

 82 Function:    Eeprom_Byte_write

 83 Description: 字节编程 Eeprom

 84 Input:       - address  指定更改数据的绝对地址

 85              - Data  Eeprom写入的数据

 86 Output:      no

 87 Return:      no

 88 **************************************************************************/

 89 void Eeprom_Byte_write(unsigned short address,unsigned char Data)

 90 {

 91     unsigned char High_address = address >> 8;    //取高位

 92     unsigned char Low_address = address;         //取低位

 93     Eeprom_Unlock();                    //Eeprom 解锁

 94     //字节编程

 95     IAPCN = BYTE_PROGRAM_AP;            //字节编程

 96     IAPAH = High_address;                //字节编程地址高8位

 97     IAPAL = Low_address;                //字节编程地址低8位

 98     IAPFD = Data;                        //写入的数据

 99     //IAP 执行

100     Eeprom_IAP_process();                //执行上面设置

101     Eeprom_Locked();                       //Eeprom 上锁

102 }

103 /**************************************************************************

104 Function:    Eeprom_Erase_read

105 Description: 字节读 Eeprom

106 Input:       - address  指定读出数据的绝对地址

107 Output:      no

108 Return:      IAPFD 读出的数据

109 **************************************************************************/

110 unsigned char Eeprom_Erase_read(unsigned short address){

111     unsigned char High_address = address >> 8;    //取高位

112     unsigned char Low_address = address;          //取低位

113     //字节读

114     IAPCN = BYTE_Read_AP;                  //字节读

115     IAPAH = High_address;                //字节读地址高8位

116     IAPAL = Low_address;                //字节读地址低8位

117     //IAP 执行

118     Eeprom_IAP_process();                //执行上面设置

119     return IAPFD;

120 }


关键字:51基础篇  APROM  模拟EEPROM驱动 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义