📄 eeprom.lst
字号:
C51 COMPILER V7.06 EEPROM 04/10/2006 16:28:24 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE EEPROM
OBJECT MODULE PLACED IN EEPROM.OBJ
COMPILER INVOKED BY: C:\Keil\C51\Bin\c51.exe EEPROM.C DB SB OE ROM(LARGE) SMALL OT(8,SPEED) WL(2) RB(0)
stmt level source
1 /* --- STC International Limited ---------------- */
2 /* --- 宏晶科技 姚永平 设计 2004/9/11 V1.0 --- */
3 /* --- 宏晶科技 姚永平 设计 2004/12/4 V2.0 --- */
4 /* --- RD+/RC系列 Flash IAP/ISP Operation ----- */
5 /* --- STC89C54RD+, STC89C58RD+, --- */
6 /* --- STC89LE54RD+,STC89LE58RD+, -- */
7 /* --- STC89C51RC, STC89C52RC, ----- */
8 /* --- STC89LE51RC, STC89LE52RC, ---- */
9 /* --- Mobile: 13922805190 ---------------------- */
10 /* --- Fax: 0755-82944243 ----------------------- */
11 /* --- Tel: 0755-82908285 ----------------------- */
12 /* --- Web : www.mcu-memory.com ---------------- */
13 /* --- 感谢网友2004/12/3的指正,送样品以示感谢 --- */
14 #include <reg52.h>
15 #include <intrins.h> /* use _nop_() function */
16 //sfr16 DPTR = 0x82;
17
18 /* 新增特殊功能寄存器定义 */
19 sfr ISP_DATA = 0xe2;
20 sfr ISP_ADDRH = 0xe3;
21 sfr ISP_ADDRL = 0xe4;
22 sfr ISP_CMD = 0xe5;
23 sfr ISP_TRIG = 0xe6;
24 sfr ISP_CONTR = 0xe7;
25
26
27 /* 定义命令 */
28 #define READ_AP_and_Data_Memory_Command 0x01 /* 字节读数据存储区 */
29 #define PROGRAM_AP_and_Data_Memory_Command 0x02 /* 字节编程数据存储区 */
30 #define SECTOR_ERASE_AP_and_Data_Memory_Command 0x03 /* 扇区擦除数据存储区 */
31
32 typedef unsigned char INT8U; /* 8 bit 无符号整型 */
33 typedef unsigned int INT16U; /* 16 bit 无符号整型 */
34 #define DELAY_CONST 60000
35
36 /* 定义常量 */
37 #define ERROR 0
38 #define OK 1
39
40 sbit Begin_LED = P1^0;
41 sbit ERROR_LED = P1^3;
42 sbit OK_LED = P1^7;
43
44 /* 定义Flash 操作等待时间 */
45 #define MCU_CLOCK_40MHz
46 //#define MCU_CLOCK_20MHz
47 //#define MCU_CLOCK_10MHz
48 //#define MCU_CLOCK_5MHz
49 #ifdef MCU_CLOCK_40MHz
50 #define WAIT_TIME 0x00
51 #endif
52 #ifdef MCU_CLOCK_20MHz
#define WAIT_TIME 0x01
#endif
55 #ifdef MCU_CLOCK_10MHz
C51 COMPILER V7.06 EEPROM 04/10/2006 16:28:24 PAGE 2
#define WAIT_TIME 0x02
#endif
58 #ifdef MCU_CLOCK_5MHz
#define WAIT_TIME 0x03
#endif
61
62 /* 调试控制项 */
63 //#define DEBUG_STC89C_LE58RD+
64
65 #define DEBUG_STC89C_LE52RC
66
67 //#define USED_BYTE_QTY_IN_ONE_SECTOR 1
68 //#define USED_BYTE_QTY_IN_ONE_SECTOR 2
69 //#define USED_BYTE_QTY_IN_ONE_SECTOR 4
70 //#define USED_BYTE_QTY_IN_ONE_SECTOR 8
71 //#define USED_BYTE_QTY_IN_ONE_SECTOR 16
72 //#define USED_BYTE_QTY_IN_ONE_SECTOR 32
73 //#define USED_BYTE_QTY_IN_ONE_SECTOR 64
74 #define USED_BYTE_QTY_IN_ONE_SECTOR 128
75 //#define USED_BYTE_QTY_IN_ONE_SECTOR 256
76 //#define USED_BYTE_QTY_IN_ONE_SECTOR 512
77
78 INT8U xdata protect_buffer[USED_BYTE_QTY_IN_ONE_SECTOR];
79
80 #ifdef DEBUG_STC89C_LE58RD+ //STC89C58RD+, 89LE58RD+
*** WARNING C323 IN LINE 80 OF EEPROM.C: newline expected, extra characters found
#define DEBUG_AP_Memory_Begin_Sector_addr 0x0000
#define DEBUG_AP_Memory_End_Sector_addr 0x7e00
#define DEBUG_AP_Memory_End_Byte_addr 0x7fff
#define DEBUG_Data_Memory_Begin_Sector_addr 0x8000
#endif
87 #ifdef DEBUG_STC89C_LE52RC //STC89C52RC, 89LE52RC
88 #define DEBUG_AP_Memory_Begin_Sector_addr 0x0000
89 #define DEBUG_AP_Memory_End_Sector_addr 0x1e00
90 #define DEBUG_AP_Memory_End_Byte_addr 0x1fff
91
92 #define DEBUG_Data_Memory_Begin_Sector_addr 0x2000
93 #endif
94
95
96 /* 打开 ISP,IAP 功能 */
97 void ISP_IAP_enable(void)
98 {
99 1 EA = 0; /* 关中断 */
100 1 ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
101 1 ISP_CONTR = ISP_CONTR | WAIT_TIME;
102 1 ISP_CONTR = ISP_CONTR | 0x80; /* 1000,0000 */
103 1 }
104
105 /* 关闭 ISP,IAP 功能 */
106 void ISP_IAP_disable(void)
107 {
108 1 ISP_CONTR = ISP_CONTR & 0x7f; /* 0111,1111 */
109 1 ISP_TRIG = 0x00;
110 1 EA = 1; /* 开中断 */
111 1 }
112
113 /* 字节读 */
114 INT8U byte_read(INT16U byte_addr)
115 {
116 1 ISP_ADDRH = (INT8U)(byte_addr >> 8);
C51 COMPILER V7.06 EEPROM 04/10/2006 16:28:24 PAGE 3
117 1 ISP_ADDRL = (INT8U)(byte_addr & 0x00ff);
118 1
119 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
120 1 ISP_CMD = ISP_CMD | READ_AP_and_Data_Memory_Command; /* 0000,0001 */
121 1
122 1 ISP_IAP_enable();
123 1
124 1 ISP_TRIG = 0x46;
125 1 ISP_TRIG = 0xb9;
126 1 _nop_();
127 1
128 1 ISP_IAP_disable();
129 1 return (ISP_DATA);
130 1 }
131
132 /* 扇区擦除 */
133 INT8U sector_erase(INT16U sector_addr)
134 {
135 1 INT16U get_sector_addr = 0;
136 1 get_sector_addr = (sector_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
137 1 ISP_ADDRH = (INT8U)(get_sector_addr >> 8);
138 1 ISP_ADDRL = 0x00;
139 1
140 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
141 1 ISP_CMD = ISP_CMD | SECTOR_ERASE_AP_and_Data_Memory_Command; /* 0000,0011 */
142 1
143 1 ISP_IAP_enable();
144 1 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
145 1 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
146 1 _nop_();
147 1
148 1 ISP_IAP_disable();
149 1 return OK;
150 1 }
151
152 /* 字节编程 */
153 INT8U byte_program(INT16U byte_addr, INT8U original_data)
154 {
155 1 ISP_ADDRH = (INT8U)(byte_addr >> 8);
156 1 ISP_ADDRL = (INT8U)(byte_addr & 0x00ff);
157 1
158 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
159 1 ISP_CMD = ISP_CMD | PROGRAM_AP_and_Data_Memory_Command; /* 0000,0010 */
160 1 ISP_DATA = original_data;
161 1
162 1 ISP_IAP_enable();
163 1 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
164 1 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
165 1 _nop_();
166 1
167 1 ISP_IAP_disable();
168 1 return OK;
169 1 }
170
171 /* 字节编程并校验 */
172 INT8U byte_program_and_verify(INT16U byte_addr, INT8U original_data)
173 {
174 1 ISP_ADDRH = (INT8U)(byte_addr >> 8);
175 1 ISP_ADDRL = (INT8U)(byte_addr & 0x00ff);
176 1
177 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
178 1 ISP_CMD = ISP_CMD | PROGRAM_AP_and_Data_Memory_Command; /* 0000,0010 */
C51 COMPILER V7.06 EEPROM 04/10/2006 16:28:24 PAGE 4
179 1 ISP_DATA = original_data;
180 1
181 1 ISP_IAP_enable();
182 1
183 1 ISP_TRIG = 0x46;
184 1 ISP_TRIG = 0xb9;
185 1 _nop_();
186 1
187 1 ISP_DATA = 0x00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -