找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1677|回复: 1
打印 上一主题 下一主题
收起左侧

单片机代码是不是有问题?1602第一排显示白色方块,怎么解决。希望各位帮忙。

[复制链接]
跳转到指定楼层
楼主
1602液晶屏的第一排显示白色方块如图:


单片机源程序:
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #include <intrins.h>

  5. typedef bit BOOL  ;

  6. sbit io = P1^1 ;//(口线定义)
  7. sbit bee=P1^0;
  8. sbit rs = P2^6;
  9. sbit rw = P2^5 ;
  10. sbit ep = P2^7 ;
  11. bit flag_300ms ;

  12. sbit K1=P1^2;
  13. sbit K2=P1^3;
  14. sbit K3=P1^4;

  15. uchar yemian=0;//(定义变量)
  16. uchar flat=1;
  17. uchar data_byte;
  18. uchar RH,RL,TH,TL;
  19. uchar WenDu,ShiDu;//报警的温度和湿度
  20. #include "eeprom52.h"


  21. /****************************延时程序****************************/
  22. void delay(uchar ms)
  23. {       // 延时子程序
  24.          uchar i ;
  25.          while(ms--)
  26.          {
  27.                   for(i = 0 ; i<250;i++) ;
  28.          }
  29. }

  30. void delay1()//延时10us
  31. {
  32.         uchar i;
  33.         i--;
  34.         i--;
  35.         i--;
  36.         i--;
  37.         i--;
  38.         i--;
  39. }

  40. void longdelay(uchar s) //长延时
  41. {
  42.          while(s--)
  43.          {
  44.                   delay(20) ;
  45.          }
  46. }



  47. /******************把数据保存到单片机内部eeprom中******************/
  48. void write_eeprom()
  49. {
  50.         SectorErase(0x2000);
  51.          byte_write(0x2000, WenDu);
  52.         byte_write(0x2001, ShiDu);
  53.         byte_write(0x2060, a_a);        
  54. }

  55. /******************把数据从单片机内部eeprom中读出来*****************/
  56. void read_eeprom()
  57. {
  58.         WenDu   = byte_read(0x2000);
  59.   ShiDu = byte_read(0x2001);
  60.         a_a      = byte_read(0x2060);
  61. }

  62. /**************开机自检eeprom初始化*****************/
  63. void init_eeprom()
  64. {
  65.         read_eeprom();                //先读
  66.         if(a_a != 2)                //新的单片机初始单片机内问eeprom
  67.         {
  68.         WenDu   = 30;
  69.         ShiDu   = 80;
  70.                 a_a = 2;
  71.                 write_eeprom();
  72.         }        
  73. }



  74. /********************报警程序部分*******************/
  75. void warn()  //报警函数
  76. {
  77.         
  78.   if(TH>=WenDu)  //检测的温度高于设定温度报警值
  79.                                              
  80.      {
  81.       bee=0; //报警
  82.                         
  83.      }      
  84.                  
  85.         if(RH>=ShiDu)  //检测的湿度高于设定的湿度值
  86.                                              
  87.      {
  88.       bee=0; //报警
  89.      }      

  90.                  
  91.         if( TH<WenDu  &&  RH<ShiDu )         
  92.     {
  93.                   bee=1; //停止报警
  94.                 }
  95.                  

  96. }

  97. /************************LCD模块******************************************/

  98. BOOL lcd_bz()//测试LCD忙碌状态
  99. {      
  100.          BOOL result ;
  101.          rs = 0 ;
  102.          rw = 1 ;
  103.          ep = 1 ;
  104.          result = (BOOL)(P0 & 0x80) ;
  105.          ep = 0 ;
  106.          return result ;
  107. }

  108. void write_cmd(uchar cmd)// 写指令
  109. {      
  110.          while(lcd_bz()) ;
  111.         rs = 0 ;
  112.         rw = 0 ;
  113.         ep = 0 ;
  114.         P0 = cmd ;
  115.         ep = 1 ;
  116.         ep = 0 ;  
  117. }

  118. void write_addr(uchar addr)//写地址
  119. {      
  120.          write_cmd(addr|0x80) ;
  121. }

  122. void write_byte(uchar dat)//写字节
  123. {      
  124.          while(lcd_bz()) ;
  125.           rs = 1 ;
  126.           rw = 0 ;
  127.           ep = 0 ;
  128.           P0 = dat ;
  129.           ep = 1 ;
  130.           ep = 0 ;
  131. }

  132. void lcd_init()// 初始化
  133. {      
  134.          write_cmd(0x38) ;
  135.          delay(1);
  136.          write_cmd(0x08) ;  
  137.          delay(1);
  138.          write_cmd(0x01) ;
  139.          delay(1);
  140.          write_cmd(0x06) ;
  141.          delay(1);
  142.          write_cmd(0x0c) ;
  143.          delay(1);
  144. }

  145. void display(uchar addr, uchar q)//在某一地址上显示一字节
  146. {         
  147.          delay(1) ;
  148.          write_addr(addr) ;
  149.    write_byte(q) ;
  150.          delay(1) ;
  151.          
  152. }

  153. /*********************** DHT11测试模块***************************************/

  154. void start()//开始信号
  155. {
  156.         io=1;
  157.         delay1();
  158.         io=0;
  159.         delay(20);//>18ms
  160.         io=1;
  161.         delay1();//20-40us
  162.         delay1();
  163.         delay1();
  164.         delay1();
  165.         delay1();
  166. }
  167. uchar receive_byte()//接收一个字节
  168. {
  169.         uchar i,temp,count;
  170.         for(i=0;i<8;i++)
  171.         {
  172.         temp=0;
  173.                 delay1();delay1();delay1();delay1();
  174.                 if(io==1)temp=1;
  175.                 count=2;
  176.                 while((io)&&count++);
  177.                 if(count==1)break;
  178.                 data_byte<<=1;        
  179.                 data_byte|=temp;
  180.         }
  181.         return data_byte;
  182. }
  183. void receive()//接收数据
  184. {
  185.         uchar T_H,T_L,R_H,R_L,check,num_check;
  186.         uchar count;
  187.         start();//开始信号
  188.         io=1;
  189.         if(!io)//读取DHT11响应信号
  190.         {
  191.         
  192.         while((io)&&count++);
  193.         R_H=receive_byte();
  194.         R_L=receive_byte();
  195.         T_H=receive_byte();
  196.         T_L=receive_byte();
  197.         check=receive_byte();
  198.         io=0;//拉低延时50us
  199.         delay1();delay1();delay1();delay1();delay1();
  200.         io=1;
  201.         num_check=R_H+R_L+T_H+T_L;
  202.         if(num_check=check)
  203.         {
  204.                 RH=R_H;
  205.                 RL=R_L;
  206.                 TH=T_H;
  207.                 TL=T_L;
  208.                 check=num_check;
  209.         }
  210.         }
  211. }


  212. void showw()   // 问候语函数
  213. {      
  214.            lcd_init(); //初始化
  215.             delay(10);
  216.         
  217.      display(0x05,'W');
  218.      display(0x06,'e');
  219.                  display(0x07,'l');
  220.                  display(0x08,'c');
  221.                  display(0x09,'o');
  222.                  display(0x0a,'m');
  223.      display(0x0b,'e');
  224.            delay(250); //短暂延时
  225.            delay(250);
  226.            delay(250);
  227.            

  228. /*********************************/
  229. /*
  230.            display(0x40,' ') ;
  231.                  display(0x41,'h');
  232.                  display(0x42,'e');
  233.                
  234. */
  235. }


  236. /*************定时器0初始化程序***************/
  237. void time_init()         
  238. {
  239.         EA   = 1;                   //开总中断
  240.         TMOD = 0X01;          //定时器0、定时器1工作方式1
  241.         ET0  = 1;                  //开定时器0中断
  242.         TR0  = 1;                  //允许定时器0定时
  243. }



  244. void key() //按键程序 选择菜单模式
  245. {

  246.           if(!K1)
  247.                    {  
  248.                           delay(20);
  249.                             if(!K1)
  250.                          {   
  251.                                                          while(!K1)
  252.                                            ;
  253.                                                           yemian++;
  254.                                                           flat++;
  255.                                                                 if(yemian>=3) { yemian=0; }
  256.                                                                
  257.              }
  258.                    }

  259.         
  260.         
  261. }


  262. void  shezhi()  //对里面的数值进行修改
  263. {
  264.     if(!K2)
  265.                    {  
  266.                           delay(50);
  267.                             if(!K2)
  268.                          {   
  269.                                                          ;
  270.                                                          
  271.                                                          if(yemian==1)
  272.                                                          {
  273.                                                           WenDu+=1;
  274.                                                                 if(WenDu>99) { WenDu=99; }  //湿度上限加
  275.                                                          }
  276.                                                          
  277.                                                          if(yemian==2)
  278.                                                          {
  279.                                                           ShiDu+=1;
  280.                                                                 if(ShiDu>99) { ShiDu=99; }  //湿度下限加
  281.                                                          }
  282.                                                          
  283.                                                                 write_eeprom();       //保存数据               
  284.              }
  285.                    }
  286.                         
  287.                           if(!K3)
  288.                    {  
  289.                             delay(50);
  290.                              if(!K3)
  291.                          {   
  292.                                                         
  293.                                            ;
  294.                                                            if(yemian==1)
  295.                                                              {
  296.                                                               WenDu-=1;          //湿度下限减
  297.                                                                     if(WenDu<1) {WenDu=1; }
  298.                                                              }
  299.                                                          
  300.                                                            if(yemian==2)
  301.                                                              {
  302.                                                               ShiDu-=1;         //湿度下限减
  303.                                                                     if(ShiDu<1) { ShiDu=1; }
  304.                                                              }
  305.                                                                 write_eeprom();       //保存数据               
  306.              }
  307.                    }

  308. }



  309. /***************************主程序*********************************/
  310. void main()
  311. {
  312.          init_eeprom();                              //读eeprom数据
  313.    time_init();                                //初始化定时器
  314.    showw();    //显示问候语 和名字

  315.         while(1)
  316.         {   
  317.                
  318.                    key();
  319.                 //====================yemian==0时 进入工作状态=================================
  320.                          if(yemian==0)  
  321.                         {
  322.                                 if(flat==1)
  323.                                  {
  324.            flat=0;
  325.                                          lcd_init(); //初始化
  326.                                                   
  327.                                          display(0x00,'T') ;    //Temp
  328.                        display(0x01,'e');
  329.                        display(0x02,'m');
  330.                                          display(0x03,'p');
  331.            display(0x04,':');
  332.                                          
  333.                                          display(0x08,0xdf); // 度
  334.                        display(0x09,'C');
  335.                                          
  336.                                          
  337.                                          display(0x40,'H') ;    //Humi
  338.                        display(0x41,'u');
  339.                        display(0x42,'m');
  340.                                          display(0x43,'i');
  341.            display(0x44,':');
  342.                                          
  343.                                          display(0x47,'%');
  344.                                          display(0x48,'R');
  345.                                          display(0x49,'H');
  346.                                          
  347.                                          display(0x0c,'T');
  348.            display(0x0d,':');
  349.            display(0x0e,WenDu/10+0x30);  //报警温度
  350.                        display(0x0f,WenDu%10+0x30);
  351.                                    
  352.                                          display(0x4c,'H');
  353.            display(0x4d,':');
  354.                                    display(0x4e,ShiDu/10+0x30);  //报警湿度
  355.                        display(0x4f,ShiDu%10+0x30);

  356.           }
  357.                         
  358.                          if(flag_300ms == 1)
  359.                      {               
  360.                              flag_300ms = 0;
  361.            receive();
  362.                                          
  363.                                          display(0x05,TH/10+0x30);  //温度显示
  364.                        display(0x06,TH%10+0x30);
  365.                                          
  366.            display(0x45,RH/10+0x30);  //湿度显示
  367.                        display(0x46,RH%10+0x30);
  368.                                          
  369.                                        
  370.            warn();
  371.                      }
  372.                         
  373.         }               
  374.                         
  375.         //====================yemian==1 温度设置===========================
  376.                                 if(yemian==1)  //温度
  377.                             {
  378.                          if(flat==1)
  379.                                      {
  380.                flat=0;  
  381.                                                           bee=1;
  382.                lcd_init(); //初始化
  383.                                                          display(0x06,'T');
  384.                                                          display(0x07,'e');
  385.                                                          display(0x08,'m');
  386.                                                          display(0x09,'p');
  387.              }
  388.                                                 
  389.                                                 shezhi();
  390.                                                 display(0x47,WenDu/10+0x30);  //温度
  391.                         display(0x48,WenDu%10+0x30);
  392.                       }
  393.                         
  394.                 //====================yemian==1湿度设置==========================        
  395.                                 if(yemian==2)   //湿度设置
  396.                             {
  397.                          if(flat==1)
  398.                                      {
  399.                flat=0;  
  400.                                                           bee=1;
  401.                lcd_init(); //初始化
  402.                                                          display(0x06,'H');
  403.                                                          display(0x07,'u');
  404.                                                          display(0x08,'m');
  405.                                                          display(0x09,'i');
  406.                                                  }
  407.                                                  shezhi();
  408.                                                  display(0x47,ShiDu/10+0x30);  //湿度
  409.                          display(0x48,ShiDu%10+0x30);
  410.                       }
  411.         }
  412. }



  413. /*************定时器0中断服务程序***************/
  414. void time0_int() interrupt 1
  415. {        
  416.         static uchar value;
  417.         TH0 = 0x3c;
  418.         TL0 = 0xb0;     // 50ms
  419.          
  420.         if(value % 6 == 0)
  421.         {
  422.                 flag_300ms = 1;           //300ms
  423.                 value = 0;
  424.         }

  425. }


复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-9-4 21:47 | 只看该作者
这是51黑论坛里面别人相似问题的解决过程:http://www.51hei.com/bbs/dpj-39388-1.html
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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