找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3349|回复: 8
收起左侧

为什么单片机LCD1602只亮不显示内容?

[复制链接]
ID:1026819 发表于 2022-5-15 20:42 来自手机 | 显示全部楼层 |阅读模式
20220515203730(1).png
  1. #include <reg51.h>
  2. #include"intrins.h"

  3. sbit lcd_rs=P2^0;
  4. sbit lcd_rw=P2^1;
  5. sbit lcd_e=P2^2;

  6. sbit led1=P1^0;
  7. sbit led2=P1^1;
  8. sbit led3=P1^2;

  9. sbit key1=P1^4;
  10. sbit key2=P1^5;
  11. sbit key3=P1^6;
  12. sbit key4=P1^7;

  13. sbit so=P2^3;
  14. sbit sclk=P2^4;
  15. sbit cs=P2^5;

  16. sbit motor=P3^0;
  17. sbit jiare=P3^1;
  18. sbit beep=P3^7;

  19. unsigned char tr[]="0123456789";
  20. unsigned char KeyValue=0,sz[4];

  21. void Delay10ms(unsigned char delaytime)               
  22. {
  23.     unsigned char i, j,k;

  24.     for(k=0; k<delaytime; k++)
  25.     {
  26.         i = 20;
  27.         j = 113;
  28.         do
  29.         {
  30.             while (--j);
  31.         }
  32.         while (--i);
  33.     }
  34. }

  35. void delay(unsigned int x)
  36. {
  37.   unsigned char i;
  38.         while(x--)
  39.         {
  40.                 for(i=0;i<120;i++);
  41. }
  42. }


  43. void lcd_write_cmd(unsigned char cmd) //写命令函数
  44. {
  45.         lcd_rs=0;
  46.         lcd_rw=0;
  47.         P0=cmd;
  48.         delay(5);
  49.         lcd_e=1;
  50.         delay(5);
  51.         lcd_e=0;
  52. }
  53. void lcd_write_date(unsigned char date) //写数据函数
  54. {
  55.         lcd_rs=1;
  56.         lcd_rw=0;
  57.         P0=date;
  58.         delay(5);
  59.         lcd_e=1;
  60.         delay(5);
  61.         lcd_e=0;
  62. }
  63. void lcd_init()        //LCD初始化函数
  64. {
  65.         lcd_write_cmd(0x38);
  66.         lcd_write_cmd(0x0c);
  67.         lcd_write_cmd(0x06);
  68.         lcd_write_cmd(0x01);
  69. }

  70. void Key_Scan()
  71. {
  72.     KeyValue = 0;
  73.     if(key1 == 0)                //增加按键按下
  74.     {
  75.         Delay10ms(1);
  76.         if(key1 == 0)
  77.         {
  78.             KeyValue = 1;
  79.             while(key1 == 0);                //等待按键释放
  80.         }
  81.     }
  82.     if(key2 == 0)                //减少按键按下
  83.     {
  84.         Delay10ms(1);
  85.         if(key2 == 0)
  86.         {
  87.             KeyValue = 2;
  88.             while(key2 == 0);                //等待按键释放
  89.         }
  90.     }
  91.                   if(key3 == 0)                //减少按键按下
  92.     {
  93.         Delay10ms(1);
  94.         if(key3 == 0)
  95.         {
  96.             KeyValue = 3;
  97.             while(key3 == 0);                //等待按键释放
  98.         }
  99.     }
  100.                   if(key4 == 0)                //减少按键按下
  101.     {
  102.         Delay10ms(1);
  103.         if(key4 == 0)
  104.         {
  105.             KeyValue = 4;
  106.             while(key4 == 0);                //等待按键释放
  107.         }
  108.     }
  109. }

  110. unsigned int max6675_read()        //读取温度值
  111. {
  112.         unsigned char i;
  113.         unsigned long max_6675=0;
  114.         cs=1;
  115.         _nop_();
  116.         _nop_();
  117.         cs=0;
  118.         for(i=0;i<16;i++)
  119.         {
  120.                 max_6675<<=1;
  121.                 _nop_();
  122.                 sclk=1;
  123.                 if(so==1){max_6675=max_6675|0x01;}
  124.                 else max_6675=max_6675|0x00;
  125.                 _nop_();
  126.                 sclk=0;
  127.         }
  128.          max_6675<<=1;        //去掉最高位
  129.          max_6675>>=4;        //去掉后3位保留14位温度数据
  130.          max_6675=(max_6675+1)*1024/4096-24;
  131.          if(max_6675<=0){max_6675=0;}
  132.          return max_6675+1;
  133. }

  134. void max6675_display(unsigned int num) //显示读取到的温度数值
  135. {
  136. //        unsigned char sz[4];
  137.         unsigned char i;
  138.         sz[0]=num/1000;
  139.         sz[1]=num%1000/100;
  140.         sz[2]=num%1000%100/10;
  141.         sz[3]=num%10;
  142.         lcd_write_cmd(0x80); //写命令函数
  143.         lcd_write_date('T');
  144.         lcd_write_date('e');
  145.         lcd_write_date('m');
  146.         lcd_write_date('p');
  147.         lcd_write_date(':');
  148.         for(i=1;i<4;i++)
  149.         {
  150.            lcd_write_date(0x30+sz[i]); //写数据函数
  151.         
  152.         }
  153.                 delay(100);
  154. }


  155. void main()
  156. {
  157.         unsigned char c=0;
  158.         unsigned int wendu,wenduh=300,wendul=100;
  159.         
  160.         lcd_init();
  161.         
  162.         max6675_read();
  163.         delay(100);//延时返回max6675状态
  164.         while(1)
  165.         {
  166.                 Key_Scan();
  167.                 if(KeyValue==1)
  168.                         wendul--;
  169.                 else if(KeyValue==2)
  170.                         wendul++;
  171.                 else if(KeyValue==3)
  172.                         wenduh--;
  173.                 else if(KeyValue==4)
  174.                         wenduh++;
  175.                 wendu=max6675_read();
  176.                 if(wendu>wenduh)
  177.                 {
  178.                         beep=0;
  179.                         motor=0;
  180.                         jiare=1;
  181.                 }else if(wendu<wendul)
  182.                 {
  183.                         beep=0;
  184.                         motor=1;
  185.                         jiare=0;
  186.                 }else {
  187.                         beep=1;
  188.                         motor=1;
  189.                         jiare=1;
  190.                 }
  191.                
  192.                 if(wendu>300)
  193.                 {
  194.                         led1=0;
  195.                         led2=1;
  196.                         led3=1;
  197.                 }else if(wendu<100)
  198.                 {
  199.                         led1=1;
  200.                         led2=0;
  201.                         led3=1;
  202.                 }else
  203.                 {
  204.                         led1=1;
  205.                         led2=1;
  206.                         led3=0;
  207.                 }
  208.                 lcd_write_cmd(0x80+0x40); //写命令函数
  209.                 lcd_write_date(wendul/100+0x30);
  210.                 lcd_write_date(wendul%100/10+0x30);
  211.                 lcd_write_date(wendul%10+0x30);
  212.                
  213.                 lcd_write_cmd(0x80+0x40+6); //写命令函数
  214.                 lcd_write_date(wenduh/100+0x30);
  215.                 lcd_write_date(wenduh%100/10+0x30);
  216.                 lcd_write_date(wenduh%10+0x30);
  217.                
  218.                 max6675_display(wendu);
  219.                
  220. }
  221.         
  222.         
  223. }
复制代码
回复

使用道具 举报

ID:390416 发表于 2022-5-15 21:38 | 显示全部楼层
LCD1602液晶最新资料 说明了具体的时间要求http://www.51hei.com/bbs/dpj-205768-1.html
回复

使用道具 举报

ID:74146 发表于 2022-5-15 22:24 | 显示全部楼层
一个最简单又最高效的办法:打开proteus的模板工程,里面搜索LCD1602,选择51单片机的工程。尝试运行观察效果。然后再与你自己连接的模型做对比。
回复

使用道具 举报

ID:1026496 发表于 2022-5-15 23:02 | 显示全部楼层
EA 硬件上没有拉高,建议拉高试试
回复

使用道具 举报

ID:771738 发表于 2022-5-16 07:24 | 显示全部楼层
调RV1(对比度)试试!
回复

使用道具 举报

ID:161164 发表于 2022-5-16 10:01 | 显示全部楼层
代码测试正常
2022-05-16_095945.png


回复

使用道具 举报

ID:1012735 发表于 2022-5-16 14:53 | 显示全部楼层
在 lcd_write_cmd(),write_date() 两函数中最前面行加一句:lcd_e=0 试试
   
回复

使用道具 举报

ID:16255 发表于 2022-5-17 09:52 | 显示全部楼层

你这个VEE的接法不对。在Proteus中没影响,但实际电路中肯定不行。
回复

使用道具 举报

ID:161164 发表于 2022-5-17 10:48 来自手机 | 显示全部楼层
mengsiu 发表于 2022-5-17 09:52
你这个VEE的接法不对。在Proteus中没影响,但实际电路中肯定不行。

我只是复制楼主的仿真图来确认是代码问题还是仿真有问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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