📄 lcd_main.lst
字号:
C51 COMPILER V6.12 LCD_MAIN 08/01/2005 20:10:26 PAGE 6
302 4 KeySETDown = 1;
303 4 else
304 4 KSDNum = KSDNum + 1; //前一秒内有按过SET则开始计数
305 4 }
306 3 if (SetTF==1) //在SET状态下
307 3 {
308 4 cur_temper_set[9]=0x3d; //"=" 显示set标志
309 4 cur_temper_set[10]=0x73; //"s"
310 4 cur_temper_set[11]=0x65; //"e"
311 4 cur_temper_set[12]=0x74; //"t"
312 4 if ((KeyV == 1) && (!KeyTF))
313 4 TMSetV = TMSetV + 1; //上调温度
314 4 if ((KeyV == 2) && (!KeyTF))
315 4 TMSetV = TMSetV - 1; //下调温度
316 4 if (TMSetV <= -55) //限制温度上下限
317 4 TMSetV = -55;
318 4 if (TMSetV >= 125)
319 4 TMSetV = 125;
320 4 }
321 3 if ((!KeyTF) && (IntNum3 == 0))
322 3 {
323 4 KeyTF = 1; //当键盘处于可用时,锁定
324 4 cur_temper_set[9]=0x20; // 显示空白
325 4 cur_temper_set[10]=0x20;
326 4 cur_temper_set[11]=0x20;
327 4 cur_temper_set[12]=0x20;
328 4 }
329 3 }
330 2
331 2 if (KeySETDown) //在2秒内按下了SET则计中断发生次数用于长按SET时计时用
332 2 IntNum = IntNum + 1;
333 2 if (IntNum > 55) //中断发生了55次时(大约1.2秒)75为1.5秒左右
334 2 {
335 3 IntNum = 0;
336 3 KeySETDown = 0;
337 3 if (KSDNum == 55) //如一直长按了SET1.2秒左右
338 3 {
339 4 RelayOutPort = 1; //关闭继电器输出
340 4 PowTF = 1; //电源标识关
341 4 //Delay_4s(); //延时
342 4 IntNum = 0;
343 4 IntNum2 = 0;
344 4 IntNum3 = 0;
345 4 BF = 0; //显示欢迎信息
346 4 EA=0;
347 4 }
348 3 KSDNum = 0;
349 3 }
350 2 }
351 1
352 1 KeyV = 0;
353 1 TempKeyV = 0; //清空变量准备下次键扫描
354 1 if (PowTF==0)
355 1 {
356 2 InitDS1820(); //初始化
357 2 ROMDS1820(); //跳过ROM
358 2 TMVDS1820(); //温度转换指令
359 2 Delay_510();
360 2 Delay_510(); //延时等待转换完成
361 2 InitDS1820(); //初始化
362 2 ROMDS1820(); //跳过ROM
363 2 TMRDS1820(); //读出温度指令
C51 COMPILER V6.12 LCD_MAIN 08/01/2005 20:10:26 PAGE 7
364 2 ReadDS1820(); //读出温度值
365 2 V2ToV(); //转换显示值
366 2
367 2 if (TMV > TMSetV) //根据采集到的温度值控制继电器
368 2 {
369 3 RelayOutPort = 0;
370 3 cur_temper_set[13]=0x20; //" "
371 3 cur_temper_set[14]=0x4f; //"O"
372 3 cur_temper_set[15]=0x4e; //"N"
373 3 }
374 2 else
375 2 {
376 3 RelayOutPort = 1;
377 3 cur_temper_set[13]=0x4f; //"O"
378 3 cur_temper_set[14]=0x46; //"F"
379 3 cur_temper_set[15]=0x46; //"F"
380 3 }
381 2
382 2 if (SetTF) IntNum2 = IntNum2 + 1; //用于闪烁计数
383 2 if (IntNum2 > 50 ) IntNum2 = 0;
384 2 if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按键连按
385 2 if (IntNum3 > 25)
386 2 {
387 3 IntNum3 = 0;
388 3 KeyTF = 0;
389 3 }
390 2 if ((SetTF) && (IntNum2 < 25)) goto InitEnd; //计数在后半段时显示
391 2 BF=1; //让显示温度值
392 2 EA=0; //关中断
393 2 }
394 1 InitEnd:;
395 1 }
396
397
398
399 void V2ToV(void) //数值转换
400 {
401 1 TLV = TLV >> 4;
402 1 THV = THV << 4; //读出的高低位数值移位
403 1 TMV = TLV | THV; //合并高低位放入TM为实际温度值
404 1 Sign = 0; Sign_Set=0;
405 1 Sign_Set = TMSetV >> 7; //取符号
406 1 Sign = TMV >> 7;
407 1
408 1 if (Sign)
409 1 {
410 2 LCD_One = (~TMV) / 100; //转换百位值
411 2 LCD_Two = ((~TMV) - LCD_One * 100)/10;
412 2 LCD_Three = (~TMV) - LCD_One * 100 - LCD_Two * 10;
413 2 }
414 1 else
415 1 {
416 2 LCD_One = (TMV) / 100; //转换百位值
417 2 LCD_Two = (TMV - LCD_One * 100)/10;
418 2 LCD_Three = TMV - LCD_One * 100 - LCD_Two * 10;
419 2 }
420 1
421 1 if (Sign_Set)
422 1 {
423 2 LCD_One_set = (~(TMSetV-1)) / 100; //SET状态下显示设定值
424 2 LCD_Two_set = ((~(TMSetV-1)) - LCD_One_set * 100)/10;
425 2 LCD_Three_set = (~(TMSetV-1)) - LCD_One_set * 100 - LCD_Two_set * 10;
C51 COMPILER V6.12 LCD_MAIN 08/01/2005 20:10:26 PAGE 8
426 2 }
427 1 else
428 1 {
429 2 LCD_One_set = (TMSetV) / 100; //SET状态下显示设定值
430 2 LCD_Two_set = (TMSetV - LCD_One_set * 100)/10;
431 2 LCD_Three_set = TMSetV - LCD_One_set * 100 - LCD_Two_set * 10;
432 2 }
433 1
434 1 //转LCD字段 温度值
435 1 if (LCD_One) //超过百时十位的处理
436 1 LCD_Two = LCDDis[LCD_Two];
437 1 else
438 1 {
439 2 if (LCD_Two == 0)
440 2 LCD_Two = LCDDis[10];
441 2 else
442 2 LCD_Two = LCDDis[LCD_Two];
443 2 }
444 1 if (Sign)
445 1 LCD_One = LCDDis[11];
446 1 else
447 1 {
448 2 if (LCD_One == 0)
449 2 LCD_One = LCDDis[10];
450 2 else
451 2 LCD_One = LCDDis[LCD_One];
452 2 }
453 1 LCD_Three = LCDDis[LCD_Three];
454 1
455 1
456 1 cur_temper[13]=LCD_One; //把温度值的ASCII码放入cur_temper的13,14,15位
457 1 cur_temper[14]=LCD_Two;
458 1 cur_temper[15]=LCD_Three;
459 1
460 1
461 1 //转LCD字段 设置值
462 1 if (LCD_One_set) //超过百时十位的处理
463 1 LCD_Two_set = LCDDis[LCD_Two_set];
464 1 else
465 1 {
466 2 if (LCD_Two_set == 0)
467 2 LCD_Two_set = LCDDis[10];
468 2 else
469 2 LCD_Two_set = LCDDis[LCD_Two_set];
470 2 }
471 1 if (Sign_Set)
472 1 LCD_One_set = LCDDis[11];
473 1 else
474 1 {
475 2 if (LCD_One_set == 0)
476 2 LCD_One_set = LCDDis[10];
477 2 else
478 2 LCD_One_set = LCDDis[LCD_One_set];
479 2 }
480 1 LCD_Three_set = LCDDis[LCD_Three_set];
481 1
482 1
483 1 cur_temper_set[6]=LCD_One_set; //把温度值的ASCII码放入cur_temper_set的6,7,8位
484 1 cur_temper_set[7]=LCD_Two_set;
485 1 cur_temper_set[8]=LCD_Three_set;
486 1
487 1 }
C51 COMPILER V6.12 LCD_MAIN 08/01/2005 20:10:26 PAGE 9
488
489 void dtod(void)
490 {
491 1
492 1 //count_One = cj / 100; //转换百位值
493 1 count_Two = cj/10;// - count_One * 100)/10;
494 1 count_Three = cj-count_Two * 10;// - count_One * 100 - count_Two * 10;
495 1 count_Two = LCDDis[count_Two];
496 1 count_Three = LCDDis[count_Three];
497 1 count_cj2 = LCDDis[cj2]; //把记数值的ASCII码放入cur_count的13,14,15位
498 1 cur_count[12]=count_Two;
499 1 cur_count[13]=count_Three;
500 1 cur_count[11]=count_cj2;
501 1
502 1 }
503 //写数据
504 void WriteDataLCM(unsigned char WDLCM)
505 {
506 1 ReadStatusLCM(); //检测忙
507 1 LCM_Data = WDLCM;
508 1 LCM_RS = 1;
509 1 LCM_RW = 0;
510 1 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
511 1 LCM_E = 0; //延时
512 1 LCM_E = 1;
513 1 }
514
515 //写指令
516 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
517 {
518 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
519 1 LCM_Data = WCLCM;
520 1 LCM_RS = 0;
521 1 LCM_RW = 0;
522 1 LCM_E = 0;
523 1 LCM_E = 0;
524 1 LCM_E = 1;
525 1 }
526
527 //读数据
528 unsigned char ReadDataLCM(void)
529 {
530 1 LCM_RS = 1;
531 1 LCM_RW = 1;
532 1 LCM_E = 0;
533 1 LCM_E = 0;
534 1 LCM_E = 1;
535 1 return(LCM_Data);
536 1 }
537
538 //读状态
539 unsigned char ReadStatusLCM(void)
540 {
541 1 LCM_Data = 0xFF;
542 1 LCM_RS = 0;
543 1 LCM_RW = 1;
544 1 LCM_E = 0;
545 1 LCM_E = 0;
546 1 LCM_E = 1;
547 1 while (LCM_Data & Busy); //检测忙信号
548 1 return(LCM_Data);
549 1 }
C51 COMPILER V6.12 LCD_MAIN 08/01/2005 20:10:26 PAGE 10
550
551 void LCMInit(void) //LCM初始化
552 {
553 1 LCM_Data = 0;
554 1 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
555 1 Delay5Ms();
556 1 WriteCommandLCM(0x38,0);
557 1 Delay5Ms();
558 1 WriteCommandLCM(0x38,0);
559 1 Delay5Ms();
560 1
561 1 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
562 1 WriteCommandLCM(0x08,1); //关闭显示
563 1 WriteCommandLCM(0x01,1); //显示清屏
564 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
565 1 WriteCommandLCM(0x0C,1); // 显示开及光标设置
566 1 }
567
568 //按指定位置显示一个字符
569 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
570 {
571 1 //Y &= 0x1;
572 1 //X &= 0xF; //限制X不能大于15,Y不能大于1
573 1 if (Y==1) X |= 0x40; //当要显示第二行时地址码+0x40;
574 1 if (Y==2) X |= 0x10;
575 1 if (Y==0) X |= 0x00;
576 1 if (Y==3) X |= 0x50;
577 1 X |= 0x80; //算出指令码
578 1 WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
579 1 WriteDataLCM(DData);
580 1 }
581
582 //按指定位置显示一串字符 (***原来的遇到空格0x20就不显示***)
583 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
584 {
585 1 unsigned char ListLength, j;
586 1 ListLength = strlen(DData); //计算要显示的字符串长度
587 1 X &= 0xF; //限制X不能大于15,Y不能大于1
588 1 if (X <= 0xF) //X坐标应小于0xF
589 1 {
590 2 for (j=0;j<ListLength;j++)
591 2 {
592 3 DisplayOneChar(X, Y, DData[j]); //显示单个字符
593 3 X++;
594 3 }
595 2 }
596 1 }
597
598 //5ms延时
599 void Delay5Ms(void)
600 {
601 1 unsigned int TempCyc = 5552;
602 1 while(TempCyc--);
603 1 }
604
605 //400ms延时
606 void Delay400Ms(void)
607 {
608 1 unsigned char TempCycA = 5;
609 1 unsigned int TempCycB;
610 1 while(TempCycA--)
611 1 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -