📄 stc_eeprom.lst
字号:
C51 COMPILER V8.08 STC_EEPROM 12/21/2008 10:39:00 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE STC_EEPROM
OBJECT MODULE PLACED IN stc_eeprom.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE stc_eeprom.c BROWSE DEBUG OBJECTEXTEND
line 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 "stc89c52rd.h"
15 //#include <REG52.H>
16 #include "STC89C52RD.h"
17
18 #include <intrins.h> /* use _nop_() function */
19 //sfr16 DPTR = 0x82;
20 /*
21 // 新增特殊功能寄存器定义 //
22 sfr ISP_DATA = 0xe2;
23 sfr ISP_ADDRH = 0xe3;
24 sfr ISP_ADDRL = 0xe4;
25 sfr ISP_CMD = 0xe5;
26 sfr ISP_TRIG = 0xe6;
27 sfr ISP_CONTR = 0xe7;
28 */
29 unsigned int Begin_addr =0;
30
31 // 定义命令 //
32 #define READ_AP_and_Data_Memory_Command 0x01 // 字节读数据存储区 //
33 #define PROGRAM_AP_and_Data_Memory_Command 0x02 // 字节编程数据存储区 //
34 #define SECTOR_ERASE_AP_and_Data_Memory_Command 0x03 // 扇区擦除数据存储区 //
35
36 typedef unsigned char INT8U; // 8 bit 无符号整型 //
37 typedef unsigned int INT16U; // 16 bit 无符号整型 //
38 #define DELAY_CONST 60000
39
40 // 定义常量 //
41 #define ERROR 0
42 #define OK 1
43
44 //sbit Begin_LED = P1^0;
45 //sbit ERROR_LED = P1^3;
46 //sbit OK_LED = P1^7;
47
48 // 定义Flash 操作等待时间 //
49 //#define MCU_CLOCK_40MHz
50 //#define MCU_CLOCK_20MHz
51 #define MCU_CLOCK_10MHz
52 //#define MCU_CLOCK_5MHz
53 #ifdef MCU_CLOCK_40MHz
#define WAIT_TIME 0x00
#endif
C51 COMPILER V8.08 STC_EEPROM 12/21/2008 10:39:00 PAGE 2
56 #ifdef MCU_CLOCK_20MHz
#define WAIT_TIME 0x01
#endif
59 #ifdef MCU_CLOCK_10MHz
60 #define WAIT_TIME 0x02
61 #endif
62 #ifdef MCU_CLOCK_5MHz
#define WAIT_TIME 0x03
#endif
65
66 /* 调试控制项 */
67 //#define DEBUG_STC89C_LE58RD
68
69 #define DEBUG_STC89C_LE52RC
70
71 //#define USED_BYTE_QTY_IN_ONE_SECTOR 1
72 //#define USED_BYTE_QTY_IN_ONE_SECTOR 2
73 //#define USED_BYTE_QTY_IN_ONE_SECTOR 4
74 //#define USED_BYTE_QTY_IN_ONE_SECTOR 8
75 //#define USED_BYTE_QTY_IN_ONE_SECTOR 16
76 //#define USED_BYTE_QTY_IN_ONE_SECTOR 32
77 //#define USED_BYTE_QTY_IN_ONE_SECTOR 64
78 #define USED_BYTE_QTY_IN_ONE_SECTOR 128
79 //#define USED_BYTE_QTY_IN_ONE_SECTOR 256
80 //#define USED_BYTE_QTY_IN_ONE_SECTOR 512
81
82 //INT8U xdata protect_buffer[USED_BYTE_QTY_IN_ONE_SECTOR];
83
84 #ifdef DEBUG_STC89C_LE58RD //STC89C58RD+, 89LE58RD+
#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
#define MAXNUM 9
#endif
92 #ifdef DEBUG_STC89C_LE52RC //STC89C52RC, 89LE52RC
93 #define DEBUG_AP_Memory_Begin_Sector_addr 0x0000
94 #define DEBUG_AP_Memory_End_Sector_addr 0x1e00
95 #define DEBUG_AP_Memory_End_Byte_addr 0x1fff
96
97 #define DEBUG_Data_Memory_Begin_Sector_addr 0x2000
98 #define MAXNUM 7
99 #endif
100
101
102 /* 打开 ISP,IAP 功能 */
103 void ISP_IAP_enable(void)
104 {
105 1 EA = 0; /* 关中断 */
106 1 ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
107 1 ISP_CONTR = ISP_CONTR | WAIT_TIME;
108 1 ISP_CONTR = ISP_CONTR | 0x80; /* 1000,0000 */
109 1 }
110
111 /* 关闭 ISP,IAP 功能 */
112 void ISP_IAP_disable(void)
113 {
114 1 ISP_CONTR = ISP_CONTR & 0x7f; /* 0111,1111 */
115 1 ISP_TRIG = 0x00;
116 1 EA = 1; /* 开中断 */
117 1 }
C51 COMPILER V8.08 STC_EEPROM 12/21/2008 10:39:00 PAGE 3
118
119 /* 字节读 */
120 INT8U byte_read(INT16U byte_addr)
121 {
122 1 ISP_ADDRH = (INT8U)(byte_addr >> 8);
123 1 ISP_ADDRL = (INT8U)(byte_addr & 0x00ff);
124 1
125 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
126 1 ISP_CMD = ISP_CMD | READ_AP_and_Data_Memory_Command; /* 0000,0001 */
127 1
128 1 ISP_IAP_enable();
129 1
130 1 ISP_TRIG = 0x46;
131 1 ISP_TRIG = 0xb9;
132 1 _nop_();
133 1
134 1 ISP_IAP_disable();
135 1 return (ISP_DATA);
136 1 }
137
138 /* 扇区擦除 */
139 INT8U sector_erase(INT16U sector_addr)
140 {
141 1 INT16U get_sector_addr = 0;
142 1 get_sector_addr = (sector_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
143 1 ISP_ADDRH = (INT8U)(get_sector_addr >> 8);
144 1 ISP_ADDRL = 0x00;
145 1
146 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
147 1 ISP_CMD = ISP_CMD | SECTOR_ERASE_AP_and_Data_Memory_Command; /* 0000,0011 */
148 1
149 1 ISP_IAP_enable();
150 1 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
151 1 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
152 1 _nop_();
153 1
154 1 ISP_IAP_disable();
155 1 return OK;
156 1 }
157
158 /* 字节编程 */
159 INT8U byte_program(INT16U byte_addr, INT8U original_data)
160 {
161 1 ISP_ADDRH = (INT8U)(byte_addr >> 8);
162 1 ISP_ADDRL = (INT8U)(byte_addr & 0x00ff);
163 1
164 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
165 1 ISP_CMD = ISP_CMD | PROGRAM_AP_and_Data_Memory_Command; /* 0000,0010 */
166 1 ISP_DATA = original_data;
167 1
168 1 ISP_IAP_enable();
169 1 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
170 1 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
171 1 _nop_();
172 1
173 1 ISP_IAP_disable();
174 1 return OK;
175 1 }
176
177 void bytewrite (unsigned int um, unsigned char dat) ;
178 unsigned char byteread(unsigned int um);
179
C51 COMPILER V8.08 STC_EEPROM 12/21/2008 10:39:00 PAGE 4
180
181 void bytewrite (unsigned int um, unsigned char dat)
182 {
183 1 bit res = EA;
184 1
185 1 um =((um+1)<<MAXNUM) +DEBUG_Data_Memory_Begin_Sector_addr;
186 1 EA=0;
187 1 sector_erase(um);
188 1 byte_program(um,dat);
189 1 EA = res;
190 1 }
191
192 unsigned char byteread(unsigned int um)
193 {
194 1 unsigned int addr = ((1+um)<<MAXNUM)+DEBUG_Data_Memory_Begin_Sector_addr;
195 1 return byte_read(addr);
196 1 }
197
198 /*
199 void eepromtest()
200 {
201
202
203 sector_erase(DEBUG_Data_Memory_Begin_Sector_addr);
204 if(byte_program_and_verify(DEBUG_Data_Memory_Begin_Sector_addr,0x55) == OK)
205
206
207
208 }
209 */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 200 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -