• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

LCD1602显示问题 求指导

chunyang 2020-12-17 浏览量:549
我真的是要哭了,为啥这个会出现这种情况呢,代码如下
C1%9T1CH79JXBGROY5VSX@G.png
  1. #include "stc12c5a60s2.h"
  2. #include <intrins.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned int

  7. sbit RS=  P2^7  ;                                                        //液晶显示引脚定义
  8. sbit RW=  P2^6  ;
  9. sbit EN=  P2^5  ;

  10. uint  t=0,dian=0;
  11. uchar LCD_LINE_ONE[16]={"TP1:    "};                //定义显示屏幕
  12. uchar LCD_LINE_TWO[16]={"TP2:    "};

  13. int Tm;
  14. int  fushu=0 ;
  15. sbit DQ= P1^4;                                                                                   
  16. static unsigned char get_serial[]={                  //获取的八个DS18B20内部RAM64位序列号
  17.    1, 0,0,12,  135,  85, 127, 40,
  18.    149, 0,0,12,  134,  218, 150, 40
  19. };
  20. void delay( ms )                                          //用于液晶显示的延时函数
  21. {
  22.           int i ;
  23.           while(ms--)
  24.           {
  25.                for(i=0 ;i<5 ;i++ )  ;

  26.           }
  27. }

  28. uchar Read_LCD_State()                                  //读取液晶显示的状态
  29. {
  30.          uchar state;
  31.         RS=0;RW=1;EN=1;delay(1);
  32.         state=P0;
  33.         EN = 0;delay(1);
  34.         return state;
  35. }
  36. void LCD_Busy_Wait()                                 //如果忙则等待函数
  37. {
  38.          while((Read_LCD_State()&0x80)==0x80);
  39.         delay(5);
  40. }

  41. void Write_LCD_Zhilin(uchar zl)                          //液晶显示写指令函数
  42. {
  43.         LCD_Busy_Wait();
  44.         RS=0;RW=0;
  45.         EN=0;
  46.         P0=zl;
  47.         EN=1;
  48.         delay(1);
  49.         EN=0;        
  50. }
  51. void Write_LCD_shuju(uchar date)             //液晶显示写数据函数
  52. {
  53.          LCD_Busy_Wait();
  54.         RS=1;RW=0;
  55.         EN=0;
  56.         P0=date;
  57.         EN=1;
  58.         delay(1);
  59.         EN=0;        
  60. }
  61. void LCD_INIT()                                //液晶显示初始化
  62. {
  63.     Write_LCD_Zhilin(0x38);          // 显示模式设置
  64.         delay(1);                                 
  65.         Write_LCD_Zhilin(0x01);          // 显示清屏
  66.         delay(1);                                 
  67.         Write_LCD_Zhilin(0x06);          // 光标移动设置
  68.         delay(1);
  69.         Write_LCD_Zhilin(0x0c);          // 开及光标设置
  70.         delay(1);
  71. }
  72. void Display_LCD_String(uchar p,uchar *s)                  //液晶显示写入函数
  73. {
  74.          uchar i;
  75.         Write_LCD_Zhilin(p|0x80)        ;    //写地址高位为一
  76.         //Write_LCD_Zhilin(0x40|0x80)        ;
  77.         for(i=0;i<16;i++)
  78.         {
  79.                 Write_LCD_shuju(s[i]);
  80.                 delay(1);         
  81.         }
  82. }
  83. /***************************************************************************************/
  84. void delays(int us)                                           //用于DS18B20的延时函数
  85. { int s;
  86. for ( s=0; s<us; s++);
  87. }
  88. void rst(void)                                                //DS18B20初始化
  89. {
  90. DQ = 1;
  91. delays(20);
  92. DQ = 0;
  93. delays(300); //精确延时 480~960us
  94. DQ = 1;
  95. delays(80);
  96. }
  97. void write(unsigned char ku)                //DS18B20写函数
  98. {
  99. int i=0;
  100.      for (i=0;i<8;i++)
  101.     {
  102.                 DQ=0;
  103.                 DQ =ku&0x01;
  104.                 delays(30);
  105.                 DQ=1;
  106.                 ku>>=1;
  107.     }
  108. }
  109. void match_rom(unsigned char *rom)          //DS18B20匹配ROM函数
  110. {
  111. unsigned char i;
  112. rst();                                                          //初始化
  113. write(0x55);                                          //匹配ROM
  114. for(i=8;i>0;i--)
  115. {
  116.           write(*(rom+i-1));
  117. }

  118. }
  119. unsigned int read(void)                          //DS18B20读函数,每次读16位
  120. {
  121.         int i=0;
  122.         unsigned int u=0;
  123.     for (i=0;i<16;i++)
  124.     {
  125.                 DQ=0;
  126.                 u>>=1;
  127.                 DQ=1;
  128.                 if(DQ) u|=0x8000;
  129.                 delays(40);
  130.      }
  131.     return (u);
  132. }
  133. int  read0(unsigned char *seria)        //读取对应温度值并转换函数
  134. {
  135.      int temperature ;
  136.     unsigned int tp;
  137.     unsigned int lsb;
  138.     rst();                                  //初始化
  139.     write(0xCC);                  //跳过RAM
  140.         write(0x44);                  //温度转换
  141.         rst();                                  //再次初始化
  142.         write(0xCC);
  143.         match_rom(seria);    //匹配ROM函数调用
  144.                  write(0xBE);         //读取存储器指令
  145.         tp=read();                         //读取温度值
  146.         if((tp&0xf800)==0xf800)                //判断正负数
  147.             {
  148.                      fushu=1 ;
  149.                       tp=~tp+1 ;
  150.                     lsb=(unsigned int)(tp*6.25);
  151.                         dian=lsb%100;                  //取小数部分
  152.                
  153.                      temperature=lsb/100;

  154.                 }
  155.      else
  156.             {
  157.                     fushu=0;
  158.                     lsb=(unsigned int)(tp*6.25);
  159.                         dian=lsb%100;  
  160.                
  161.                      temperature=lsb/100;

  162.              }
  163.      return(temperature);
  164. }
  165. /*****************************************************************************************/
  166. void main()
  167. {
  168.       uint i ;
  169.           LCD_INIT();
  170.           EA=0 ;                 //使用DS18B20禁止任何中断
  171.           while(1)
  172.          {         
  173.               for(i=0;i<2;i++)
  174.                   {        
  175.                       Tm=read0(get_serial+i*8);
  176.                                 if(i==0)                                   //判断是第几个的数据
  177.                                 {
  178.                                            if(fushu==0)                                           //判断是否加负号
  179.                                                 sprintf(LCD_LINE_ONE+5," %d", Tm);
  180.                                            if(fushu==1)
  181.                                                     sprintf(LCD_LINE_ONE+5,"-%d", Tm);
  182.                                        sprintf(LCD_LINE_ONE+10,".%d",dian);                //加入小数部分
  183.                                            Display_LCD_String(0x00,LCD_LINE_ONE);
  184.                                  }
  185.                                 if(i==1)
  186.                                 {  
  187.                                        if(fushu==0)        
  188.                                                  sprintf(LCD_LINE_TWO+5," %d", Tm);
  189.                                            if(fushu==1)
  190.                                                      sprintf(LCD_LINE_TWO+5,"-%d", Tm);
  191.                                        sprintf(LCD_LINE_TWO+10,".%d",dian);
  192.                                            Display_LCD_String(0x40,LCD_LINE_TWO);
  193.                                 }

  194.                   }

  195.                
  196.          }
  197. }

复制代码



0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 你要找到对应的数据手册,明确数据传输格式来编写对应的驱动。

    你应该分步、分阶段调试,

    现在其实看不出你到底有什么问题。

    1. 确定DS18B20数据读取是否有问题

    2. 单独调试显示控制是否有问题(用固定数据来显示进行测试)

    3. 结合1、2完成项目

    估计你并不是按上面分步、分阶段实施的。

    • 发布于 2020-12-18
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:2
  • 我觉得首先你需要进行单步调试,或者说是分块调试,首先确认LCD_LINE_ONE这个字符串的内容到底对不对,如果这个字符串的内容正确,那就是你显示函数的问题。然后再确认显示一串固定的字符串是否正确。
    • 发布于2020-12-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 我感觉这个语句出问题概率大Tm=read0(get_serial+i*8);你可以用串口调试打印出来看看,过去读取数据有问题导致复制数据出错
    • 发布于2020-12-17
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

LCD1602显示问题 求指导