📄 eeprom.lst
字号:
C51 COMPILER V7.50 EEPROM 06/20/2008 15:40:18 PAGE 4
179 bit IICWriteByte(Byte zI2CByteData)
180 {
181 1 Byte zI2CBit;
182 1 bit zI2CAck=0;
183 1 SDA_PINCR |= SDA; //SDA output to write bit 1~8 to slave
184 1 for( zI2CBit =8;zI2CBit>0;zI2CBit-- )
185 1 {
186 2 zI2CByteData *=2;
187 2 if(CY)
188 2 {
189 3 SDA_PIN =1; //send Bit1
190 3 }
191 2 else
192 2 {
193 3 SDA_PIN =0; //send Bit0
194 3 }
195 2 IICDelay();
196 2 SCL_PIN=1;
197 2 IICDelay();
198 2 SCL_PIN=0;
199 2 }
200 1 SDA_PIN=1; //SDA input to read ACK from slave
201 1 SDA_PINCR &= ~SDA;
202 1 IICDelay();
203 1 SCL_PIN=1;
204 1 zI2CAck = ~SDA_PIN;
205 1 IICDelay();
206 1 SCL_PIN =0;
207 1 return zI2CAck;
208 1 }
209 /*------------------------------------------------------------------------------------------
210 ; IICCheckBusBusy
211 ;return 1 if idle,return 0 if busy
212 ;-----------------------------------------------------------------------------------------*/
213 bit IICCheckBusBusy(void)
214 {
215 1 SDA_PINCR &= ~SDA;
216 1 SCL_PINCR &= ~SCL;
217 1 SDA_PIN=1;
218 1 SCL_PIN=1;
219 1 if(SDA_PIN && SCL_PIN)
220 1 {
221 2 return 1;
222 2 }
223 1 return 0;
224 1 }
225 /*------------------------------------------------------------------------------------------
226 ; EEPROMWrite
227 ;return 1 if communication success,return 0 if failure
228 ;-----------------------------------------------------------------------------------------*/
229 bit EEPROMWrite(Byte *zI2Cptr,Word zI2CByteAddr,Byte zI2CCounter)
230 {
231 1 bit zI2CError=0;
232 1 Byte zI2CDevAddrH = (((zI2CByteAddr>>8)*2)&0x0f) | Bin(10100000);
233 1 Byte zI2CDevAddrL = zI2CByteAddr & 0xff;
234 1 Byte zI2CRepeat = I2CFAILTIMES;
235 1
236 1 while(zI2CCounter!=0)
237 1 {
238 2 if(_testbit_(zI2CError)) //comunication error and retry
239 2 {
240 3 IICStop();
C51 COMPILER V7.50 EEPROM 06/20/2008 15:40:18 PAGE 5
241 3 IICDelayStop();
242 3 zI2CRepeat--;
243 3 if( zI2CRepeat==0 )
244 3 {
245 4 return 0;
246 4 }
247 3 }
248 2 if( ! IICCheckBusBusy()) //1.check bus stable
249 2 {
250 3 zI2CError = 1; //mark error flag
251 3 continue;
252 3 }
253 2 IICInit();
254 2 IICStart(); //2.start
255 2 if(! IICWriteByte(zI2CDevAddrH) ) //3.command to write
256 2 {
257 3 zI2CError = 1; //mark error flag
258 3 continue;
259 3 }
260 2 if(! IICWriteByte(zI2CDevAddrL)) //4.write address
261 2 {
262 3 zI2CError = 1; //mark error flag
263 3 continue;
264 3 }
265 2 do //5.write serial bytes
266 2 {
267 3 if( ! IICWriteByte(*zI2Cptr) )
268 3 {
269 4 zI2CError = 1; //mark error flag
270 4 break;
271 4 }
272 3 zI2CCounter--; //prepare to write next byte
273 3 zI2Cptr++;
274 3 zI2CDevAddrL ++;
275 3 if(zI2CCounter == 0)
276 3 {
277 4 IICStop(); //finished all bytes written
278 4 IICDelayStop();
279 4 return 1;
280 4 }
281 3 if(!(zI2CDevAddrL&PAGE_OVER_ROLL))
282 3 {
283 4 IICStop(); //switch to next page and continue to write rest bytes
284 4 IICDelayStop();
285 4 break;
286 4 }
287 3 }while(zI2CCounter>0);
288 2 }
289 1 }
290 /*------------------------------------------------------------------------------------------
291 ; EEPROMRead
292 ;return 1 if communication success,return 0 if failure
293 ;-----------------------------------------------------------------------------------------*/
294 bit EEPROMRead(Byte *zI2Cptr,Word zI2CByteAddr,Byte zI2CCounter)
295 {
296 1 bit zI2CError=0;
297 1 Byte zI2CDevAddrH = (((zI2CByteAddr>>8)*2)&0x0f) | Bin(10100000);
298 1 Byte zI2CDevAddrL = zI2CByteAddr & 0xff;
299 1 Byte zI2CRepeat = I2CFAILTIMES;
300 1 while(zI2CCounter!=0)
301 1 {
302 2 if(_testbit_(zI2CError)) //comunication error and retry
C51 COMPILER V7.50 EEPROM 06/20/2008 15:40:18 PAGE 6
303 2 {
304 3 IICStop();
305 3 IICDelayStop();
306 3 zI2CRepeat--;
307 3 if( zI2CRepeat==0 )
308 3 {
309 4 return 0;
310 4 }
311 3 }
312 2 if( ! IICCheckBusBusy()) //1.check bus stable
313 2 {
314 3 zI2CError = 1; //mark error flag
315 3 continue;
316 3 }
317 2 IICInit();
318 2 IICStart(); //2.start
319 2 if(! IICWriteByte(zI2CDevAddrH) ) //3.command to write
320 2 {
321 3 zI2CError = 1; //mark error flag
322 3 continue;
323 3 }
324 2 if(! IICWriteByte(zI2CDevAddrL)) //4.write address
325 2 {
326 3 zI2CError = 1; //mark error flag
327 3 continue;
328 3 }
329 2 IICInit();
330 2 IICStart(); //5.command to read
331 2 if(! IICWriteByte(zI2CDevAddrH | Bin(00000001)))
332 2 {
333 3 zI2CError = 1; //mark error flag
334 3 continue;
335 3 }
336 2 do //6.read serial bytes
337 2 {
338 3 zI2CCounter--;
339 3 *zI2Cptr = IICReadByte(zI2CCounter);
340 3 zI2Cptr++;
341 3 zI2CDevAddrL ++;
342 3 }while(zI2CCounter>0);
343 2 IICStop();
344 2 IICDelayStop();
345 2 return 1;
346 2 }
347 1 }
348
349
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 523 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 15
IDATA SIZE = ---- ----
BIT SIZE = ---- 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -