找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1633|回复: 1
收起左侧

51单片机+LCD12864温湿度检测只亮不显示的问题

[复制链接]
ID:515099 发表于 2019-4-18 12:29 | 显示全部楼层 |阅读模式
0.png

这个只亮不显示,为什么?要怎么改啊?

  1. sbit LCD_CS = P0^0;    //片选信号输入
  2. sbit LCD_STD = P0^1;   //串行数据输入
  3. sbit LCD_SCLK = P0^2;  //串行时钟输入

  4. void delay_nms(uint t)
  5. {
  6.     uint i;
  7.     uchar j;
  8.     for(i=0;i<t;i++)
  9.       for(j=0;j<110;j++);
  10. }
  11. /*********************************************************
  12. *函数功能:向lcd12864串行输入一个字节
  13. **********************************************************/
  14. void send_byte(uchar Dbyte)
  15. {
  16.     uchar i;
  17.     for(i=0;i<8;i++)
  18.     {
  19.       LCD_SCLK = 0;
  20.       Dbyte = Dbyte<<1;
  21.       LCD_STD = CY;
  22.       LCD_SCLK = 1;
  23.       _nop_();
  24.       LCD_SCLK = 0;
  25.     }   
  26. }
  27. /*********************************************************
  28. *函数功能:接收lcd12864输出的一个有效字节
  29. **********************************************************/
  30. uchar recive_byte()
  31. {
  32.     uchar temp1,temp2,i;
  33.     bit flag;
  34.     temp1 = 0;
  35.     temp2 = 0;
  36.     for(i=0;i<8;i++)//接收有效字节的高四位
  37.     {
  38.         temp1 = temp1<<1;
  39.         LCD_SCLK = 0;
  40.          LCD_SCLK = 1;
  41.         _nop_();
  42.         LCD_SCLK = 0;
  43.         flag = LCD_STD;
  44.         if(flag==1)
  45.           temp1 = temp1&0x01;  
  46.     }
  47.     for(i=0;i<8;i++)//接收有效字节的低四位
  48.     {
  49.         temp2 = temp2<<1;
  50.         LCD_SCLK = 0;
  51.          LCD_SCLK = 1;
  52.         _nop_();
  53.         LCD_SCLK = 0;
  54.         flag = LCD_STD;
  55.         if(flag==1)
  56.           temp2 = temp2&0x01;  
  57.     }   
  58.     return ((temp1&0xf0)|(temp2&0x0f));//返回接收到的有效字节
  59. }
  60. /*********************************************************
  61. *函数功能:检测忙标志位
  62. **********************************************************/
  63. void lcd12864_checkbusy()
  64. {
  65.     do
  66.     {
  67.         send_byte(0xfc);//1111 1【1 RW】【0 RS】0
  68.     }while(recive_byte()&0x80==0x80);  //BF(.7)=1 Busy
  69. }

  70. /*********************************************************
  71. *函数功能:向12864写命令函数
  72. **********************************************************/
  73. void lcd12864_write_com(uchar com)
  74. {
  75.     LCD_CS = 1;
  76.     lcd12864_checkbusy();//检测忙信号
  77.      send_byte(0xf8);//1111 1[0 rw][0 rs]0   写命令起始指令
  78.     send_byte(com&0xf0);   
  79.     send_byte((com<<4)&0xf0);
  80.     LCD_CS = 0;
  81. }
  82. /*********************************************************
  83. *函数功能:向12864写数据函数
  84. **********************************************************/
  85. void lcd12864_write_dat(uchar dat)
  86. {
  87.     LCD_CS = 1;
  88.     lcd12864_checkbusy();//检测忙信号
  89.     send_byte(0xfa);//1111 1[0 rw][1 rs]0  写数据起始指令
  90.     send_byte(dat&0xf0);
  91.     send_byte((dat<<4)&0xf0);
  92.     LCD_CS = 0;
  93. }
  94. /*********************************************************
  95. *函数功能:设置光标位置
  96. **********************************************************/
  97. void lcd12864_set_cursor(uchar x,uchar y)
  98. {
  99.     uchar addr;
  100.     switch(x)//确定行
  101.     {
  102.         case 0x00:addr = 0x80;break;//第一行
  103.         case 0x01:addr = 0x90;break;//第二行
  104.         case 0x02:addr = 0x88;break;//第三行
  105.         case 0x03:addr = 0x98;break;//第四行
  106.         default:break;
  107.     }
  108.     addr += y;                      //确定列
  109.     lcd12864_write_com(addr);       //设置光标
  110. }
  111. /*********************************************************
  112. *函数功能:lcd12864清显示(显示汉字、字符模式下的清屏)
  113. **********************************************************/
  114. void lcd12864_clear0(void)
  115. {
  116.     lcd12864_write_com(0x01);
  117.     delay_nms(10);
  118. }
  119. /*********************************************************
  120. *函数功能:lcd12864清显示(绘图模式下的清屏)
  121. **********************************************************/
  122. void lcd12864_clear1(void)
  123. {
  124.     uchar i, j, k ;
  125.     lcd12864_write_com(0x34);//功能设置:扩充指令集动作
  126.     lcd12864_write_com(0x36);//开绘图显示
  127.     for( i = 0 ; i < 2 ; i++ )//分上下两屏写
  128.     {
  129.         for( j = 0 ; j < 32 ; j++ )
  130.         {
  131.           lcd12864_write_com( 0x80 + j ) ;//写Y坐标(行坐标)
  132.             if( i == 0 )                  //写X坐标(列坐标)
  133.                lcd12864_write_com( 0x80 ) ;
  134.             else
  135.                lcd12864_write_com( 0x88 ) ;
  136.             for( k = 0 ; k < 16 ; k++ )      //写一整行数据
  137.                 lcd12864_write_dat(0x00) ;
  138.         }
  139.     }
  140.     lcd12864_write_com( 0x30 ) ;//功能设置:恢复为基本指令集
  141.                                 //          关绘图显示
  142. }
  143. /*********************************************************
  144. *函数功能:初始化函数
  145. **********************************************************/
  146. void lcd12864_init()
  147. {
  148.   delay_nms(50);
  149.   //功能设定
  150.   lcd12864_write_com(0x30);   //设置为8位并行口,基本指令集
  151.   delay_nms(1);
  152.   lcd12864_write_com(0x30);   //再次设置为8位并行口,基本指令集
  153.   delay_nms(1);
  154.   lcd12864_write_com(0x0c);   //显示状态设置:整体显示ON 游标OFF
  155.   delay_nms(10);
  156.   lcd12864_write_com(0x01);   //清除显示,并且设定地址指针为00H
  157.   delay_nms(10);
  158.   lcd12864_write_com(0x06);   //设置为游标右移,DDRAM位地址加1,画面不移动
  159. }

  160. /*********************************************************
  161. *函数功能:在指定位置 显示一个字符
  162. **********************************************************/
  163. void lcd12864_write_char(uchar x,uchar y,uchar chr)
  164. {
  165.   lcd12864_set_cursor(x,y);
  166.   lcd12864_write_dat(chr);
  167. }
  168. /*********************************************************
  169. *函数功能:在指定位置 显示一个字符
  170. **********************************************************/
  171. void lcd12864_write_str(uchar x,uchar y,uchar *string)
  172. {
  173.     uchar *str;
  174.     uchar i=x;
  175.     uchar j=y;
  176.     str = string;
  177.     lcd12864_set_cursor(x,y);
  178.     while(*str!='\0')
  179.     {
  180.       lcd12864_write_dat(*str);
  181.       j++;
  182.       if(j>0x0f)
  183.       {
  184.         i++;
  185.         j=0;
  186.         if(i>4)
  187.           i=0;
  188.         lcd12864_set_cursor(i,j);
  189.       }   
  190.       str++;
  191.     }   
  192. }


  193. //********************************************************
  194. //画满屏图片
  195. //参数:dat为填充的数据
  196. //********************************************************
  197. void draw_full_picture (uchar *dat)
  198. {
  199.     uchar i;                 
  200.     uchar j;
  201.     uchar k;
  202.     uchar bGDRAMAddrX = 0x80;        //GDRAM水平地址
  203.     uchar bGDRAMAddrY = 0x80;        //GDRAM垂直地址
  204.     for(i = 0; i < 2; i++)                                                                                                            
  205.     {
  206.         for(j = 0; j < 32; j++)                                                                 
  207.         {
  208.             for(k = 0; k < 8; k++)                                                         
  209.             {
  210.                 lcd12864_write_com(0x34);                //设置为8位MPU接口,扩充指令集
  211.                 lcd12864_write_com(bGDRAMAddrY+j);        //垂直地址Y                                                                        
  212.                 lcd12864_write_com(bGDRAMAddrX+k);        //水平地址X
  213.                 lcd12864_write_dat(*dat++);
  214.                 lcd12864_write_dat(*dat++);
  215.             }
  216.         }
  217.         bGDRAMAddrX = 0x88;                    //写下半屏幕
  218.     }
  219.     lcd12864_write_com(0x36);                            //打开绘图模式
  220.     lcd12864_write_com(0x30);                            //恢复基本指令集,关闭绘图模式   
  221. }





  222. void main()
  223. {  
  224.    float temp;
  225.    delay_nms(200);        //延时200ms   
  226.    Init_BH1750();       //初始化BH1750
  227.     InitUART();            //初始化串口
  228.     lcd12864_init();
  229.   while(1)              //循环
  230.   {
  231.      P0=0X12;
  232.      P1=0X11;
  233.      P2=0X16;
  234.      P3=0X26;

  235.     getDHT11(); //获取温湿度值
  236.     dis_data=BUF[0];
  237.     dis_data=(dis_data<<8)+BUF[1];//合成数据
  238.    
  239.     temp=(float)dis_data/1.2;

  240.     conversion(temp);         //计算数据和显示
  241.     Usart_DHT11();
  242.     delay_nms(500);              //延时500ms
  243.   }
  244. }

  245. /*****************串口接收中断函数**********************/
  246. void UARTInterrupt(void) interrupt 4
  247. {   
  248.         if(RI)
  249.             {
  250.                 ES=0;
  251.                 RI = 0;
  252.                 Rxbuff[Rxnum++]=SBUF;
  253.                 if(Rxnum>=50)
  254.                 Rxnum=0;
  255.                 ES=1;
  256.             }
  257. }
复制代码




回复

使用道具 举报

ID:515099 发表于 2019-4-18 12:41 | 显示全部楼层
就是这个图,只亮不显示

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表