极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 63262|回复: 26

arduino控制LCD1602的一点儿经验分享

[复制链接]
发表于 2012-5-6 14:31:16 | 显示全部楼层 |阅读模式
本帖最后由 arduino-tinker 于 2012-5-6 14:40 编辑

不知道大家在用LCD1602的时候有没有遇到这样的问题,在用LCD显示变量的时候,如果不用lcd.clear来清屏,如果新的内容比旧的长,倒是不会有什么问题;但是如果新的内容比老的短,问题就来了,老的内容不会被完全覆盖。例如原来显示的是HIGH,现在要显示LOW,由于LOW只有3个字母,只会把HIGH的H、I、G覆盖掉,而H任然还在,所以显示的内容就变成了LOWH。但是如果用lcd.clear来清屏,又会有一个问题,在loop下的代码会被反复执行,这样一来,反复执行lcd.clear会导致不断闪屏,基本看不到显示的内容。
  1. void loop()
  2. {
  3. if (val == HIGH) {
  4. lcd.print("HIGH");
  5. } else {
  6. lcd.print("LOW");
  7. }
复制代码

在求助无果的情况下想到了一个办法,拿出来和大家分享交流一下。

我的办法是引入一个新的变量old_val,在代码末尾将val赋值给old_val,然后在loop函数开头加入一个条件句,判断val是否等于old_val,如果不等,说明显示的内容将发生变化,就执行lcd.clear;如果相等则说明显示的内容不变,就不用执行lcd.clear
  1. void loop()
  2. {

  3. if (val != old_val) {
  4. lcd.clear();
  5. }

  6. if (val == HIGH) {
  7. lcd.print("HIGH");
  8. } else {
  9. lcd.print("LOW");

  10. old_val = val;
  11. }
复制代码

这样不仅解决了显示内容变化时的覆盖问题,也解决了内容不变时的闪屏问题。
也希望大家能说说各自是怎么解决这个问题的。

这是我是第一次发帖,而且接触arduino也没多久,有什么不对的地方还望大家多多包涵。
回复

使用道具 举报

发表于 2012-5-6 23:47:24 | 显示全部楼层
mark一下,谢谢分享
回复 支持 反对

使用道具 举报

发表于 2012-6-24 00:49:10 | 显示全部楼层
本帖最后由 沧海笑1122 于 2012-6-24 01:20 编辑

我对不同长度的变量,使用1602显示的解决办法是,使用lcd.print(" ")来覆盖那个多余的旧字符。
例:变量drop1Size,使用线性电位器从模拟1口读入。值从0~1024.
首先把大于1000的值,设为溢出,显示为999.
其次,对于小于100的值,因为显示两位数,就有可能与第三位的旧值构成干扰。如从103---98;
显示就是“983”。形成了干扰。所以,在两位数后,采用lcd.print(" ")来覆盖那个多余的旧字符。
代码如下:
  1. if (drop1Size>1000
  2. {
  3.   lcd.print(999); //提示溢出
  4. }
  5. else
  6. {
  7.   if (drop1Size<100) //此时需要显示两位数,那么第三位数必须覆盖。
  8.   {
  9.      lcd.print( drop1Size);   //显示两位数
  10.      lcd.print(" ");             //继续显示一个空格,覆盖掉第三位旧值。
  11.   }
  12.   else
  13.   {
  14.    lcd.print( drop1Size);   //正常的三位数,直接显示即可
  15.   }
  16. }
  17. delay(200);
复制代码
慎用清屏,因为会把屏幕上原本你需要固定显示的内容一并清除,而且还可能会造成闪烁。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-24 00:55:44 | 显示全部楼层
沧海笑1122 发表于 2012-6-24 00:49
我对不同长度的变量,使用1602显示的解决办法是,使用lcd.print(" ")来覆盖那个多余的旧字符。
例:变量dr ...

是啊~~都考虑到我的方法会把固定显示的东西清掉!学习了,十分感谢!
回复 支持 反对

使用道具 举报

发表于 2012-6-24 01:10:37 | 显示全部楼层
本帖最后由 沧海笑1122 于 2012-6-24 01:20 编辑

不客气,也向你学习。

刚刚补充了,从两位数降为单位数时,道理依然。lcd.print(" ")会覆盖那多余出来的第二位旧值。实际上,如果你的液晶显示空间富裕,也可以一律直接加一个lcd.print(" ")(或者多个,视数据长度而定),而不用做判断。
  1. if (drop1Size>1000)
  2. {
  3.   lcd.print(999);
  4. }
  5. else
  6. {
  7.   lcd.print( drop1Size);
  8.   lcd.print(" ");//不必判断,一律加一个或者多个空格即可。具体视数据长度调整。
  9. }
  10. delay(200);
复制代码
回复 支持 反对

使用道具 举报

发表于 2012-6-24 22:20:40 | 显示全部楼层
如果够的话,采用虚拟屏幕,用两个串把所有内容存起来,清屏幕,重写。就和PC上的屏幕一样。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-25 00:09:22 | 显示全部楼层
弱弱地问一句,您的“两个串”是啥意思啊?没看懂!
回复 支持 反对

使用道具 举报

发表于 2012-6-25 13:46:39 | 显示全部楼层
本帖最后由 vp110 于 2012-6-25 13:50 编辑

何必这么纠结呢。
楼主你把HIGH和LOW弄的一样的长度不就解决了(LOW后面加1空格)。哪还用的着多个变量,多段语句呢。浪费资源不是。

  1. void loop()
  2. {
  3.     if (val == HIGH)
  4.         lcd.print("HIGH");
  5.     else
  6.         lcd.print("LOW ");
  7. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-25 16:52:15 | 显示全部楼层
vp110 发表于 2012-6-25 13:46
何必这么纠结呢。
楼主你把HIGH和LOW弄的一样的长度不就解决了(LOW后面加1空格)。哪还用的着多个变量,多 ...

嗯,这个思路不错!学习了!
回复 支持 反对

使用道具 举报

发表于 2012-6-28 12:23:25 | 显示全部楼层
vp110 发表于 2012-6-25 13:46
何必这么纠结呢。
楼主你把HIGH和LOW弄的一样的长度不就解决了(LOW后面加1空格)。哪还用的着多个变量,多 ...

具体问题具体分析解决,不错
回复 支持 反对

使用道具 举报

发表于 2013-2-4 19:48:58 | 显示全部楼层
也可以在lcd.clear()后面加一个delay(1);
如果是对付要求不是很高的代码 延迟一小点时间还是允许的吧?
回复 支持 反对

使用道具 举报

发表于 2013-2-4 19:50:05 | 显示全部楼层
说错了 是在lcd.clear()前面插入 否则就变成清屏被延时了--、。。
回复 支持 反对

使用道具 举报

发表于 2013-3-8 12:56:02 来自手机 | 显示全部楼层
楼主,,求库文件!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-12 22:43:42 | 显示全部楼层
这就不用库文件了吧。。。直接嵌入就OK了啊!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-12 22:44:04 | 显示全部楼层
arduino-ice 发表于 2013-3-8 12:56
楼主,,求库文件!!!

这就不用库文件了吧。。。直接嵌入就OK了啊!
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 13:47 , Processed in 0.038431 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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