找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD1602只显示一排黑块,请各位帮我看看什么问题,谢谢

[复制链接]
跳转到指定楼层
楼主
仿真图可以实现,但是我焊出来后就是不行,线也是接对的,麻烦大佬帮我看看
单片机源程序如下:
  1. #include<reg52.h>
  2. #include"stdio.h"

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. typedef unsigned char uint8;
  6. typedef unsigned int uint16;

  7. sbit beep = P1^7;  //定义蜂鸣器IO口

  8. sbit LED1 = P1^0;  //定义灯IO口
  9. sbit LED2 = P1^1;
  10. sbit k1 = P1^2;  //定义灯开关IO口
  11. sbit k2 = P1^3;

  12. sbit MOTOR = P1^4;  //定义电机
  13. sbit BUTTON_RUN = P1^5;  //定义电机启动按钮
  14. sbit BUTTON_STOP = P1^6;  //定义电机关闭按钮

  15. sbit RS = P2^7;
  16. sbit RW = P2^6;
  17. sbit EN = P2^5;
  18. sbit K1 = P2^0;
  19. sbit K2 = P2^1;  //加
  20. sbit K3 = P2^2;  //减
  21. sbit DQ = P2^3;  //DS18B20数据端

  22. //void delay(uint xms);
  23. void motor_run();
  24. void motor_stop();

  25. void LED1_SWITCH();
  26. void LED2_SWITCH();

  27. void init();

  28. void delay(uint16 time);
  29. void lcd_init();  //LCD1602初始化
  30. void lcd_order(uint8 date);  //向LCD1602写一个指令
  31. void lcd_data(uint8 date);  //向LCD1602写一个指令
  32. void write_1602(uint8 add,uint8 daa);  //写数据

  33. void display();  //显示温度

  34. uint8 DS18B20_init();  //DS18B20初始化
  35. void DS18B20_write(uint8 date);  //向DS18B20中写入一个数据
  36. uint8 DS18B20_read();  //从DS18B20中读一个数据并返回
  37. void DS18B20_check();  //启动DS18B20进行温度采集,并返回当前温度

  38. void KEY();  //修改报警范围

  39. long tmp = 0;  //存储温度值
  40. long t_h = 37,t_l = 10;  //温度上限 温度下限

  41. bit tmp_hb = 0;  tmp_lb = 0;  //温度上下限调节指示变量

  42. void judge();  //判断报警

  43. uint8 hodometer[] = "  H:00   L:00  ";
  44. uint8 temp[]=           "  wendu:00.00   ";
  45. uint16 ji = 0;
  46. uint8 ku = 0;  //标志位

  47. void main()
  48. {
  49.         init();
  50.         lcd_init();  //LCD1602初始化
  51.         DS18B20_init();  //DS18B20初始化
  52.         DS18B20_write(0xcc);  //跳过序列号
  53.         DS18B20_write(0x44);  //启动温度转换
  54.         write_1602(4,t_h);
  55.         write_1602(12,t_l);
  56.         while(1)
  57.         {               
  58.                 LED1_SWITCH();
  59.                 LED2_SWITCH();
  60.                 motor_run();
  61.                 motor_stop();
  62.                 DS18B20_check();  //从DS18B20中读取温度
  63.                 display();
  64.                 KEY();
  65.                 judge();
  66.         }
  67. }

  68. void write_1602(uint8 add,uint8 daa)
  69. {
  70.         lcd_order(0x80+add);
  71.         lcd_data(0x30+daa/10);
  72.         lcd_data(0x30+daa%10);
  73. }

  74. void judge()  //判断是否在报警范围
  75. {
  76.         if(tmp<(t_l*1000)||tmp>(t_h*1000)&&t_l>=0)
  77.         {
  78.                 beep = 0;
  79.                 delay(10);
  80.         }
  81.         else if(t_l<0&&tmp>(t_h*1000))
  82.                 beep = 1;
  83.         else
  84.                 beep = 1;
  85. }

  86. void KEY()
  87. {
  88.         uint8 jj;
  89.         uint8 i = 0;
  90.         beep = 1;
  91.         if(K1==0)
  92.         {
  93.                 while(!K1);
  94.                 while(1)
  95.                 {
  96.                         lcd_order(0x0f);  //开启光标显示
  97.                         lcd_order(0x80+5);  //光标显示位置
  98.                         if(K2==0)  //判断加按键按下
  99.                         {
  100.                                 while(K2==0);  //等待按键释放
  101.                                         t_h++;  //温度上限加1
  102.                                         write_1602(4,t_h);  //显示温度上限
  103.                         }
  104.                         if(K3==0)  //判断减按键按下
  105.                         {
  106.                                 while(K3==0);  //等待按键释放
  107.                                 if(t_h>t_l)  //判断温度上限大于温度下限
  108.                                         t_h--;
  109.                                 write_1602(4,t_h);  //显示温度上限
  110.                         }
  111.                         if(K1==0)
  112.                         {
  113.                                 while(K1==0);
  114.                                 while(1)
  115.                                 {
  116.                                         lcd_order(0x0f);
  117.                                         lcd_order(0x80+13);
  118.                                         if(K2==0)
  119.                                         {
  120.                                                 while(K2==0);
  121.                                                 if(t_l<t_h&&t_l>=0)
  122.                                                 {
  123.                                                         lcd_order(0x80+11);
  124.                                                         lcd_data(' ');
  125.                                                         t_l++;
  126.                                                         write_1602(12,t_l);
  127.                                                 }
  128.                                                 else
  129.                                                 {
  130.                                                         t_l++;
  131.                                                         jj =~ t_l;
  132.                                                         write_1602(12,jj);
  133.                                                 }
  134.                                         }
  135.                                         if(K3==0)
  136.                                         {
  137.                                                 while(K3==0);
  138.                                                 if(t_l>(-50))
  139.                                                 {
  140.                                                         t_l--;
  141.                                                         if(t_l<0)
  142.                                                                 jj =~ t_l;
  143.                                                 }
  144.                                                 if(t_l>=0)
  145.                                                 {
  146.                                                         lcd_order(0x80+11);
  147.                                                         lcd_data(' ');
  148.                                                         write_1602(12,t_l);
  149.                                                 }
  150.                                                 if(t_l<0)
  151.                                                 {
  152.                                                         write_1602(12,jj);
  153.                                                         lcd_order(0x80+11);
  154.                                                         lcd_data('-');
  155.                                                 }
  156.                                         }
  157.                                         if(K1==0)
  158.                                         {
  159.                                                 while(K1==0);
  160.                                                 goto loop;
  161.                                         }
  162.                                 }
  163.                         }
  164.                 }
  165.         }
  166.         loop:beep = 1;
  167. }

  168. //void delay(uint xms)  //延时
  169. //{
  170. //        uint i,j;
  171. //        for(i=xms;i>0;i--)
  172. //                for(j=110;j>0;j--) ;
  173. //}

  174. void delay(uint16 time)
  175. {
  176.         while(time--);
  177. }

  178. void lcd_init()
  179. {
  180.         uint8 i;
  181.         RW = 0;
  182.         lcd_order(0x38);  //设置显示光标功能
  183.         delay(100);
  184.         lcd_order(0x0e);  //显示开及光标设置
  185.         delay(100);
  186.         lcd_order(0x06);  //显示光标移动设置
  187.         delay(100);
  188.         lcd_order(0x01);  //显示清屏
  189.         delay(100);
  190.         lcd_order(0x80);
  191.         for(i=0;i<16;i++)
  192.                 lcd_data(hodometer[i]);
  193. }

  194. void lcd_order(uint8 date)  //LCD1602写指令
  195. {
  196.         RS = 0;  //选择写指令
  197.         EN = 0;  //使能初始化
  198.         P0 = date;  //发送指令
  199.         EN = 1;  //开使能
  200.         delay(100);  //延时
  201.         EN = 0;  //关使能
  202. }

  203. void lcd_data(uint8 date)  //LCD1602写指令
  204. {
  205.         RS = 1;  //选择写数据
  206.         EN = 0;  //使能初始化
  207.         P0 = date;  //发送指令
  208.         EN = 1;  //开使能
  209.         delay(100);  //延时
  210.         EN = 0;  //关使能
  211. }

  212. uint8 DS18B20_init()
  213. {
  214.         uint8 ans;
  215.         DQ = 1;
  216.         delay(1);
  217.         DQ = 0;
  218.         delay(100);
  219.         DQ = 1;
  220.         delay(6);
  221.         ans = DQ;
  222.         delay(100);
  223.         if(!ans)
  224.                 return 1;
  225.         else
  226.                 return 0;
  227. }

  228. void DS18B20_write(uint8 date)
  229. {
  230.         uint8 i;
  231.         DQ = 1;
  232.         delay(1);
  233.         for(i=0;i<8;i++)  //根据时序将数据从低到高一位一位发送出来
  234.         {
  235.                 DQ = 0;
  236.                 if(date&0x01)  //从低到高取出数据的每位
  237.                         DQ = 1;
  238.                 else
  239.                         DQ = 0;
  240.                 delay(10);
  241.                 DQ = 1;
  242.                 date >>= 1;
  243.                 delay(1);
  244.         }
  245. }

  246. uint8 DS18B20_read()
  247. {
  248.         uint8 i,date = 0;
  249.         DQ = 1;  //释放总线
  250.         delay(1);
  251.         for(i=0;i<8;i++)  //根据时序将数据从低到高一位一位接收
  252.         {
  253.                 DQ = 0;
  254.                 date >>= 1;
  255.                 DQ = 1;
  256.                 if(DQ)
  257.                         date |= 0x80;  //将data的一位置1
  258.                 delay(8);
  259.                 DQ = 1;
  260.                 delay(1);
  261.         }
  262.         return date;  //返回读出的数
  263. }

  264. void DS18B20_check()
  265. {
  266.         uint8 date1,date2;
  267.         float ta;
  268.         if(DS18B20_init())
  269.         {
  270.                 DS18B20_write(0xcc);  //跳过序列号
  271.                 DS18B20_write(0x44);  //启动温度转换
  272.                 DS18B20_init();  //复位
  273.                 DS18B20_write(0xcc);  //跳过序列号
  274.                 DS18B20_write(0xbe);  //启动读取温度
  275.                 date1 = DS18B20_read();  //读取两个温度字节
  276.                 date2 = DS18B20_read();
  277.                 tmp = date2;
  278.                 tmp <<= 8;
  279.                 tmp = tmp|date1;
  280.                 ta = tmp*0.0625;
  281.                 tmp = ta*1000;
  282.         }
  283. }

  284. void display()
  285. {
  286.         uint8 i;
  287.         temp[8] = 0x30+tmp/10000;
  288.         temp[9] = 0x30+tmp/1000%10;
  289.         temp[11] = 0x30+tmp/100%10;
  290.         temp[12] = 0x30+tmp/10%10;
  291.         temp[13] = 0x30+tmp%10;
  292.         lcd_order(0x80+0x40);
  293.         for(i=0;i<16;i++)
  294.                 lcd_data(temp[i]) ;
  295. }

  296. void init()  //初始化函数
  297. {
  298.         BUTTON_RUN = 1;  
  299.         BUTTON_STOP = 1;
  300.         MOTOR = 0;
  301.         beep = 0;
  302.         delay(50);
  303. }

  304. void motor_run()  //打开电机
  305. {
  306.         if(BUTTON_RUN==0)
  307.         {
  308.                 delay(10);
  309.                 if(BUTTON_RUN==0)
  310.                         MOTOR = 1;
  311.         }
  312. }

  313. void motor_stop()  //关闭电机
  314. {
  315.         if(BUTTON_STOP==0)
  316.         {
  317.                 delay(10);
  318.                 if(BUTTON_STOP==0)
  319.                         MOTOR = 0;
  320.         }
  321. }
  322. void LED1_SWITCH()  //LED1开关
  323. {
  324.         if(k1==0)
  325.                 LED1 = 0;
  326.         if(k1==1)
  327.                 LED1 = 1;
  328. }

  329. void LED2_SWITCH()  //LED2开关
  330. {
  331.         if(k2==0)
  332.                 LED2 = 0;
  333.         if(k2==1)
  334.                 LED2 = 1;
  335. }
复制代码

51hei图片20210624132413.png (203.91 KB, 下载次数: 61)

51hei图片20210624132413.png

51hei图片20210607190624.png (145.66 KB, 下载次数: 33)

51hei图片20210607190624.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:824490 发表于 2021-6-24 14:48 | 只看该作者
P0口不上拉?
回复

使用道具 举报

板凳
ID:739545 发表于 2021-6-24 15:28 | 只看该作者
仿真和实际有很大差异,最好按照datasheet或者guideline进行电路进行实物焊接画图
回复

使用道具 举报

地板
ID:918467 发表于 2021-6-24 15:51 | 只看该作者
lovezjf234 发表于 2021-6-24 15:28
仿真和实际有很大差异,最好按照datasheet或者guideline进行电路进行实物焊接画图

我看见别人的程序可以,然后我发现自己是写指令和写数据那里写错了找了好久问题
回复

使用道具 举报

5#
ID:918467 发表于 2021-6-24 16:31 | 只看该作者

我加了电阻了,没截图到。后来发现是代码问题,写指令和写数据那里错了
回复

使用道具 举报

6#
ID:328014 发表于 2021-6-25 01:34 | 只看该作者
来看一下51hei论坛里面解决此问题的痛苦经历吧:
51hei搜索框输入"1602 方块"或者"1602 黑块"或者"1602 白块"或者"1602 格":

这个是io口设置问题,最终搞定了:http://www.51hei.com/bbs/dpj-199732-1.html
http://www.51hei.com/bbs/dpj-168643-1.html
http://www.51hei.com/bbs/dpj-208189-1.html

既有可能是软件问题也有硬件问题
http://www.51hei.com/bbs/dpj-187378-1.html
http://www.51hei.com/bbs/dpj-160754-1.html
回复

使用道具 举报

7#
ID:918467 发表于 2021-6-25 21:26 | 只看该作者
51hei团团 发表于 2021-6-25 01:34
来看一下51hei论坛里面解决此问题的痛苦经历吧:
51hei搜索框输入"1602 方块"或者"1602 黑块"或者"1602 白 ...

谢谢大佬
回复

使用道具 举报

8#
ID:517951 发表于 2021-6-26 10:14 | 只看该作者
出现一排黑块的原因大多是上电未正确初始化,要查下E,WR,D0-D7单片机脚位与1602连通,连错了没有, 初始化代码比较简单,也需要核对一下是4bit还是8bit的设定
回复

使用道具 举报

9#
ID:852641 发表于 2021-6-26 14:03 | 只看该作者
可以先调下背光到能显示出东西,用例程确定LCD焊接使用正常,再排除代码的原因。之前做过也是LCD不显示不亮,最后是时序的问题,延时过多会有这种问题
回复

使用道具 举报

10#
ID:390416 发表于 2021-7-6 20:34 | 只看该作者
LCD1602显示℃ 这种自定义符号 http://www.51hei.com/bbs/dpj-200685-1.html
LCD1602液晶最新资料 说明了具体的时间要求 http://www.51hei.com/bbs/dpj-205768-1.html
回复

使用道具 举报

11#
ID:964308 发表于 2021-10-17 20:57 来自手机 | 只看该作者
V0口的偏压调了吗,我用的是对地2kΩ
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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