行(或文本)显示旨在以行的形式传递文本信息。它们有几种类型(首先是LCD或自发光OLED),通常在其标记中有数字1202、1602、1204或类似数字,指示行数(在示例2或4中)和每行中的字符(12和16)。 。有这种类型的单行显示,但是在下面的演示中,我们重点介绍更常用的两行显示。这些显示器中的大多数与HD44780控制器(日立)兼容。该品种最流行(至少在我们的国家中)的显示器由Winstar生产。此外,LCD品种(名称以字母WH开头,例如WH1602)与HD44780命令系统一对一兼容,而OLED类型(名称以WEH开头例如WEH001602)具有改进的WS0010控制器。不幸的是,或者幸运的是,我们现在处理。与我们之前基于ks0108控制器检查的图形显示相反,小写显示中的字符生成器是内置的。而且,对于我们来说,WS0010和标准HD44780之间的主要区别是存在几个(四个)代码表,用于显示多语言文本。HD44780只有一个这样的桌子,这就是为什么公司必须在每个地区销售单独的显示器。基于WS0010的OLED显示器不需要按区域分类,因此更加方便。但不对用户开放:默认情况下,WEH显示屏中ENGLISH_JAPANESE表处于打开状态,并且要启用俄语字符,您需要将其切换为ENGLISH_RUSSIAN。了解有关ENGLISH_RUSSIAN表的更多信息。: (. ) , . , , — - -8, (.
19768-93). -, , , EBCDIC, , ( 127 ) ASCII. , , , ASCII .
当然,标准LiquidCrystal库(随Arduino IDE一起提供)对这四个表一无所知,因此至少在这方面需要整理。但不仅如此:最后,可以使用英语。但是,WS0010的初始化过程明显不同,如果未更正,显示屏将在每次启动时显示该信息。其他功能, OLED- Winstar , ( , ). , , . , , WEH SPI (, « SPI»),
, , ( 3) —
. : , . , I2C (. ,
).
出于某种原因,Winstar显示器在可理解的文档方面存在很大的不足(您可能已经注意到,这通常是中国产品的特征)。值得指出的是,您可以在哪里下载或多或少完整的文档,而不会出现任何错误:在带有HD44780控制器的LCD(WH1602)上,在OLED显示器(WEH1602)上的此处,在WS0010控制器上的单独此处(我们将在后面进行参考) 。在这里,如果您有兴趣,可以用俄语详细了解HD44780控制器。调平LiquidCrystal库
为了控制HD44780及其类似物上的小写显示,传统上包含在所有版本的Arduino IDE中的标准LiquidCrystal库非常适合。为了显示俄语文本,有其LiquidDryCrystalRus版本,令人惊讶地在所有现代Arduino IDE版本中都能很好地工作(它说作者正确地转换了UTF-8字符)。但是要适应WS0010控制器上的OLED显示屏,您仍然需要进行更正。将来,我们将模拟该库,因此将其重命名为LiquidCrystalRus_OLED,以免与通常的库混淆。为了简化任务,我们将不重命名函数,因为初始化将与原始LiquidCrystalRus相同。更改如下:1.自WS0010中的俄语-英语表(使用上面的链接,在WS0010的数据表上请参见第9页)为2,然后切换至该表,需要在FUNCTION SET命令中将FT1和FT0的两个最低有效位设置为状态10(0x02)。 (顺便说一下,在带有一个代码表的LCD中,这些位完全不使用)。要在文件中这样做LiquidCrystalRus_OLED.cpp跟踪下来的地方(文件行96),它设置的值_displayfunction。在其初始化的两行(第97和99行)中都添加一个追加“ | = 0x02 ”。2.接下来,您需要在打开电源后修复初始化延迟。对于HD44780,它应该不超过40毫秒(请参阅上面链接的文档)。该库为此使用函数。delayMicroseconds(50000)(LiquidCrystalRus_OLED.cpp文件的第120行)。对于WS0010控制器,您需要将延迟时间延长十倍-至少500毫秒(请参见上面链接的数据表最后一页)。仔细地隐藏了此要求(Winstar上带有英语文档的文件恰好在这一部分显示“丢失字体”),以至于到目前为止似乎很少有人想到它。因此,我们将此行替换为32条延迟重复,每次重复16 ms:for (int i = 0; i <=31; i++) delayMicroseconds(16000);
3.除此之外(另请参见数据表的最后一页),经过此延迟后,接通四线电源时,您需要连续五次发送空命令(0x00)。由于Arduino的速度明显快于显示控制器,因此应在中间延迟的情况下发出命令。需要将它们插入到begin函数的文本中,尤其是4位包含(LiquidCrystalRus_OLED.cpp文件的第147行)。4.但这还没有结束。原始的ENGLISH_RUSSIAN表具有一个度数图标(代码0xEF)。该选项无法以图形方式成功执行(太大),因此我更喜欢使用粗体的上点(代码0xDF)-它更像是常规样式中的度数。它可以以代码的形式输入(比八进制的“ \ 337”更好),但是麻烦是-试图简化使用UTF-8编码在库的作者字符生成器表(库的作者)中用代码替换俄语字母代码的功能(请参见上一篇文章),为大于0x80的任何代码(LiquidCrystalRus :: write函数)引入了替换条件。由于我们的0xDF明显大于0x80,因此当您在代码行中指定字符“ \ 337”时,将显示空白,因为它不对应任何俄语字母。不幸的是,标准的createChar()函数当我尝试使用它创建自己的学位图标时,我在一个完整的stupor中输入了显示内容,只有重新加载程序才能从中删除该显示内容。我需要额外处理的事情,如果有人告诉我怎么回事,我将不胜感激。因此无法使用我们的功能来编辑字符生成器,但是可以从条件中排除所需的0xDF字符。为此,将现有条件(请参见write函数的文本)替换为以下内容:if ((value>=0x80)&&(value!=0xdf))
5.最后,此显示器上的划线零并不像图形LCD屏幕上那样醒目。不过,在相同的写入功能中,我介绍了用字母“ O”(0x4f)的代码替换零代码(0x30)。那些希望的人可以通过简单地删除或注释掉替换行(修改后的LiquidCrystalRus_OLED.cpp文件的第308行)来返回划掉的零。可以从文章末尾的链接下载更新的库。连接方式
现在一切似乎都已调整,您可以连接。下图显示了WEH001602BG显示器(16个字符,屏幕长度100毫米)与Arduino的
连接:初始化显示器时,应指出与RS,E,DB4-DB7显示引脚连接的Arduino引脚:
LiquidCrystalRus OLED1(3, 5, 7, 8, 9, 10);
如果需要,您可以在任何接口选项(八线或四线)中连接两个或更多显示器。在这种情况下,数据线和RS可以共享。在这种情况下,显示器之间的选择是通过端子E进行的,对于不同的显示器,端子E连接到不同的Arduino端子(第二个显示器的连接线在图中以灰色显示,此处第二个显示器的端子E连接到Arduino的引脚6)。当然,在这种情况下,您需要创建该库的两个副本(例如OLED1和OLED2),其中除E之外的所有输出都相同。此外,显示器可以具有不同的配置和大小(8x2、16x2、12x2、12x4等)。 )。这也适用于HD44780上的常规LCD显示器。为何有继电器供电源? WS0010的主要缺点是缺少硬件“ rezet”。在HD44780中,内置的rezet可能是合理的-作者没有足够的LCD屏幕经验可以肯定地说。但是Winstar试图遵循其开发标准,显然无法应对这一任务。在不关闭电源的情况下重新启动控制器会导致显示器上出现任何浑浊现象,只有通过调节整个电路的电源并从头开始初始化显示器,才能消除它。另外,关闭/打开电源时,显示器可能会使线路混乱。人们声称完整的8位包含(而不是4位)会有所帮助,但对我而言,效果甚至更差。他们还坚持认为,在假设的“新批次”中,所有这些都已得到修复,但令人难以置信(自2008年 Winstar 发布 OLED显示器以来,我们谈论的是哪种“新”批次,而我拥有13和14年的显示器释放?)。继电器并设置为在重新启动Arduino时无需关闭电源即可人为重置显示器。这样可以可靠地消除屏幕上的垃圾。显示器的电源通过该继电器单独打开,当控制器已经稳定运行时,该继电器在设置过程开始时从免费的Arduino引脚(在这种情况下为引脚4)打开。在打开继电器之前,最好再加上1000 ms的延迟(请参见下面的示意图)。指示的继电器EDR202A05是簧片继电器,绕组电流为10 mA,因此可以从Arduino输出中进行安静控制。关于接通时线路之间的混乱,除了初始化过程中的上述更改外,此效果还可以从具有足够功率(至少1-2 A)的外部电源中获得至少7.5的稳定电压,从而完全缓解整个电路的功率伏特 显然,对营养的依赖是许多出版物中差异的根源,许多出版物声称一切对他们都很好。在这种情况下,显示器可以通过Arduino内部稳定器(开发板的5V引脚)或通过单独的稳定器进行连接,但是主要的问题是无论打开电源时的电涌浪涌如何,稳定器的输入电压都应足够稳定。检查一下
为了进行检查,我发送了一个演示草图Proba_Rus_Liquid_Crystal_OLED,使用外部温度传感器模拟日历时钟显示:显示示例WEH1602#include <LiquidCrystalRus_OLED.h>
LiquidCrystalRus OLED1(3, 5, 7, 8, 9, 10);
#define RelayPin 4
void setup() {
delay (1000);
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, HIGH);
delay (500);
OLED1.begin(16,2);
OLED1.clear();
OLED1.setCursor(0,0);
OLED1.print("-22,3\337C");
OLED1.setCursor(11,0);
OLED1.print("10:22");
OLED1.setCursor(0,1);
OLED1.print("16.01.17 ");
OLED1.setCursor(13,0);
OLED1.blink();
delay(1000);
}
void loop() {
}
上面提到的库中的所有特征更改都在这里应用。该程序还显示了如何使用blink()函数在小时:分钟内使结肠闪烁。请注意,在相同位置的新输出会破坏熟悉度的闪烁,并且在更新它时,您必须再次将其恢复,因为之前已将不可见光标设置到零行中的相同位置13。使用真实的时钟更新,可能更容易只更新位置11-12和14-15的数字,而使闪烁的冒号保持完整。该示例的输出结果如图所示:应该注意的是,照片没有传达绿色OLED显示器的辉光(在这种情况下)。实际上,它是一种深绿色,其波长比LED显示器(七段或矩阵)中的普通568 nm短。为什么后者在OLED背景下显得“褪色”,并且它们的组合应用很困难。WS0010具有图形模式,而Winstar图形OLED显示器(例如WEG010016)也具有此控制器。有人注意到它们甚至具有相同的矩阵。在我看来,尝试在文本行显示上使用图形模式是没有意义的:行显示在字符和行之间具有硬件设置的暗区,使图片极不美观(请参阅此类尝试的许多示例)。最后一点:关于Winstar OLED的耐用性。在数据表中,时间显示为100,000小时,即11年。但是,发行的第13年(黄光)到现在(第16冬季)的显示之一使我的亮度急剧下降。有趣的是,同一个聚会(绿色)和后来的聚会(黄色和绿色的14岁)中的其余成员没有任何死亡迹象。因此,可以肯定地说,我不敢说什么,但为以防万一,我建议您不要将显示器焊接到板上,而应将它们安装在连接器上,以便可以无问题地更换显示器。您可以从此处下载带有免费库和示例的存档。UPD:解决了稳定启动而无需操纵电源的问题:https ://geektimes.ru/post/287234/