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 }
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』