Arduino的openGLCD库的俄罗斯化

使用ks0108控制器或其类似物在图形显示上编写俄语文本仍然存在很大的困难。 Arduino官方网站建议的openGLCD库当前处于最新版本原始配置中,除cp437font8x8字体外,不包含任何西里尔字体。实际上,它用处不大,因为它在俄语部分中支持Win-1251编码。因此,为了显示在该字体的字符,它们必须被插入到八进制或十六进制代码的文本(和因而仍不清楚以小写字母“i”,如在评论本身字体创作者指出)或静止写一个单独的函数转换为它arduinec用于Adafruit-GFX库。

另外,cp437font8x8适用于128x64像素的屏幕。在此类显示器上,辅助标签的最佳字体大小保持为System5x7。尽管读者可以根据此示例独立地将任何其他字体进行Russ化(特别是在屏幕较大的情况下),但在此我们重点关注系统字体的Russification。

怎么了


首先,让我们深入研究问题的根源。 Arduino IDE是一个常规的Windows文本编辑器,它以通用UTF-8编码工作,就像现代Windows版本中的其他任何文本编辑器一样(例如,记事本)。 UTF-8是UNICODE多字节编码的经济版本。在UTF-8中,英文字符,数字,分号括号和各种其他图标由与标准ASCII编码匹配的一个字节表示。因此,它们在草图代码中的表示不会出现任何困难:编译后,英语字符的字符串无需更改就被传输到可加载的十六进制文件,并且对于8位控制器来说是清楚的,如他们所说的“无需翻译”。

在此转换过程中,如同使用任何编程语言在任何程序中一样,每个字符都直接以其代码形式表示,即字体表中的序列号,程序从中提取相应字符的图形样式。openGLCD库的System5x7.h 字体文件中,字符数由uint8_t类型font_Char_Count变量表示,即,不能超过一个字节。因此,在UTF-8中占据两个字节的西里尔字符不能以通常的方式传输到控制器。

以前的尝试
, . Arduino 1.0.x (, , 1.6.0) , ( , UTF-8 , 0xD0, 0xD1). GLCD v3, , UTF-8 ( 0x80 0xBF). « ». — Arduino IDE 1.0.x GLCD v3, .

Arduino IDE . , , . .

解决方案


作者没有深入研究库函数,而是为openGLCD编写了一个outstr()函数形式的加载项,该加载项遍历输入字符串的所有元素,并将它们传递给Switch选择运算符。它从字符串中捕获西里尔字母,并用与升级后的字体文件System5x7R.h对应的单字节代码替换它们

例如,对于大写俄语字母“ F”,替换字符串将如下所示:

case '': GLCD.PutChar(0xA4); break;

这里0xA4是UTF-8中字母“ F”编码的低字节(请参见上面的链接)。按照此编码,已编译了新的字体文件System5x7R.h。原则上,使用这种字体方法,您可以使用俄语字符的任何编码以及要插入字体的任何其他字形。如果它们的总数不超过128个:从表的开头到0x7F字符(127是标准ASCII表的最后一个字符),建议保留字体不变。

没错,我允许自己自由使用ASCII表。事实是,原始字体为System5x7.h度图标位于表格的最后一行,占位0x80字符,这在西里尔语中已经存在。为了不违反按照UTF-8构造西里尔表格的过程,从文件中抛出了这一行。并附加了度数图标,而不是ASCII字符“〜”(数字0x7E),该字符在字体中仍未被使用。但是,这样的替换使您可以直接从键盘以“〜”符号的形式在草图文本中输入度图标。

另一个自由是由于作者不容忍被划掉的零-ADCU和单色文本显示的过时。因此,现代字体中的零被字母“ O”的字形所代替。那些遵循纯粹原则的人可以简单地删除System5x7R.h字体文件此插入(划掉零的旧字形留在注释中,其代码为0x30)。

在现代化的openGLCD库中,您可以从文章结尾的链接下载该,您还可以进行更正-更改了ks0108控制器的显示器引脚的连接顺序。库的作者为什么选择此顺序(请参阅Arduino官方网站上的链接的表)为何未知。在升级版本中,显示连接(例如,选择了流行的MT-12864J)是根据以下方案执行的:

MT-12864J接线图
image

可变电阻器R1根据制造商的建议在此处连接,如果电阻器R2不是连接至5 V电压,而是直接连接至具有较高电压的输入电源(Arduino上的输出),则电阻R2用于限制背光电流。

照片中显示了一个俄语示例MT-12864J与拉丁语以及数字和度数图标混合显示的示例:

图片

此示例的草图文本:

草图文字以及俄语字母的结尾
#include <openGLCD.h> // 
#include <outstr.h> //     
#include <System5x7R.h> //    

void setup() {
      GLCD.Init(); //
      GLCD.ClearScreen();
      }

void loop()
      {
      GLCD.SelectFont(System5x7R);  // 
      GLCD.CursorTo(0,0); //     
      //  - : 
      outstr("ABC \n");
      outstr("PRQ \n");
      outstr("nts \n");
      outstr("xyz \n");
      GLCD.println("1234567890");
      GLCD.CursorTo(19,4); //     5-  
      GLCD.print("~C"); //  
      GLCD.println("@;/.,|<>()=-_{}\"'");
            GLCD.CursorTo(4,7); //    4  8
      GLCD.print("MT-12864J");
      }



由于具有outstr.h函数System5x7R.h字体的文件位于升级库的根目录中,因此必须使用#include指令在草图的开头将它们放置在单独的链接中。对于英语题词,使用标准的println / print函数仍然很方便,但是如果需要在俄语文本中翻译一行,则必须显式指定字符“ \ n”。

您可以在此处下载该库的更正版本解压缩的库(openGLCD文件夹)应放在Arduino \ library文件夹中和往常一样。示例草图分别位于同一档案库中(不在库的Examples文件夹中)。上图显示了根据此库将显示器与ks0108控制器连接的过程。如果您要另外更改引脚的连接顺序,请在Arduino \ library \ openGLCD \ config \ ks0108 文件夹中查找PinConfig_ks0108-Uno.h文件,然后在“数据引脚定义”标题下编辑其中的行,并着重于作者的更正。

在下一个出版物中,我们将尝试处理小写显示的俄罗斯化。如您所见,有了它们,一切都变得更加容易和复杂。

Source: https://habr.com/ru/post/zh-CN400749/


All Articles