📄 18b20.lst
字号:
251 2 DQ=1;
252 2 if(DQ==1)
253 2 u|=0x80;
254 2 TempDelay(4);
255 2 _nop_();
256 2 }
257 1 return(u);
258 1 }
259 //-------------------------------------
260 void Delay(unsigned int t) // delay 40us
261 {
262 1 for(;t!=0;t--) ;
263 1 }
264 //=============================================
265 void SendCommandByte(unsigned char ch)
266 {
267 1 RS=0;
268 1 RW=0;
269 1 P0=ch;
270 1 E=1;
271 1 Delay(1);
272 1 E=0;
273 1 Delay(100); //delay 40us
274 1 }
275 //-------------------------------------------------------
276 void SendDataByte(unsigned char ch)
277 { RS=1;
278 1 RW=0;
279 1 P0=ch;
280 1 E=1;
281 1 Delay(1);
282 1 E=0;
283 1 Delay(100); //delay 40us
284 1 }
285 //-------------------------------------------------
286 void InitLcd()
287 {SendCommandByte(0x30);
288 1 SendCommandByte(0x30);
289 1 SendCommandByte(0x30);
290 1 SendCommandByte(0x38); //设置工作方式
291 1 SendCommandByte(0x0c); //显示状态设置
292 1 SendCommandByte(0x01); //清屏
293 1 SendCommandByte(0x06); //输入方式设置
294 1 }
295
296
297 /*----------------------I2C要用到的一些子程序---------------------------------*/
298 /***********************以下为一些用到的子程序*********************************/
299 /*延时子程序*/
300 void Delay_1ms(Uchar time)
301 {
302 1 Uchar j;
303 1 while(time--)
C51 COMPILER V7.06 18B20 12/07/2007 03:15:42 PAGE 6
304 1 {
305 2 for(j=163;j!=0;j--)
306 2 {;}
307 2 }
308 1 }
309
310 /*I2C的起动程序*/
311 void I2CStart(void)
312 {
313 1 SDA = 1;
314 1 SomeNOP();
315 1 SCL = 1;
316 1 SomeNOP();
317 1 SDA = 0;
318 1 SomeNOP();
319 1 SCL = 0;
320 1 SomeNOP();
321 1 }
322
323 /*I2C的停止程序*/
324 void I2CStop(void)
325 {
326 1 SDA = 0;
327 1 SomeNOP();
328 1 SCL = 1;
329 1 SomeNOP();
330 1 SDA = 1;
331 1 SomeNOP();
332 1 }
333 /*
334 void I2CACK(void) //Acknowledge信号
335 {
336 SDA = 0;
337 SomeNOP();
338 SCL = 1;
339 SomeNOP();
340 SCL = 0;
341 SomeNOP();
342 }
343
344 void I2CNACK(void) //没有Acknowledge信号
345 {
346 SDA = 1;
347 SomeNOP();
348 SCL = 1;
349 SomeNOP();
350 SCL = 0;
351 SomeNOP();
352 }
353 */
354 void AutoACK(void) //在一定的时间内自动确定ACK的信号//
355 {
356 1 Uchar i = 0;
357 1 SCL = 1;
358 1 SomeNOP();
359 1 while((SDA == 1)&&(i<255))i++;
360 1 SCL = 0;
361 1 SomeNOP();
362 1 }
363
364
365 /*I2C写数据程序(向数据线上写一个BYTE)*/
C51 COMPILER V7.06 18B20 12/07/2007 03:15:42 PAGE 7
366 void Writex(Uchar j)
367 {
368 1 Uchar i,temp;
369 1 temp = j;
370 1 for (i=0;i<8;i++) //串行移位,先送高位,再送低位//
371 1 {
372 2 temp =temp<<1;
373 2 SCL = 0;
374 2 SomeNOP();
375 2 SDA = CY;
376 2 SomeNOP();
377 2 SCL = 1;
378 2 SomeNOP();
379 2 }
380 1 SCL = 0;
381 1 SomeNOP();
382 1 SDA = 1;
383 1 SomeNOP();
384 1 }
385 /*I2C读数据程序(从数据线上读出一个BYTE)返回值为读出的数据(BYTE型)*/
386 Uchar Readx(void)
387 {
388 1 Uchar i,j,k=0;
389 1 SCL = 0;
390 1 SomeNOP();
391 1 SDA = 1;
392 1 for (i=0;i<8;i++) // 串行移位,先读出高位,后读出低位//
393 1 {
394 2 SomeNOP();
395 2 SCL = 1;
396 2 SomeNOP();
397 2 if(SDA ==1) j=1;
398 2 else j=0;
399 2 k =(k<<1)|j;
400 2 SCL = 0;
401 2 }
402 1 SomeNOP();
403 1 return(k); //返回读出的值//
404 1 }
405
406 //******************以下为对24CXX系列的读写程序******************************//
407 //*************24CXX的device address 为写0A0H,读为0A1H*********************//
408 /*某个地址写数据*/
409 void X24_Write(Uchar Addresslow,Uchar Write_date)
410 {
411 1 I2CStart();
412 1 Writex(0xA0);
413 1 AutoACK();
414 1 Writex(Addresslow);
415 1 AutoACK();
416 1 Writex(Write_date);
417 1 AutoACK();
418 1 I2CStop();
419 1 Delay_1ms(10);
420 1 }
421
422 /*对某个地址读操作,函数值为读出的数据*/
423 Uchar X24_Read(Uchar Addresslow)
424 {
425 1 Uchar i;
426 1 I2CStart();
427 1 Writex(0xA0);
C51 COMPILER V7.06 18B20 12/07/2007 03:15:42 PAGE 8
428 1 AutoACK();
429 1 Writex(Addresslow);
430 1 AutoACK();
431 1 I2CStart();
432 1 Writex(0xA1);
433 1 AutoACK();
434 1 i =Readx();
435 1 //ACK(); //注意:这里不能有ACK应答信号//
436 1 I2CStop();
437 1 Delay_1ms(0);
438 1 return(i);
439 1 }
440
441 /*对内存中的数据块写入,入口为写EEPROM的地址,内存缓冲中的数据的起始地址(是IDATA的数据)*/
442 /*
443 void X24_WritePage(Uchar Addresshigh,Uchar Addresslow,Uchar idata *Writeip)
444 {
445 Uchar i;
446 I2CStart();
447 Writex(0xA0);
448 AutoACK();
449 Writex(Addresshigh);
450 AutoACK();
451 Writex(Addresslow);
452 AutoACK();
453 for(i=0;i<16;i++)
454 {
455 Writex(*Writeip++);
456 AutoACK();
457 }
458 I2CStop();
459 }
460 */
461 /*把EEPROM中的数据读出来存放在内存缓冲中,起始地址为(是IDATA的数据)*/
462 /*
463 void X24_ReadPage(Uchar Addresshigh,Uchar Addresslow,Uchar idata *Readip)
464 {
465 Uchar i;
466 I2CStart();
467 Writex(0xA0);
468 AutoACK();
469 Writex(Addresshigh);
470 AutoACK();
471 Writex(Addresslow);
472 AutoACK();
473 I2CStart();
474 Writex(0xA1);
475 AutoACK();
476 for(i=0;i<16;i++) //PAGE读的时候最后一个BYTE不要ACK信号//
477 {
478 *Readip = Readx();
479 Readip = Readip++;
480 I2CACK();
481 }
482 *Readip = Readx();
483 I2CNACK();
484 I2CStop();
485 Delay_1ms(0);
486 }
487 */
488
489 void ramini(void)
C51 COMPILER V7.06 18B20 12/07/2007 03:15:42 PAGE 9
490 {
491 1 TMP.cChar[0]=X24_Read(0x10);
492 1 TMP.cChar[1]=X24_Read(0x11);
493 1 highwd=TMP.iInt;
494 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1071 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 2
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 + -