?? 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 + -