📄 eeprom.lst
字号:
C51 COMPILER V8.02 EEPROM 05/04/2008 21:35:46 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE EEPROM
OBJECT MODULE PLACED IN EEPROM.OBJ
COMPILER INVOKED BY: e:\Keil\C51\BIN\C51.EXE EEPROM.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <head.h>
2 #include "EEPROM.H"
3 #include <function.h>
4
5 BOOL E_err;
6
7 /**************************************************************************
8 * 函数原型:void I_start(void);
9 * 功 能:提供I2C总线工作时序中的起始位。
10 **************************************************************************/
11 void I_start(void)
12 {
13 1 SCL=HIGH;
14 1 _nop_();
15 1 _nop_();
16 1 SDA=LOW;
17 1 _nop_();
18 1 _nop_();
19 1 SCL=LOW;
20 1 _nop_();
21 1 _nop_();
22 1 }
23
24
25 /**************************************************************************
26 * 函数原型:void I_stop(void);
27 * 功 能:提供I2C总线工作时序中的停止位。
28 **************************************************************************/
29 void I_stop(void)
30 {
31 1 SDA=LOW;
32 1 _nop_();
33 1 _nop_();
34 1 SCL=HIGH;
35 1 _nop_();
36 1 _nop_();
37 1 SDA=HIGH;
38 1 _nop_();
39 1 _nop_();
40 1 SCL=LOW;
41 1 _nop_();
42 1 _nop_();
43 1 }
44
45 /**************************************************************************
46 * 函数原型:void I_init(void);
47 * 功 能:I2C总线初始化。在main()函数中应首先调用本函数,然后再用
48 * I2C其它函数。
49 **************************************************************************/
50 void I_init(void)
51 {
52 1 WP=0;
53 1 SCL=LOW;
54 1 _nop_();
55 1 I_stop();
C51 COMPILER V8.02 EEPROM 05/04/2008 21:35:46 PAGE 2
56 1 }
57
58 /**************************************************************************
59 * 函数原型:bit I_clock(void);
60 * 功 能:提供I2C总线的时钟信号,并返回在时钟电平为高期间SDA信号线上状
61 * 态。本函数可用于数据发送,也可用于数据接收。
62 **************************************************************************/
63 BOOL I_clock(void)
64 {
65 1 BOOL sample;
66 1 SCL=HIGH;
67 1 _nop_();
68 1 _nop_();
69 1 _nop_();
70 1 sample=SDA;
71 1 SCL=LOW;
72 1 _nop_();
73 1 _nop_();
74 1 _nop_();
75 1 return(sample);
76 1 }
77
78 /**************************************************************************
79 * 函数原型:bit I_send(Uchar I_data);
80 * 功 能:向I2C总线发送8位数据,并请求一个应答信号ACK。如果收到ACK应答,
81 * 则返回1(TRUE),否则返回0(FALSE)。
82 **************************************************************************/
83 BOOL I_send(Uchar I_data)
84 {
85 1 Uchar i;
86 1 /*发送8位数据*/
87 1 for(i=0;i<8;i++)
88 1 {
89 2 SDA=(BOOL)(I_data&0x80);
90 2 I_data=I_data<<1;
91 2 I_clock();
92 2 _nop_();
93 2 _nop_();
94 2 }
95 1 /*请求应答信号ACK*/
96 1 SDA=HIGH;
97 1 for(i=0;i<3;i++)
98 1 {
99 2 if(!I_clock())return 1;
100 2 delayms(1);
101 2 }
102 1 E_err=1;
103 1 return 0;
104 1 //return(~I_clock());
105 1 }
106
107 /**************************************************************************
108 * 函数原型:Uchar I_receive(void);
109 * 功 能:从I2C总线上接收8位数据信号,并将接收到的8位数据作为一个字节
110 * 返回,不回送应答信号ACK。主函数在调用本函数这前应保证SDA信
111 * 号线处于浮置状态。
112 **************************************************************************/
113 Uchar I_receive(void)
114 {
115 1 register Uchar I_data=0;
116 1 register Uchar i;
117 1 for(i=0;i<8;i++)
C51 COMPILER V8.02 EEPROM 05/04/2008 21:35:46 PAGE 3
118 1 {
119 2 I_data*=2;
120 2 _nop_();
121 2 _nop_();
122 2 if(I_clock())I_data++;
123 2 }
124 1 return(I_data);
125 1 }
126 /**************************************************************************
127 * 函数原型:void E_address(Uchar Address);
128 * 功 能:向24C02写入器件地址和一个指定的字节地址。
129 **************************************************************************/
130 void E_address(Uchar Address)
131 {
132 1 I_start();
133 1 I_send(WRITE);
134 1 I_send(Address);
135 1 }
136 /**************************************************************************
137 * 函数原型:void E_writeex(Uchar Address,Uchar *E_data,Uchar datan);
138 * 功 能:将 24C02 以Address起始的空间读入e_data指向的空间
139 **************************************************************************/
140 void E_writeex(Uchar Address,Uchar *E_data,Uchar datan)
141 {
142 1 Uchar i;
143 1 for(i=0;i<datan;i++)
144 1 {
145 2 E_write(Address+i,*(E_data+i));
146 2 delayms(10);
147 2 }
148 1 }
149 /**************************************************************************
150 * 函数原型:void E_readex(Uchar Address,Uchar *E_data,Uchar datan);
151 * 功 能:将E_data所指向的内容写入 24C02 以Address起始的空间
152 **************************************************************************/
153 void E_readex(Uchar Address,Uchar *E_data,Uchar datan)
154 {
155 1 Uchar i;
156 1 for(i=0;i<datan;i++)
157 1 {
158 2 *(E_data+i)=E_read(Address+i);
159 2 }
160 1 }
161 /**************************************************************************
162 * 函数原型:void E_write(Uchar Address,Uchar E_data);
163 * 功 能:将E_data内容写入到24C02的Address单元以及与它相对应的两个备份单元
164 * 如果总共有六次写入失败,LCD显示E2P ERR的内容,此时专业人员应检查
165 * 出错原因,系统停止工作。
166 **************************************************************************/
167 void E_write(Uchar Address,Uchar E_data)
168 {
169 1 Uchar i;
170 1
171 1 for(i=0;i<3;i++)
172 1 {EA=0;
173 2 E_address(Address);
174 2 I_send(E_data);
175 2 I_stop();
176 2 EA=1;
177 2 delayms(10);
178 2 Address=Address+E2PROM_bias;
179 2 }
C51 COMPILER V8.02 EEPROM 05/04/2008 21:35:46 PAGE 4
180 1 }
181
182 /**************************************************************************
183 * 函数原型:Uchar E_read(Uchar Address);
184 * 功 能:从24C02中读出地址为Address单元以及与它相对应的两个备份单元的内容,
185 * 如果三个都一样,那么返回值就是其中一个值;如果两个一样,另一个不 一样,
186 * 那么一样的值做为返回值;如果三个都不一样,那么认为中间的值做为返回值。
187 * 如果三个值有不一样的情况下,必须重新写入。以便三个值都一致。
188 * 如果读出三个数的失败的次数达到六次, LCD显示E2P ERR的内容,此时专业人员应检查
189 * 出错原因,系统停止工作。
190 **************************************************************************/
191 Uchar E_read(Uchar Address)
192 {
193 1 Uchar i;
194 1 Uchar accept[3];
195 1 for(i=0;i<3;i++)
196 1 {
197 2 EA=0;
198 2 E_address(Address);
199 2 I_start();
200 2 I_send(READ);
201 2 accept[i]=I_receive();
202 2 I_clock();
203 2 I_stop();
204 2 EA=1;
205 2 delayms(1);
206 2 Address=Address+E2PROM_bias;
207 2 }
208 1 if((accept[1]==accept[0])&&(accept[1]==accept[2]))return(accept[1]);
209 1 else if((accept[1]!=accept[0])&&(accept[1]!=accept[2]))
210 1 {E_err=1; return(accept[1]);}
211 1 else if(accept[0]==accept[2])accept[1]=accept[0];
212 1
213 1
214 1 E_write(Address,accept[1]);
215 1 return(accept[1]);
216 1 }
217
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 399 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 22
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -