📄 eeprom.lst
字号:
C51 COMPILER V7.06 EEPROM 09/13/2005 20:39:38 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 OMF2 BROWSE DEBUG
stmt level source
1 #include <config.h>
2
3 #define IN_EEPROM
4
5 #if EEPROM_USING
6
7 #define ISP_IAP_BYTE_READ 0x01;//字节读
8 #define ISP_IAP_BYTE_PROGRAM 0x02;//字节编程, 前提是该字节是空,0FFh
9 #define ISP_IAP_SECTOR_ERASE 0x03;//扇区擦除, 要某字节为空,要擦一扇区
10 #define WAIT_TIME 0x01;//设置等待时间,30MHz 以下0,24M 以下1,
11 #define ENABLE_ISP 0x81;// <24MHz
12
13 #define EEPROM_MAX_BUFFER 10
14 unsigned char xdata eeprom_buffer[EEPROM_MAX_BUFFER];
15 //-----------------------------------------------------------------------------
16 // ----eeprom的读,需要指定地址,每次固定读入一定
17 void eeprom_read(void)
18 {
19 1 //MOV ISP_ADDRH, #BYTE_ADDR_HIGH ;送地址高字节
20 1 //MOV ISP_ADDRL, #BYTE_ADDR_LOW ;送地址低字节
21 1 //MOV ISP_CONTR, #WAIT_TIME ;设置等待时间
22 1 //ORL ISP_CONTR, #10000000B ;允许ISP/IAP 操作
23 1 //MOV ISP_CMD, #ISP_IAP_BYTE_READ ;送字节读命令,命令不需改变时,不需重新送命令
24 1 //MOV ISP_TRIG, #46h ;先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
25 1 //MOV ISP_TRIG, #0B9h ;送完B9h 后,ISP/IAP 命令立即被触发起动
26 1 unsigned char idata i=0x00;
27 1
28 1 for(i=0x00;i<EEPROM_MAX_BUFFER;i++)
29 1 { ISP_ADDRH = 0x28; //选择第二扇区
30 2 ISP_ADDRL = i;
31 2 ISP_CONTR = WAIT_TIME;
32 2 ISP_CONTR |= 0x80;
33 2 ISP_CMD = ISP_IAP_BYTE_READ;
34 2 EA = 0x00;
35 2 ISP_TRIG = 0x46;
36 2 ISP_TRIG = 0xb9;
37 2 EA = 0x01;
38 2
39 2 eeprom_buffer[i]=ISP_DATA;
40 2 }
41 1 // -----------关闭ISP/IAP功能---------------
42 1 ISP_CONTR = 0x00;
43 1 ISP_CMD = 0x00;
44 1 ISP_TRIG = 0x00;
45 1 ISP_ADDRH = 0x00;
46 1 ISP_ADDRL = 0x00;
47 1 }
48
49 void eeprom_write(void) //eeprom写入
50 {
51 1 //MOV ISP_DATA, #ONE_DATA ;送字节编程数据到ISP_DATA
52 1 //MOV ISP_ADDRH, #BYTE_ADDR_HIGH ;送地址高字节
53 1 //MOV ISP_ADDRL, #BYTE_ADDR_LOW ;送地址低字节
54 1 //MOV ISP_CONTR, #WAIT_TIME ;设置等待时间
55 1 //ORL ISP_CONTR, #10000000B ;允许ISP/IAP 操作
C51 COMPILER V7.06 EEPROM 09/13/2005 20:39:38 PAGE 2
56 1 //MOV ISP_CMD, #ISP_IAP_BYTE_PROGRAM ;送字节编程命令
57 1 //MOV ISP_TRIG, #46h ;先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
58 1 //MOV ISP_TRIG, #0B9h ;送完B9h 后,ISP/IAP 命令立即被触发起动
59 1
60 1 unsigned char idata i=0x00;
61 1
62 1 for(i=0x00;i<EEPROM_MAX_BUFFER;i++)
63 1 { ISP_DATA=eeprom_buffer[i];
64 2 ISP_ADDRH = 0x28; //选择第二扇区
65 2 ISP_ADDRL = i;
66 2 ISP_CONTR = WAIT_TIME;
67 2 ISP_CONTR |= 0x80;
68 2 ISP_CMD = ISP_IAP_BYTE_PROGRAM;
69 2 EA = 0x00;
70 2 ISP_TRIG = 0x46;
71 2 ISP_TRIG = 0xb9;
72 2 EA = 0x01;
73 2 }
74 1 // -----------关闭ISP/IAP功能---------------
75 1 ISP_CONTR = 0x00;
76 1 ISP_CMD = 0x00;
77 1 ISP_TRIG = 0x00;
78 1 ISP_ADDRH = 0x00;
79 1 ISP_ADDRL = 0x00;
80 1 }
81
82 void eeprom_earse(void)
83 {
84 1 //MOV ISP_ADDRH, #SECTOR_FIRST_BYTE_ADDR_HIGH ;送扇区起始地址高字节
85 1 //MOV ISP_ADDRL, #SECTOR_FIRST_BYTE_ADDR_LOW ;送扇区起始地址低字节
86 1 //MOV ISP_CONTR, #WAIT_TIME ;设置等待时间
87 1 //ORL ISP_CONTR, #10000000B ;允许ISP/IAP
88 1 //MOV ISP_CMD, #ISP_IAP_SECTOR_ERASE ;送扇区擦除命令,命令不需改变时,不需重新送命令
89 1 //MOV ISP_TRIG, #46h ;先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
90 1 //MOV ISP_TRIG, #0B9h ;送完B9h 后,ISP/IAP 命令立即被触发起动
91 1 unsigned char idata i=0x00;
92 1
93 1 ISP_ADDRH = 0x28;
94 1 ISP_ADDRL = 0x80; //指定该扇区的任何一个地址即可
95 1 ISP_CONTR = WAIT_TIME;
96 1 ISP_CONTR |= 0x80;
97 1 ISP_CMD = ISP_IAP_SECTOR_ERASE;
98 1 EA = 0x00;
99 1 ISP_TRIG = 0x46;
100 1 ISP_TRIG = 0xb9;
101 1 EA = 0x01;
102 1
103 1 // -----------关闭ISP/IAP功能---------------
104 1 ISP_CONTR = 0x00;
105 1 ISP_CMD = 0x00;
106 1 ISP_TRIG = 0x00;
107 1 ISP_ADDRH = 0x00;
108 1 ISP_ADDRL = 0x00;
109 1
110 1 }
111
112 // -----------------------------------------------------------------------------
113 // ----- EEPROM的数据处理 ----------------------------------------------------
114 unsigned char xdata eeprom_operatemode=0x01;
115 void eeprom_process(void)
116 {if(eeprom_operatemode==0x01) //读出
117 1 {eeprom_read();
C51 COMPILER V7.06 EEPROM 09/13/2005 20:39:38 PAGE 3
118 2 if((eeprom_buffer[8]==0x55)&&(eeprom_buffer[9]==0xaa))
119 2 {exhaust_number=eeprom_buffer[3]*1000+eeprom_buffer[2]*100+eeprom_buffer[1]*10+eeprom_buffer[0];
120 3 authorize_number=eeprom_buffer[7]*1000+eeprom_buffer[6]*100+eeprom_buffer[5]*10+eeprom_buffer[4];
121 3 eeprom_operatemode=0x00;
122 3 }
123 2 else //否则初始化
124 2 {exhaust_number=0x00;
125 3 authorize_number=1000;
126 3 eeprom_operatemode=0x00;
127 3 }
128 2 }
129 1 else if(eeprom_operatemode==0x02) //写入
130 1 {eeprom_earse();
131 2 eeprom_buffer[0]=exhaust_number%10;
132 2 eeprom_buffer[1]=(exhaust_number%100)/10;
133 2 eeprom_buffer[2]=(exhaust_number%1000)/100;
134 2 eeprom_buffer[3]=exhaust_number/1000;
135 2 eeprom_buffer[4]=authorize_number%10;
136 2 eeprom_buffer[5]=(authorize_number%100)/10;
137 2 eeprom_buffer[6]=(authorize_number%1000)/100;
138 2 eeprom_buffer[7]=authorize_number/1000;
139 2 eeprom_buffer[8]=0x55;
140 2 eeprom_buffer[9]=0xaa;
141 2 eeprom_write();
142 2 eeprom_operatemode=0x00;
143 2 }
144 1 }
145
146
147 #endif
148
149
150
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 569 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 11 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- 3
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -