📄 eeprom.lst
字号:
C51 COMPILER V9.01 EEPROM 05/06/2012 20:40:06 PAGE 1
C51 COMPILER V9.01, COMPILATION OF MODULE EEPROM
OBJECT MODULE PLACED IN EEPROM.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE EEPROM.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND
line level source
1
2 #include "stc90.h"
3 #include "EEPROM.H"
4 #include "intrins.h"
5
6
7
8
9
10 /* 打开 ISP,IAP 功能 */
11 void ISP_IAP_enable(void)
12 {
13 1 EA = 0; /* 关中断 */
14 1 ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
15 1 ISP_CONTR = ISP_CONTR | WAIT_TIME;
16 1 ISP_CONTR = ISP_CONTR | 0x80; /* 1000,0000 */
17 1 }
18
19 /* 关闭 ISP,IAP 功能 */
20 void ISP_IAP_disable(void)
21 {
22 1 ISP_CONTR = ISP_CONTR & 0x7f; /* 0111,1111 */
23 1 ISP_TRIG = 0x00;
24 1 EA = 1; /* 开中断 */
25 1 }
26
27 /* 字节读 */
28 INT8U byte_read(INT16U byte_addr)
29 {
30 1 ISP_ADDRH = (INT8U)(byte_addr >> 8);
31 1 ISP_ADDRL = (INT8U)(byte_addr & 0x00ff);
32 1
33 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
34 1 ISP_CMD = ISP_CMD | READ_AP_and_Data_Memory_Command; /* 0000,0001 */
35 1
36 1 ISP_IAP_enable();
37 1
38 1 ISP_TRIG = 0x46;
39 1 ISP_TRIG = 0xb9;
40 1 _nop_();
41 1
42 1 ISP_IAP_disable();
43 1 return (ISP_DATA);
44 1 }
45
46 /* 扇区擦除 */
47 INT8U sector_erase(INT16U sector_addr)
48 {
49 1 INT16U get_sector_addr = 0;
50 1 get_sector_addr = (sector_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
51 1 ISP_ADDRH = (INT8U)(get_sector_addr >> 8);
52 1 ISP_ADDRL = 0x00;
53 1
54 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
55 1 ISP_CMD = ISP_CMD | SECTOR_ERASE_AP_and_Data_Memory_Command; /* 0000,0011 */
C51 COMPILER V9.01 EEPROM 05/06/2012 20:40:06 PAGE 2
56 1
57 1 ISP_IAP_enable();
58 1 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
59 1 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
60 1 _nop_();
61 1
62 1 ISP_IAP_disable();
63 1 return 1;
64 1 }
65
66 /* 字节编程 */
67 //INT8U byte_program(INT16U byte_addr, INT8U original_data)
68 //{
69 // ISP_ADDRH = (INT8U)(byte_addr >> 8);
70 // ISP_ADDRL = (INT8U)(byte_addr & 0x00ff);
71 //
72 // ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
73 // ISP_CMD = ISP_CMD | PROGRAM_AP_and_Data_Memory_Command; /* 0000,0010 */
74 // ISP_DATA = original_data;
75 //
76 // ISP_IAP_enable();
77 // ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
78 // ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
79 // _nop_();
80 //
81 // ISP_IAP_disable();
82 // return 1;
83 //}
84
85
86
87 /* 写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据 */
88 /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源 */
89 INT8U sequential_write_flash_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
90 {
91 1 INT16U i = 0;
92 1 INT16U in_sector_begin_addr = 0;
93 1 INT16U sector_addr = 0;
94 1
95 1 /* 判是否是有效范围,此函数不允许跨扇区操作 */
96 1 if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
97 1 return 0;
98 1 in_sector_begin_addr = begin_addr & 0x01ff; /* 0000,0001,1111,1111 */
99 1 if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
100 1 return 0;
101 1
102 1 /* 擦除 要修改/写入 的扇区 */
103 1 sector_addr = (begin_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
104 1 ISP_ADDRH = (INT8U)(sector_addr >> 8);
105 1 ISP_ADDRL = 0x00;
106 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
107 1 ISP_CMD = ISP_CMD | SECTOR_ERASE_AP_and_Data_Memory_Command; /* 0000,0011 */
108 1
109 1 ISP_IAP_enable();
110 1 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
111 1 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
112 1 _nop_();
113 1
114 1 for(i = 0; i< counter; i++)
115 1 {
116 2 /* 写一个字节 */
117 2 ISP_ADDRH = (INT8U)(begin_addr >> 8);
C51 COMPILER V9.01 EEPROM 05/06/2012 20:40:06 PAGE 3
118 2 ISP_ADDRL = (INT8U)(begin_addr & 0x00ff);
119 2 ISP_DATA = array[i];
120 2 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
121 2 ISP_CMD = ISP_CMD | PROGRAM_AP_and_Data_Memory_Command; /* 0000,0010 */
122 2
123 2 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
124 2 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
125 2 _nop_();
126 2
127 2 /* 读回来 */
128 2 ISP_DATA = 0x00;
129 2
130 2 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
131 2 ISP_CMD = ISP_CMD | READ_AP_and_Data_Memory_Command; /* 0000,0001 */
132 2
133 2 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
134 2 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
135 2 _nop_();
136 2
137 2 /* 比较对错 */
138 2 if(ISP_DATA != array[i])
139 2 {
140 3 ISP_IAP_disable();
141 3 return 0;
142 3 }
143 2 begin_addr++;
144 2 }
145 1 ISP_IAP_disable();
146 1 return 1;
147 1 }
148
149
150
151 void delay(INT16U counter)
152 {
153 1 INT16U temp = 0;
154 1 for(temp = counter; temp>0; temp--)
155 1 {
156 2 _nop_();
157 2 _nop_();
158 2 _nop_();
159 2 }
160 1 }
161
162
163
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 279 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 7
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 + -