📄 18b20lcd.lst
字号:
260 1 {
261 2 SetPage(page,page);
262 2 SetAddress(0,0);
263 2 for (i=0;i<61;i++)
264 2 {PutCharR(0);
265 3 PutCharL(0);}
266 2 }
267 1 }
268
269
270
271 //---------------------------------------------------------------
272 //---------------------------------------------------------------
273 //采用zimo2 显示汉字,以汉字的显示方式
274 //void Draw_word(uchar d_where,uint x_add,bit layer,uchar width)
275 //d_where表示在码表中第几个汉字,x_add横坐标位置,layer显示的层, width显示的宽度。
276 //---------------------------------------------------------------
277
278
279 void Draw_word(uint d_where,uint x_add,bit layer,uchar width,bit s)
280 {
281 1 uchar x,address, //address表示显存的物理地址
282 1 page=0; //page表示上下两页
283 1 bit window=0; //window表示左右两页
284 1 //putcharR //右边
285 1 //putcharL //左边
286 1 if(s==0)
287 1 d_where=d_where*32;
288 1 else
289 1 d_where=304+d_where*16;
290 1
291 1 for (x=width;x>1;x--)
292 1 {
293 2 if (x_add>60)
294 2 {
295 3 window=1;address=x_add%61;
296 3 }
297 2 else
298 2 address=x_add;
299 2
300 2
301 2 if(layer==0) //显示一行八个字
302 2 {if (x_add>60)
303 3 {
C51 COMPILER V7.50 18B20LCD 09/22/2008 16:02:08 PAGE 6
304 4 window=1;address=x_add%61;
305 4 }
306 3 else
307 3 address=x_add;
308 3 SetPage(0,0);
309 3 SetAddress(address,address);
310 3 if(window==1)
311 3 PutCharR(bmp001[d_where]);//右边
312 3 else
313 3 PutCharL(bmp001[d_where]);//左边
314 3
315 3 SetPage(1,1);
316 3 SetAddress(address,address);
317 3
318 3 if(window==1)
319 3 PutCharR(bmp001[d_where+width]);
320 3 else
321 3 PutCharL(bmp001[d_where+width]);
322 3
323 3 }
324 2 else
325 2 { //显示第二行八个汉字
326 3 SetPage(2,2);
327 3 SetAddress(address,address);
328 3 if(window==1)
329 3 PutCharR(bmp001[d_where]);//右边
330 3 else
331 3 PutCharL(bmp001[d_where]);//左边
332 3 SetPage(3,3);
333 3 SetAddress(address,address);
334 3 if(window==1)
335 3 PutCharR(bmp001[d_where+width]);
336 3 else
337 3 PutCharL(bmp001[d_where+width]);
338 3
339 3 }
340 2 x_add++;
341 2 d_where++;
342 2 }
343 1 }
344
345
346 void xianshi(void)
347 {
348 1
349 1
350 1
351 1 P0=zima1[zima2[3]]; //读取温度的高值;
352 1 a=1;b=1;c=0; //所放数的位置;
353 1 Draw_word(0,1,0,16,0); //每次只能显示14个汉字,即0~13位排列;
354 1 P0=zima1[zima2[4]]; //读取温度的高值
355 1 a=0;b=1;c=0;dp=1; //所放数的位置
356 1 Draw_word(1,17,0,16,0);
357 1 P0=zima1[zima2[5]]; //读取温度的高值
358 1 a=1;b=0;c=0; //所放数的位置
359 1 Draw_word(2,33,0,16,0);
360 1 P0=zima1[zima2[6]]; //读取温度的高值
361 1 a=0;b=0;c=0; //所放数的位置
362 1 Draw_word(3,49,0,16,0);
363 1 P0=zima1[zima2[3]]; //读取温度的高值;
364 1 a=1;b=1;c=0; //所放数的位置;
365 1 Draw_word(4,65,0,16,0);
C51 COMPILER V7.50 18B20LCD 09/22/2008 16:02:08 PAGE 7
366 1 P0=zima1[zima2[4]]; //读取温度的高值
367 1 a=0;b=1;c=0;dp=1; //所放数的位置
368 1 Draw_word(5,81,0,16,0);
369 1 P0=zima1[zima2[5]]; //读取温度的高值
370 1 a=1;b=0;c=0; //所放数的位置
371 1 Draw_word(6,97,0,16,0);
372 1 P0=zima1[zima2[6]]; //读取温度的高值
373 1 a=0;b=0;c=0; //所放数的位置
374 1 Draw_word(7,1,1,16,0);
375 1 P0=zima1[zima2[3]]; //读取温度的高值;
376 1 a=1;b=1;c=0; //所放数的位置;
377 1 Draw_word(8,17,1,16,0);
378 1 P0=zima1[zima2[4]]; //读取温度的高值
379 1 a=0;b=1;c=0;dp=1; //所放数的位置
380 1 Draw_word(9,33,1,8,0);
381 1 P0=zima1[zima2[5]]; //读取温度的高值
382 1 a=1;b=0;c=0; //所放数的位置
383 1
384 1 Draw_word(zima2[3],41,1,8,1);
385 1 P0=zima1[zima2[6]]; //读取温度的高值
386 1 a=0;b=0;c=0; //所放数的位置
387 1 Draw_word(zima2[4],49,1,8,1);
388 1 P0=zima1[zima2[3]]; //读取温度的高值;
389 1 a=1;b=1;c=0; //所放数的位置;
390 1 Draw_word(10,57,1,8,1);
391 1 P0=zima1[zima2[4]]; //读取温度的高值
392 1 a=0;b=1;c=0;dp=1; //所放数的位置
393 1 Draw_word(zima2[5],65,1,8,1);
394 1 P0=zima1[zima2[5]]; //读取温度的高值
395 1 a=1;b=0;c=0; //所放数的位置
396 1 Draw_word(zima2[6],73,1,8,1);
397 1 P0=P0=zima1[zima2[6]]; //读取温度的高值
398 1 a=0;b=0;c=0; //所放数的位置
399 1
400 1 }
401
402 void write1(unsigned int i) //计算所取得的数值;
403 {
404 1 i=i*100/17;
405 1 zima2[3]=i/1000;
406 1 zima2[4]=i/100%10;
407 1 zima2[5]=i/10%10;
408 1 zima2[6]=i%10;
409 1 xianshi();
410 1 }
411
412 //初始化函数
413 void Init_DS18B20(void)
414 {
415 1 unsigned char x=0;
416 1 DQ = 1; //DQ复位
417 1 delay1(8); //稍做延时
418 1 DQ = 0; //单片机将DQ拉低
419 1 delay1(80); //精确延时 大于 480us
420 1 DQ = 1; //拉高总线
421 1 delay1(14);
422 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
423 1 delay1(20);
424 1 }
425
426 //读一个字节
427 ReadOneChar(void)
C51 COMPILER V7.50 18B20LCD 09/22/2008 16:02:08 PAGE 8
428 {
429 1 unsigned char i=0;
430 1 unsigned char dat=0;
431 1 for (i=8;i>0;i--)
432 1 {
433 2 DQ = 0; // 给脉冲信号
434 2 dat>>=1;
435 2 DQ = 1; // 给脉冲信号
436 2 if(DQ)
437 2 dat|=0x80;
438 2 delay1(4);
439 2 }
440 1 return(dat);
441 1 }
442
443
444
445
446 //写一个字节
447 void WriteOneChar(unsigned char dat)
448 {
449 1 unsigned char i=0;
450 1 for (i=8; i>0; i--)
451 1 {
452 2 DQ = 0;
453 2 DQ = dat&0x01;
454 2 delay1(5);
455 2 DQ = 1;
456 2 dat>>=1;
457 2 }
458 1
459 1 }
460
461 //读取温度
462 unsigned int ReadTemperature(void)
463 {
464 1 unsigned char a=0;
465 1
466 1 unsigned int t=0;
467 1
468 1 Init_DS18B20();
469 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
470 1 WriteOneChar(0x44); // 启动温度转换
471 1 Init_DS18B20();
472 1 WriteOneChar(0xCC); //跳过读序号列号的操作
473 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
474 1 a=ReadOneChar();
475 1 t=ReadOneChar();
476 1
477 1 t<<=8;
478 1 t=t|a;
479 1
480 1 //t= tt*10+0.5; //放大10倍输出并四舍五入---此行没用
481 1 //a=tt+0.5;
482 1 return(t);
483 1 }
484
485
486 void main()
487 {
488 1 P2=0xfe;
489 1 lcdini();
C51 COMPILER V7.50 18B20LCD 09/22/2008 16:02:08 PAGE 9
490 1 clrscr();
491 1 while(1)
492 1 {
493 2 unsigned int i;
494 2
495 2 i=ReadTemperature();//读温度
496 2 write1(i);
497 2 }
498 1
499 1 }
500
501
502
503
504
505
506
507
508
509
510
511
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1455 ----
CONSTANT SIZE = 500 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 20 10
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 + -