找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD1602刷新率很慢的问题

[复制链接]
跳转到指定楼层
楼主
我的单片机设计用lcd1602显示多组数据

但lcd1602显示的数据存在闪烁的问题(在显示的数字和0交替闪烁)如图1所示

百度了问题仍没有解决问题

求大佬指导

程序太多且比较乱故不放出了

Honeycam 2020-04-04 12-36-14.gif (21.79 KB, 下载次数: 82)

图片1

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

使用道具 举报

沙发
ID:213173 发表于 2020-4-4 16:58 | 只看该作者
从现象看是因为楼主对需要刷新的部分字符清0并显示出来了。
回复

使用道具 举报

板凳
ID:602576 发表于 2020-4-4 17:14 | 只看该作者
显示数组变量在循环内赋值0导致的,每个循环次执行的时候都会刷一次0
回复

使用道具 举报

地板
ID:497598 发表于 2020-4-4 17:29 | 只看该作者
wulin 发表于 2020-4-4 16:58
从现象看是因为楼主对需要刷新的部分字符清0并显示出来了。

老哥能帮我看看lcd1602部分的程序吗,我找不出在哪
  1. #include"lcd.h"
  2. /*******************************************************************************
  3. * 函 数 名         : Lcd1602_Delay1ms
  4. * 函数功能                   : 延时函数,延时1ms
  5. *******************************************************************************/
  6. void Lcd1602_Delay1ms(uint c)   //误差 0us
  7. {
  8.     uchar a,b;
  9.         for (; c>0; c--)
  10.         {
  11.                  for (b=199;b>0;b--)
  12.                  {
  13.                           for(a=1;a>0;a--);
  14.                  }      
  15.         }
  16.            
  17. }
  18. /*******************************************************************************
  19. * 函 数 名         : LcdWriteCom
  20. * 函数功能                   : 向LCD写入一个字节的命令
  21. *******************************************************************************/
  22. #ifndef         LCD1602_4PINS         //当没有定义这个LCD1602_4PINS时
  23. void LcdWriteCom(uchar com)          //写入命令
  24. {
  25.         LCD1602_E = 0;     //使能
  26.         LCD1602_RS = 0;           //选择发送命令
  27.         LCD1602_RW = 0;           //选择写入
  28.        
  29.         LCD1602_DATAPINS = com;     //放入命令
  30.         Lcd1602_Delay1ms(1);                //等待数据稳定

  31.         LCD1602_E = 1;                  //写入时序
  32.         Lcd1602_Delay1ms(5);          //保持时间
  33.         LCD1602_E = 0;
  34. }
  35. #else
  36. void LcdWriteCom(uchar com)          //写入命令
  37. {
  38.         LCD1602_E = 0;         //使能清零
  39.         LCD1602_RS = 0;         //选择写入命令
  40.         LCD1602_RW = 0;         //选择写入

  41.         LCD1602_DATAPINS = com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
  42.         Lcd1602_Delay1ms(1);

  43.         LCD1602_E = 1;         //写入时序
  44.         Lcd1602_Delay1ms(5);
  45.         LCD1602_E = 0;

  46.         Lcd1602_Delay1ms(1);
  47.         LCD1602_DATAPINS = com << 4; //发送低四位
  48.         Lcd1602_Delay1ms(1);

  49.         LCD1602_E = 1;         //写入时序
  50.         Lcd1602_Delay1ms(5);
  51.         LCD1602_E = 0;
  52. }
  53. #endif
  54. /*******************************************************************************
  55. * 函 数 名         : LcdWriteData
  56. * 函数功能                   : 向LCD写入一个字节的数据
  57. *******************************************************************************/                  
  58. #ifndef         LCD1602_4PINS                  
  59. void LcdWriteData(uchar dat)                        //写入数据
  60. {
  61.         LCD1602_E = 0;        //使能清零
  62.         LCD1602_RS = 1;        //选择输入数据
  63.         LCD1602_RW = 0;        //选择写入

  64.         LCD1602_DATAPINS = dat; //写入数据
  65.         Lcd1602_Delay1ms(1);

  66.         LCD1602_E = 1;   //写入时序
  67.         Lcd1602_Delay1ms(5);   //保持时间
  68.         LCD1602_E = 0;
  69. }
  70. #else
  71. void LcdWriteData(uchar dat)                        //写入数据
  72. {
  73.         LCD1602_E = 0;          //使能清零
  74.         LCD1602_RS = 1;          //选择写入数据
  75.         LCD1602_RW = 0;          //选择写入

  76.         LCD1602_DATAPINS = dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
  77.         Lcd1602_Delay1ms(1);

  78.         LCD1602_E = 1;          //写入时序
  79.         Lcd1602_Delay1ms(5);
  80.         LCD1602_E = 0;

  81.         LCD1602_DATAPINS = dat << 4; //写入低四位
  82.         Lcd1602_Delay1ms(1);

  83.         LCD1602_E = 1;          //写入时序
  84.         Lcd1602_Delay1ms(5);
  85.         LCD1602_E = 0;
  86. }
  87. #endif
  88. /*******************************************************************************
  89. * 函 数 名       : LcdInit()
  90. * 函数功能                 : 初始化LCD屏
  91. *******************************************************************************/                  
  92. #ifndef                LCD1602_4PINS
  93. void LcdInit()                                                  //LCD初始化子程序
  94. {
  95.         LcdWriteCom(0x38);  //开显示
  96.         LcdWriteCom(0x0c);  //开显示不显示光标
  97.         LcdWriteCom(0x06);  //写一个指针加1
  98.         LcdWriteCom(0x01);  //清屏
  99.         LcdWriteCom(0x80);  //设置数据指针起点
  100. }
  101. #else
  102. void LcdInit()                                                  //LCD初始化子程序
  103. {
  104.         LcdWriteCom(0x32);         //将8位总线转为4位总线
  105.         LcdWriteCom(0x28);         //在四位线下的初始化
  106.         LcdWriteCom(0x0c);  //开显示不显示光标
  107.         LcdWriteCom(0x06);  //写一个指针加1
  108.         LcdWriteCom(0x01);  //清屏
  109.         LcdWriteCom(0x80);  //设置数据指针起点
  110. }
  111. #endif
  112. /*------------------------------------------------
  113.               选择写入位置
  114. ------------------------------------------------*/
  115. void SelectPosition(unsigned char x,unsigned char y)
  116. {     
  117.         if (x == 0)
  118.         {     
  119.                 LcdWriteCom(0x80 + y);     //表示第一行
  120.         }
  121.         else
  122.         {      
  123.                 LcdWriteCom(0xC0 + y);      //表示第二行
  124.         }        
  125. }
  126. /*------------------------------------------------
  127.               写入字符串函数
  128. ------------------------------------------------*/
  129. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  130. {     
  131.         SelectPosition(x,y) ;
  132.         while (*s)                                   //*s表示s是一个指针。*s表示s指针指向的相应变量的值
  133.         {     
  134.                 LcdWriteData( *s);     
  135.                 s ++;     
  136.         }
  137. }
  138. //========================================================================
  139. // 函数: void LCD_Write_Char(uchar x,uchar y,uint s,uchar l)
  140. // 应用: LCD_Write_Char(0,1,366,4) ;
  141. // 描述: 在第0行第一个字节位置显示366的后4位,显示结果为 0366
  142. // 参数: x:行,y:列,s:要显示的字,l:显示的位数
  143. //========================================================================
  144. void LCD_Write_Char(uchar x,uchar y,uint s,uchar l)
  145. {     
  146.         SelectPosition(x,y) ;

  147.         if(l>=5)
  148.                 LcdWriteData(0x30+s/10000%10);        //万位
  149.         if(l>=4)
  150.                 LcdWriteData(0x30+s/1000%10);                //千位
  151.         if(l>=3)
  152.                 LcdWriteData(0x30+s/100%10);                //百位
  153.         if(l>=2)
  154.                 LcdWriteData(0x30+s/10%10);                        //十位
  155.         if(l>=1)
  156.                 LcdWriteData(0x30+s%10);                //个位

  157. }

  158. /*显示函数1*/
  159. void Display1(wendu,yanwu,pm25,jiaquan) //温度,烟雾,PM2.5,甲醛
  160. {
  161.        
  162.         //时时温度
  163.         LCD_Write_Char(0,6,wendu/10,2);
  164.         LcdWriteData('.');
  165.         LCD_Write_Char(0,9,wendu%10,1);       
  166.         //时时烟雾
  167.         LCD_Write_Char(0,13,yanwu,3);
  168.         //时时pm25
  169.         LCD_Write_Char(1,6,pm25,3);
  170.         //时时甲醛
  171.         LCD_Write_Char(1,13,jiaquan,3);

  172. }  

  173. /*显示函数2*/
  174. void Display2(yushe_wendu,yushe_yanwu,yushe_pm25,yushe_jiaquan)
  175. {
  176.         //显示预设温度
  177.         LCD_Write_Char(0,6,yushe_wendu,2);
  178.         //显示预设烟雾
  179.         LCD_Write_Char(0,13,yushe_yanwu,3);
  180.         //显示预设PM2.5
  181.         LCD_Write_Char(1,6,yushe_pm25,3);
  182.         //显示预设甲醛
  183.         LCD_Write_Char(1,13,yushe_jiaquan,3);       
  184. }
复制代码
回复

使用道具 举报

5#
ID:688939 发表于 2020-4-4 17:44 | 只看该作者
你把系统里的设置动画选项 每秒显示帧数改成50试试,不行的话可能你的程序有问题
回复

使用道具 举报

6#
ID:497598 发表于 2020-4-4 18:11 | 只看该作者
wulin 发表于 2020-4-4 16:58
从现象看是因为楼主对需要刷新的部分字符清0并显示出来了。

感谢老哥,已搞定
回复

使用道具 举报

7#
ID:497598 发表于 2020-4-4 21:57 | 只看该作者
sduking 发表于 2020-4-4 17:14
显示数组变量在循环内赋值0导致的,每个循环次执行的时候都会刷一次0

厉害,一下都看出来了
回复

使用道具 举报

8#
ID:584814 发表于 2020-4-6 09:50 | 只看该作者
Display1或Display2,选一个屏蔽掉试试 。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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