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

📄 lcd_main.lst

📁 89c51的一个小程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
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 + -