⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_main.lst

📁 LCD显示温控器制作成功 参考了明浩的温度控制器V1.5和使用1602液晶显示和PS/2键盘的示例
💻 LST
📖 第 1 页 / 共 3 页
字号:
 247   1                              {
 248   2                                      InitDS1820();   //初始化
 249   2                                      ROMDS1820();    //跳过ROM
 250   2                                      TMVDS1820();  //温度转换指令
 251   2                                      Delay_510();
 252   2                                      Delay_510();  //延时等待转换完成
 253   2                                      InitDS1820(); //初始化
 254   2                                      ROMDS1820();    //跳过ROM
 255   2                                      TMRDS1820();    //读出温度指令
 256   2                                      ReadDS1820(); //读出温度值
 257   2                                      V2ToV();        //转换显示值
 258   2                                      if (TMV > TMSetV)   //根据采集到的温度值控制继电器
 259   2                                              {
 260   3                                                      RelayOutPort = 0;
 261   3                                                      cur_temper_set[13]=0x20;        //" "
 262   3                                                      cur_temper_set[14]=0x4f;        //"O"
 263   3                                                      cur_temper_set[15]=0x4e;        //"N"
 264   3                                              }
 265   2                                      else
 266   2                                              {
 267   3                                                      RelayOutPort = 1;
 268   3                                                      cur_temper_set[13]=0x4f;        //"O"
 269   3                                                      cur_temper_set[14]=0x46;        //"F"
 270   3                                                      cur_temper_set[15]=0x46;        //"F"
 271   3                                              }
 272   2      
 273   2                                      if (SetTF)      IntNum2 = IntNum2 + 1; //用于闪烁计数
 274   2                                      if (IntNum2 > 50 )      IntNum2 = 0;
 275   2                                      if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按键连按
 276   2                                      if (IntNum3 > 25) 
 277   2                                              {
 278   3                                                      IntNum3 = 0;
 279   3                                                      KeyTF = 0;
 280   3                                              }
 281   2                                      if ((SetTF) && (IntNum2 < 25)) goto InitEnd;  //计数在后半段时显示
 282   2                                      BF=1;   //让显示温度值
 283   2                                      EA=0;   //关中断
 284   2                              }
 285   1                              InitEnd:;
 286   1      }
 287          
 288          
 289          
 290          void V2ToV(void)        //数值转换
 291          {
 292   1              TLV = TLV >> 4;                 
 293   1              THV = THV << 4;                 //读出的高低位数值移位
 294   1              TMV = TLV | THV;                //合并高低位放入TM为实际温度值
 295   1              Sign = 0; Sign_Set=0;
 296   1          Sign_Set = TMSetV >> 7;          //取符号
 297   1          Sign = TMV >> 7;
 298   1      
 299   1              if (Sign)
 300   1                      {
 301   2                      LCD_One = (~TMV) / 100;                                                 //转换百位值            
C51 COMPILER V7.09   LCD_MAIN                                                              08/12/2004 17:38:42 PAGE 6   

 302   2                      LCD_Two = ((~TMV) - LCD_One * 100)/10;
 303   2                              LCD_Three = (~TMV) - LCD_One * 100 - LCD_Two * 10;
 304   2                      }
 305   1              else
 306   1                      {
 307   2                              LCD_One = (TMV) / 100;                                                  //转换百位值            
 308   2                      LCD_Two = (TMV - LCD_One * 100)/10;
 309   2                              LCD_Three = TMV - LCD_One * 100 - LCD_Two * 10;
 310   2                      }
 311   1      
 312   1              if (Sign_Set)
 313   1                      {
 314   2                      LCD_One_set = (~(TMSetV-1)) / 100;          //SET状态下显示设定值
 315   2                      LCD_Two_set = ((~(TMSetV-1)) - LCD_One_set * 100)/10;
 316   2                              LCD_Three_set = (~(TMSetV-1)) - LCD_One_set * 100 - LCD_Two_set * 10;
 317   2                      }
 318   1              else
 319   1                      {
 320   2                              LCD_One_set = (TMSetV) / 100;          //SET状态下显示设定值
 321   2                      LCD_Two_set = (TMSetV - LCD_One_set * 100)/10;
 322   2                              LCD_Three_set = TMSetV - LCD_One_set * 100 - LCD_Two_set * 10;
 323   2                      }
 324   1      
 325   1      //转LCD字段  温度值     
 326   1              if (LCD_One) //超过百时十位的处理
 327   1                      LCD_Two = LCDDis[LCD_Two];              
 328   1              else
 329   1                      {
 330   2                              if (LCD_Two == 0)
 331   2                                      LCD_Two = LCDDis[10];
 332   2                              else
 333   2                                      LCD_Two = LCDDis[LCD_Two];
 334   2                      }
 335   1              if (Sign)
 336   1                      LCD_One = LCDDis[11];
 337   1              else
 338   1                      {
 339   2                              if (LCD_One == 0)
 340   2                                      LCD_One = LCDDis[10];
 341   2                              else
 342   2                                      LCD_One = LCDDis[LCD_One];
 343   2                      }
 344   1              LCD_Three = LCDDis[LCD_Three];
 345   1      
 346   1      
 347   1                                      cur_temper[13]=LCD_One;         //把温度值的ASCII码放入cur_temper的13,14,15位
 348   1                                      cur_temper[14]=LCD_Two;         
 349   1                                      cur_temper[15]=LCD_Three;       
 350   1      
 351   1      
 352   1      //转LCD字段  设置值     
 353   1              if (LCD_One_set) //超过百时十位的处理
 354   1                      LCD_Two_set = LCDDis[LCD_Two_set];              
 355   1              else
 356   1                      {
 357   2                              if (LCD_Two_set == 0)
 358   2                                      LCD_Two_set = LCDDis[10];
 359   2                              else
 360   2                                      LCD_Two_set = LCDDis[LCD_Two_set];
 361   2                      }
 362   1              if (Sign_Set)
 363   1                      LCD_One_set = LCDDis[11];
C51 COMPILER V7.09   LCD_MAIN                                                              08/12/2004 17:38:42 PAGE 7   

 364   1              else
 365   1                      {
 366   2                              if (LCD_One_set == 0)
 367   2                                      LCD_One_set = LCDDis[10];
 368   2                              else
 369   2                                      LCD_One_set = LCDDis[LCD_One_set];
 370   2                      }
 371   1              LCD_Three_set = LCDDis[LCD_Three_set];
 372   1      
 373   1      
 374   1                                      cur_temper_set[6]=LCD_One_set;          //把温度值的ASCII码放入cur_temper_set的6,7,8位
 375   1                                      cur_temper_set[7]=LCD_Two_set;          
 376   1                                      cur_temper_set[8]=LCD_Three_set;        
 377   1      
 378   1      }
 379          
 380          //写数据
 381          void WriteDataLCM(unsigned char WDLCM)
 382          {
 383   1      ReadStatusLCM(); //检测忙
 384   1      LCM_Data = WDLCM;
 385   1      LCM_RS = 1;
 386   1      LCM_RW = 0;
 387   1      LCM_E = 0; //若晶振速度太高可以在这后加小的延时
 388   1      LCM_E = 0; //延时
 389   1      LCM_E = 1;
 390   1      }
 391          
 392          //写指令
 393          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
 394          {
 395   1      if (BuysC) ReadStatusLCM(); //根据需要检测忙
 396   1      LCM_Data = WCLCM;
 397   1      LCM_RS = 0;
 398   1      LCM_RW = 0; 
 399   1      LCM_E = 0;
 400   1      LCM_E = 0;
 401   1      LCM_E = 1; 
 402   1      }
 403          
 404          //读数据
 405          unsigned char ReadDataLCM(void)
 406          {
 407   1      LCM_RS = 1; 
 408   1      LCM_RW = 1;
 409   1      LCM_E = 0;
 410   1      LCM_E = 0;
 411   1      LCM_E = 1;
 412   1      return(LCM_Data);
 413   1      }
 414          
 415          //读状态
 416          unsigned char ReadStatusLCM(void)
 417          {
 418   1      LCM_Data = 0xFF; 
 419   1      LCM_RS = 0;
 420   1      LCM_RW = 1;
 421   1      LCM_E = 0;
 422   1      LCM_E = 0;
 423   1      LCM_E = 1;
 424   1      while (LCM_Data & Busy); //检测忙信号
 425   1      return(LCM_Data);
C51 COMPILER V7.09   LCD_MAIN                                                              08/12/2004 17:38:42 PAGE 8   

 426   1      }
 427          
 428          void LCMInit(void) //LCM初始化
 429          {
 430   1      LCM_Data = 0;
 431   1      WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 432   1      Delay5Ms(); 
 433   1      WriteCommandLCM(0x38,0);
 434   1      Delay5Ms(); 
 435   1      WriteCommandLCM(0x38,0);
 436   1      Delay5Ms(); 
 437   1      
 438   1      WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 439   1      WriteCommandLCM(0x08,1); //关闭显示
 440   1      WriteCommandLCM(0x01,1); //显示清屏
 441   1      WriteCommandLCM(0x06,1); // 显示光标移动设置
 442   1      WriteCommandLCM(0x0C,1); // 显示开及光标设置
 443   1      }
 444          
 445          //按指定位置显示一个字符
 446          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 447          {
 448   1      Y &= 0x1;
 449   1      X &= 0xF; //限制X不能大于15,Y不能大于1
 450   1      if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 451   1      X |= 0x80; //算出指令码
 452   1      WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
 453   1      WriteDataLCM(DData);
 454   1      }
 455          
 456          //按指定位置显示一串字符 (***原来的遇到空格0x20就不显示***)
 457          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 458          {
 459   1              unsigned char ListLength, j;
 460   1              ListLength = strlen(DData);     //计算要显示的字符串长度
 461   1              Y &= 0x1;
 462   1              X &= 0xF; //限制X不能大于15,Y不能大于1
 463   1                              if (X <= 0xF) //X坐标应小于0xF
 464   1                                      {
 465   2                                              for (j=0;j<ListLength;j++)
 466   2                                                      {
 467   3                                                              DisplayOneChar(X, Y, DData[j]); //显示单个字符
 468   3                                                              X++;
 469   3                                                      }
 470   2                                      }
 471   1      }
 472          
 473          //5ms延时
 474          void Delay5Ms(void)
 475          {
 476   1      unsigned int TempCyc = 5552;
 477   1      while(TempCyc--);
 478   1      }
 479          
 480          //400ms延时
 481          void Delay400Ms(void)
 482          {
 483   1      unsigned char TempCycA = 5;
 484   1      unsigned int TempCycB;
 485   1      while(TempCycA--)
 486   1      {
 487   2      TempCycB=7269;
C51 COMPILER V7.09   LCD_MAIN                                                              08/12/2004 17:38:42 PAGE 9   

 488   2      while(TempCycB--);
 489   2      };
 490   1      }
 491          
 492          
 493          void InitDS1820(void)           //初始化DS1820
 494          {
 495   1              TMPort = 1;             //拉高TMPort
 496   1              _nop_();      //保持一个周期
 497   1              TMPort = 0;             //拉低TMPort
 498   1        Delay_510();  //延时  DS1820复位时间要500us的低电平
 499   1        TMPort = 1;   //拉高TMPort
 500   1              _nop_();      //保持  
 501   1              _nop_();
 502   1              _nop_();
 503   1      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -