📄 flash.lst
字号:
C51 COMPILER V7.50 FLASH 09/08/2007 13:14:10 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE FLASH
OBJECT MODULE PLACED IN flash.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE flash.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "c8051f020.h"
2 #include <intrins.h>
3 //#include "delay.h"
4 sbit CS_ROM=P3^0 ;
5 void UART0_SendByte(unsigned char value);
6 extern unsigned char xdata x[0x07fff];
7 //*********************** M25P16程序模块 **********************//
8 unsigned char transdata(unsigned char dat) //向25P16传输数据
9 {
10 1 unsigned char value;
11 1 CS_ROM=0; //开片选
12 1 SPIF=0; //清SPI 中断标志
13 1 SPI0DAT=dat; //送数
14 1 while(!SPIF); //等待发送完毕
15 1 SPIF=0;
16 1 value=SPI0DAT; //读数
17 1 _nop_();
18 1 return(value);
19 1 }
20 //读器件ID(202015H)
21
22 /*void R_ROM_ID(void)
23 {
24 unsigned char temp;
25 unsigned char id1,id2,id3;
26 CS_ROM=1;
27 _nop_();
28 CS_ROM=0;
29 temp=transdata(0x9f); //读器件ID命令
30 id1=transdata(0xff);
31 id2=transdata(0xff);
32 id3=transdata(0xff);
33 //UART0_SendByte(id1);
34 //UART0_SendByte(id2);
35 //UART0_SendByte(id3);
36 CS_ROM=1;
37 }
38 */
39 unsigned char R_ROM_SATUS(void)
40 {
41 1 unsigned char value;
42 1 CS_ROM=1;
43 1 value=transdata(0x05);
44 1 value=transdata(0xff);
45 1 //UART0_SendByte(value);
46 1 CS_ROM=1;
47 1 return(value);
48 1 }
49 //写状态寄存器子程序
50 //protect_bits:0 表示不保护任何段; 1 表示保护31段; 2 表示保护30-31段
51 // 3 表示保护28-31段; 4 表示保护24-31段;5 表示保护16-31段
52 // 6、7 表示保护所有段
53 void WRSR(unsigned char protect_bits)
54 {
55 1 unsigned char temp,protect;
C51 COMPILER V7.50 FLASH 09/08/2007 13:14:10 PAGE 2
56 1 protect=protect_bits<<2;
57 1 while(R_ROM_SATUS()&0x01); //等待WIP复位
58 1
59 1 temp=transdata(0x06); //写FLASH ROM 命令
60 1 while(!(R_ROM_SATUS()&0x02)); //等待WEL置位
61 1
62 1 temp=transdata(0x01); //写状态寄存器命令代码
63 1 temp=transdata(protect); //送出参数
64 1
65 1 CS_ROM=1;
66 1 while(R_ROM_SATUS()&0x01); //等待WIP复位
67 1 }
68 //块檫除子程序,FLASH ROM 全部檫除
69 void FLASH_BE(void)
70 {
71 1 unsigned char temp;
72 1 while(R_ROM_SATUS()&0x01); //等待WIP复位
73 1
74 1 WRSR(0x00); //写状态寄存器,去写保护
75 1 temp=transdata(0x06); //写FLASH ROM 命令
76 1 while(!(R_ROM_SATUS()&0x02)); //等待WEL置位
77 1
78 1 temp=transdata(0xc7); //块檫除命令
79 1
80 1 CS_ROM=1;
81 1 while(R_ROM_SATUS()&0x01); //等待WIP复位
82 1 }
83 //段檫除子程序
84 //addr=000000H -- 1FFFFFH
85 void FLASH_SE(unsigned char addr3,unsigned char addr2,unsigned char addr1)
86 {
87 1 unsigned char temp;
88 1 while(R_ROM_SATUS()&0x01); //等待WIP复位
89 1
90 1 temp=transdata(0x06); //写FLASH ROM 命令
91 1 while(!(R_ROM_SATUS()&0x02)); //等待WEL置位
92 1
93 1 temp=transdata(0xd8); //段檫除命令
94 1
95 1 temp=transdata(addr3); //送24位地址 unsigned 逻辑移, signed 算术移
96 1 temp=transdata(addr2);
97 1 temp=transdata(addr1);
98 1
99 1 CS_ROM=1;
100 1 while(R_ROM_SATUS()&0x01); //等待WIP复位
101 1 }
102
103
104 //页写子程序
105 //addr:写入首地址
106 //pw:待写数据地址指针
107 //num:待写数据个数
108 void Flash_W (unsigned char addr3,unsigned char addr2,unsigned char addr1,unsigned char dat)
109 {
110 1 //unsigned int i;
111 1 unsigned char temp;
112 1 while(R_ROM_SATUS()&0x01); //等待WIP复位
113 1
114 1 temp=transdata(0x06); //写FLASH ROM 命令
115 1 while(!(R_ROM_SATUS()&0x02)); //等待WEL置位
116 1
117 1 temp=transdata(0x02); //页写命令
C51 COMPILER V7.50 FLASH 09/08/2007 13:14:10 PAGE 3
118 1
119 1 temp=transdata(addr3); //送24位地址 unsigned 逻辑移, signed 算术移
120 1 temp=transdata(addr2);
121 1 temp=transdata(addr1);
122 1
123 1 temp=transdata(dat);//数据
124 1 /*for(i=0;i<num;i++)
125 1 {
126 1 temp=transdata(*pw);
127 1 pw++;
128 1 }*/
129 1
130 1 CS_ROM=1;
131 1 while(R_ROM_SATUS()&0x01); //等待WIP复位
132 1 }
133 //读FLASH程序
134 //addr3~1:待读数据区首地址
135
136 unsigned char Flash_R(unsigned char addr3,unsigned char addr2,unsigned char addr1)
137 {
138 1 //unsigned int i;
139 1 unsigned char temp;
140 1 unsigned char dat;
141 1 while(R_ROM_SATUS()&0x01); //等待WIP复位
142 1
143 1 temp=transdata(0x03); //页读命令
144 1
145 1 temp=transdata(addr3); //送24位地址 unsigned 逻辑移, signed 算术移
146 1 temp=transdata(addr2);
147 1 temp=transdata(addr1);
148 1
149 1 dat=transdata(0x00);
150 1 /*for(i=0;i<num;i++)
151 1 {
152 1 *pr=transdata(0x00);
153 1 pr++;
154 1 }*/
155 1 CS_ROM=1;
156 1 return dat;
157 1 }
158
159 //C命令读FLASH程序
160 void Read_Flash_Data_To_PC (unsigned int addr3,unsigned int addr2,unsigned int addr1,unsigned char Num_Len
-gth)
161 {
162 1 unsigned int i;
163 1 unsigned char dat;
164 1 for(i=0;i<=Num_Length;i++)
165 1 {
166 2 dat=Flash_R( addr3, addr2, addr1);
167 2 UART0_SendByte(dat);
168 2 addr1++;
169 2 if(addr1>255)
170 2 {
171 3 addr1=0x00;
172 3 addr2++;
173 3 if(addr2>255)
174 3 {
175 4 addr1=0x00;
176 4 addr2=0x00;
177 4 addr3++;
178 4 }
C51 COMPILER V7.50 FLASH 09/08/2007 13:14:10 PAGE 4
179 3
180 3 }
181 2
182 2 }
183 1 }
184
185 //S命令存时间初值与起始地址
186 void Flash_Write_address (unsigned char hour,unsigned minute,unsigned char apm,unsigned int addr3,unsigned
- int addr2,unsigned int addr1,unsigned char port)
187 {
188 1 unsigned int h,m,l;
189 1 h=addr3;
190 1 m=addr2;
191 1 l=addr1;
192 1 Flash_W (addr3,addr2,addr1,0xFF);//0位
193 1 addr1++;
194 1 Flash_W (addr3,addr2,addr1,hour);//1位
195 1 addr1++;
196 1 Flash_W (addr3,addr2,addr1,minute);//2位
197 1 addr1++;
198 1 Flash_W (addr3,addr2,addr1,apm);//3位
199 1 addr1++;
200 1 Flash_W (addr3,addr2,addr1,port);//4位
201 1 addr1++;
202 1 Flash_W (addr3,addr2,addr1,h);//5位
203 1 addr1++;
204 1 Flash_W (addr3,addr2,addr1,m);//6位
205 1 addr1++;
206 1 Flash_W (addr3,addr2,addr1,l);//7位
207 1 }
208 //Rom存储
209 /*void ROM_Write_address(unsigned int address,unsigned char hour,unsigned minute,unsigned char apm,unsigne
-d int addr3,unsigned int addr2,unsigned int addr1,unsigned char port )
210 {
211 unsigned int add;
212 add=address;
213 x[add]=0xFF;//0
214 add++;
215 x[add]=hour;//1
216 add++;
217 x[add]= minute;//2
218 add++;
219 x[add]= apm;//3
220 add++;
221 x[add]= port;//4
222 add++;
223 x[add]= addr3;//5
224 add++;
225 x[add]= addr2;//6
226 add++;
227 x[add]= addr1;//7
228 add++;
229 x[add]= 0x00;//8 上次值
230 add++;
231 x[add]= 0x00;//9 当前值
232 }*/
233
234 void Read_Data_T0_Flash (unsigned char addr3,unsigned char addr2,unsigned char addr1,unsigned int ad,unsig
-ned int num)
235 {
236 1 unsigned char temp;
237 1 unsigned int i,add;
C51 COMPILER V7.50 FLASH 09/08/2007 13:14:10 PAGE 5
238 1 add=ad;
239 1 while(R_ROM_SATUS()&0x01); //等待WIP复位
240 1
241 1 temp=transdata(0x06); //写FLASH ROM 命令
242 1 while(!(R_ROM_SATUS()&0x02)); //等待WEL置位
243 1
244 1 temp=transdata(0x02); //页写命令
245 1
246 1 temp=transdata(addr3); //送24位地址 unsigned 逻辑移, signed 算术移
247 1 temp=transdata(addr2);
248 1 temp=transdata(addr1);
249 1 for(i=0,add=ad;i<num,add<ad+num;i++,add++)
250 1 {
251 2 temp=transdata(x[add]);
252 2 }
253 1 CS_ROM=1;
254 1 while(R_ROM_SATUS()&0x01); //等待WIP复位
255 1
256 1 }
257
258 unsigned char Fast_Read(unsigned char addr3,unsigned char addr2,unsigned char addr1,unsigned long int end_
-address)
259 {
260 1 unsigned long int i,num,address;
261 1 unsigned char temp;
262 1 unsigned char dat;
263 1 unsigned char first;
264 1 first=0x00;
265 1 address=addr3*65536+addr2*256+addr1;
266 1 num=end_address-address;
267 1 while(R_ROM_SATUS()&0x01); //等待WIP复位
268 1
269 1 temp=transdata(0x0B); //fast read 读命令
270 1
271 1 temp=transdata(addr3); //送24位地址 unsigned 逻辑移, signed 算术移
272 1 temp=transdata(addr2);
273 1 temp=transdata(addr1);
274 1 for(i=0;i<=num;i++)
275 1 {
276 2 dat=transdata(0x00);
277 2 switch (first)
278 2 {
279 3 case 0x00: first=0x01;break;
280 3 case 0x01: if(dat==0xFF) i=num; UART0_SendByte(dat);
281 3 //UART0_SendByte(datt);
282 3 default : break;
283 3 }
284 2
285 2 }
286 1
287 1 CS_ROM=1;
288 1 return dat;
289 1 }
290 //*********************** M25P16程序模块结束 **********************//
291
292
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 903 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
C51 COMPILER V7.50 FLASH 09/08/2007 13:14:10 PAGE 6
PDATA SIZE = ---- ----
DATA SIZE = ---- 60
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -