📄 lcd_main.lst
字号:
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 + -