找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 25702|回复: 7
收起左侧

proteus仿真LCD1602只亮不显示 附单片机程序 麻烦各位看看是什么问题?

[复制链接]
ID:341859 发表于 2018-10-25 22:35 | 显示全部楼层 |阅读模式
仿真过后,出现这样的情况,是不是判忙函数出了问题,导致一直处于在忙状态。
附件为 仿真电路图

还是不行.png

下载:
已改好的仿真图10.25-22.27.rar (21.31 KB, 下载次数: 271)

单片机源程序:
  1. #include "1602.h"
  2. #include "delay.h"

  3. xdata LCD_Type     LCD;   //LCD设备

  4. static void LCD_CheckBusy(void)   //检测LCD状态,看它是不是还在忙呢
  5. {
  6. do
  7.   {
  8.     LCD_EN=0;
  9.     LCD_RS=0;
  10.     LCD_RW=1;
  11.     LCDIO=0xff;
  12.     LCD_EN=1;
  13.   }
  14.   while(LCD_BUSY==1);
  15.   LCD_EN=LOW;
  16. }

  17. static void LCD_SendCommand(unsigned char command)
  18. {
  19.   LCD_CheckBusy();
  20.   LCD_RS=LOW;
  21.   LCD_RW=LOW;
  22.   LCD_EN=HIGH;
  23.   LCDIO=command;
  24.   LCD_EN=LOW;
  25. }

  26. static void LCD_SendData(unsigned char dat)
  27. {
  28. LCD_CheckBusy();
  29. LCD_RS=HIGH;
  30. LCD_RW=LOW;
  31. LCD_EN=HIGH;
  32. LCDIO=dat;
  33. LCD_EN=LOW;
  34. }


  35. /*---------------------光标设置函数-------------------------*/
  36. static void LCD_Pos(unsigned char pos)        //写入的是实际的地址
  37. {
  38.   if(pos>31)  //光标地址0-31 共32个
  39.     return;

  40. /*----------------------------------------------------------*/  
  41.   if(pos<16)                                         //第一行
  42.   {  
  43.      LCD_SendCommand(0x80+pos);  
  44.   }
  45.   else                                                         //第二行
  46.   {
  47.      LCD_SendCommand(0xC0+pos-16);
  48.   }            
  49. }

  50. //add 0-31对应两行
  51. //void LCD_DisPlayChar(unsigned char add,unsigned char ch)
  52. //{
  53. //LCD.RefFlag = 0;
  54. //LCD.Buf[add]=ch;
  55. //LCD.RefFlag = 1;
  56. //}

  57. void LCD_DisplayString(unsigned char add,unsigned char *str)
  58. {
  59.   unsigned char i;
  60.   LCD.RefFlag = 0;
  61.   i = 0;
  62.   while(*str)
  63.   {
  64.     LCD.Buf[add+i]=*str;
  65.         str++;
  66.         i++;
  67.   }
  68.   LCD.RefFlag = 1;
  69. }

  70. void LCD_ScreenClear(void)
  71. {
  72.   unsigned char i = 0;
  73.   LCD.RefFlag = 0;
  74.   for(i=0;i<32;i++)
  75.   {
  76.     LCD.Buf[i]=' ';   
  77.   }
  78.   LCD.RefFlag = 1;
  79. }

  80. void LCD_Init(void)
  81. {
  82.   LCD_SendCommand(0x38);
  83.   LCD_SendCommand(0x38);
  84.   LCD_SendCommand(0x38);
  85.   LCD_SendCommand(0x06);
  86.   LCD_SendCommand(0x0c);
  87.   LCD_SendCommand(0x01);
  88.   LCD.BlinkEN = 0;
  89.   LCD.BlinkAdd = 0;
  90.   LCD.BlinkLen = 1;
  91.   LCD.BlinkCon = 0;
  92.   LCD_ScreenClear();
  93. }



  94. void LCD_Refresh(void)
  95. {
  96.   unsigned char i=0;
  97. /*------------------闪烁设置---------------------------*/
  98.   if(LCD.BlinkEN)          //如果闪烁开关打开
  99.   {
  100.     LCD.BlinkCon++;
  101.         if(LCD.BlinkCon==1)         
  102.         {
  103.           LCD_Pos(LCD.BlinkAdd);       //设置地址
  104.           for(i=0;i<LCD.BlinkLen;i++)  
  105.           {
  106.             if(LCD.BlinkAdd+i==16)
  107.                   LCD_Pos(16);
  108.                 LCD_SendData(0x20);       //隐藏显示
  109.           }  
  110.         }
  111.         else if(LCD.BlinkCon==10)        //开启显示
  112.         {
  113.           LCD_Pos(LCD.BlinkAdd);
  114.           for(i=0;i<LCD.BlinkLen;i++)  
  115.           {
  116.             if(LCD.BlinkAdd+i==16)
  117.                   LCD_Pos(16);
  118.                 LCD_SendData(LCD.Buf[LCD.BlinkAdd+i]);  //显示缓存直接写入
  119.           }   
  120.         }
  121.         else if(LCD.BlinkCon>=20)
  122.         {
  123.           LCD.BlinkCon = 0;
  124.           LCD.RefFlag = 1;
  125.         }
  126.   }
  127. /*-----------------LCD刷新显示----------------------------*/
  128.   if(LCD.RefFlag ==1)  //有待刷新
  129.   {
  130.     LCD_Pos(0);
  131.         for(i=0;i<32;i++)          //从闪烁开始的地址就不要写数据了
  132.          {                                          
  133. /*-------------------换行------------------------------*/         
  134.           if(i==16)
  135.             LCD_Pos(16);
  136. /*-------------------闪烁功能打开并且到了开始闪烁的地址----------------------------------*/
  137.           if((LCD.BlinkEN)&&(i==LCD.BlinkAdd))         //跳过LCD.BlinkLen个显示地址
  138.           {
  139.             do
  140.                 {
  141.                   i++;
  142.                 }
  143.                 while(i<(LCD.BlinkAdd+LCD.BlinkLen));             // 0  1
  144.             LCD_Pos(LCD.BlinkAdd+LCD.BlinkLen+1);
  145.           }
  146.           else                 //正常模式写入
  147.           {
  148.             LCD_SendData(LCD.Buf[i]);
  149.           }
  150.         }
  151.         LCD.RefFlag =0;  
  152.   }
  153. }


  154. //显示地址Add:0-31   *time //时分秒
  155. void LCD_DisplayTime(unsigned char add,unsigned char *time)
  156. {
  157.   LCD.RefFlag =0;
  158. /*-------------小时----------------------*/
  159.   LCD.Buf[add+0] = time[0]/10+'0';
  160.   LCD.Buf[add+1] = time[0]%10+'0';
  161.   LCD.Buf[add+2] = ':';
  162.   LCD.Buf[add+3] = time[1]/10+'0';
  163.   LCD.Buf[add+4] = time[1]%10+'0';
  164.   LCD.Buf[add+5] = ':';
  165.   LCD.Buf[add+6] = time[2]/10+'0';
  166.   LCD.Buf[add+7] = time[2]%10+'0';
  167.   LCD.RefFlag = 1;
  168. }

  169. /*----------------------------年月日显示显示函数-------------------------------------*/

  170. void LCD_DisplayDate(unsigned char add,unsigned char *date)        
  171. {
  172.   LCD.RefFlag =0;
  173. /*-------------小时----------------------*/
  174.   LCD.Buf[add+0] = '2';
  175.   LCD.Buf[add+1] = '0';
  176.   LCD.Buf[add+2] = date[0]/10+'0';        //年
  177.   LCD.Buf[add+3] = date[0]%10+'0';
  178.   LCD.Buf[add+4] = '-';
  179.   LCD.Buf[add+5] = date[1]/10+'0';  //月
  180.   LCD.Buf[add+6] = date[1]%10+'0';
  181.   LCD.Buf[add+7] = '-';            
  182.   LCD.Buf[add+8] = date[2]/10+'0';  //日期
  183.   LCD.Buf[add+9] = date[2]%10+'0';
  184.   LCD.Buf[add+10]= 0x20;
  185.   switch(date[3])
  186.   {
  187.                 case 1:{LCD_DisplayString(add+11,"Mon");}break;
  188.                 case 2:{LCD_DisplayString(add+11,"Tue");}break;
  189.                 case 3:{LCD_DisplayString(add+11,"Wed");}break;
  190.                 case 4:{LCD_DisplayString(add+11,"Thu");}break;
  191.                 case 5:{LCD_DisplayString(add+11,"Fri");}break;
  192.                 case 6:{LCD_DisplayString(add+11,"Sat");}break;
  193.                 case 7:{LCD_DisplayString(add+11,"Sun");}break;
  194.                 default:break;
  195.   }
  196.   LCD.RefFlag = 1;
  197. }



  198. void DisplayU16(unsigned char add,unsigned int num,unsigned char hide)  //hide =1 隐藏0  =0的时候不隐藏0
  199. {
  200.   xdata unsigned char temp[6]={0};
  201.   unsigned char i = 0;
  202.   for(i=0;i<5;i++)
  203.   {
  204.     temp[4-i]= num % 10 +'0';   
  205.           num = num / 10;
  206.   }
  207.   temp[5]='\0';
  208.   if(hide)
  209.   {
  210.     for(i=0;i<4;i++)
  211.         {
  212.           if(temp[i]=='0')
  213.             temp[i]=0x20;
  214.           else
  215.             break;
  216.         }
  217.   }
  218.   LCD_DisplayString(add,temp);
  219. }





  220. //温度显示函数
  221. void TempDisplay(unsigned char add,float Temp)
  222. {
  223.   unsigned char DisBuff[8]={0,0,0,0,0};
  224.   unsigned int Change = 0;
  225.   Change = 10*Temp;  //温度数据放大10倍 102.8   1028
  226.   DisBuff[0] = Change / 1000+'0';        //百位
  227.   DisBuff[1] = Change % 1000 / 100+'0';  //十位
  228.   DisBuff[2] = Change % 100 / 10+'0';    //个位
  229.   DisBuff[3] = '.';   
  230.   DisBuff[4] = Change % 10+'0';   
  231.   if(DisBuff[0]=='0')       //百位消0
  232.   {
  233.       DisBuff[0] = 0x20;
  234.       if(DisBuff[1]=='0')
  235.       { DisBuff[1]= 0x20; }
  236.   }
  237.   DisBuff[5]=0xdf,
  238.   DisBuff[6]=0x43;
  239.   DisBuff[7]='\0';
  240.   LCD_DisplayString(add,DisBuff);
  241. }
复制代码

回复

使用道具 举报

ID:415577 发表于 2018-10-26 00:36 | 显示全部楼层
会不会是调节屏幕的电阻阻值设置不对
回复

使用道具 举报

ID:341859 发表于 2018-10-26 09:21 | 显示全部楼层
子非鱼- 发表于 2018-10-26 00:36
会不会是调节屏幕的电阻阻值设置不对

不会啊,调过了,也还是这样
回复

使用道具 举报

ID:413568 发表于 2018-10-26 10:27 | 显示全部楼层
显示地址程序与问题
回复

使用道具 举报

ID:414974 发表于 2018-10-28 16:38 | 显示全部楼层
判别吗函数写错了
回复

使用道具 举报

ID:111634 发表于 2018-10-28 20:25 | 显示全部楼层
本帖最后由 zl2168 于 2018-10-28 21:19 编辑

实例67  LCD1602显示屏显示
⒈ LCD1602显示屏简介
⑴ 引脚功能    …
⑵ 内部寄存器    …
⑶ 控制指令    …
⑷ 操作时序    …
⒉ 电路设计    …
⒊ 程序设计    …
⒋ Keil调试    …
⒌ Proteus仿真    …

Proteus仿真一下,确认有效。 实例61 LCD1602显示屏显示.rar (49.26 KB, 下载次数: 673) 1602.jpg
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1。书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

ID:702913 发表于 2020-3-7 20:25 | 显示全部楼层
我也出现过这个情况,在别处看到有人讲P0口要加上拉电阻,然后问题就解决了
回复

使用道具 举报

ID:697627 发表于 2021-5-10 19:09 | 显示全部楼层
lcd是这样子的,protues仿真需要加上拉,但是实际电路不需要
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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