Russifizierung der openGLCD-Bibliothek für Arduino

Das Schreiben von russischsprachigem Text auf Grafikdisplays mit dem ks0108-Controller oder seinen Analoga ist immer noch mit erheblichen Schwierigkeiten verbunden. Die openGLCD-Bibliothek, die von den offiziellen Arduino-Sites in der ursprünglichen Konfiguration der neuesten Version empfohlen wird, enthält derzeit keine kyrillischen Schriftarten, mit Ausnahme der Schriftart cp437font8x8. In der Praxis ist es wenig nützlich, da es im russischsprachigen Teil die Win-1251-Codierung unterstützt . Um Zeichen in einer solchen Schriftart auszugeben, müssen sie daher entweder mit Oktal- oder Hexadezimalcodes in den Text eingefügt werden (und gleichzeitig gibt es Unklarheiten mit dem Kleinbuchstaben "I", wie der Ersteller der Schriftart selbst im Kommentar angibt) oder eine separate Konvertierungsfunktion wie diese schreiben tat arduinecfür die Adafruit-GFX-Bibliothek.

Darüber hinaus ist cp437font8x8 für Bildschirme mit 128 x 64 Pixel groß. Die optimale Schriftgröße für Zusatzetiketten auf einem solchen Display bleibt System5x7. Hier konzentrieren wir uns auf die Russifizierung der Systemschriftart, obwohl der Leser jede andere Schriftart basierend auf diesem Beispiel unabhängig russifizieren kann (insbesondere wenn sie einen größeren Bildschirm hat).

Was ist das Problem?


Lassen Sie uns zunächst die Wurzeln des Problems untersuchen. Die Arduino IDE ist ein normaler Windows-Texteditor , der wie alle anderen modernen Windows-Versionen (z. B. Notepad) in universeller UTF-8-Codierung arbeitet. UTF-8 ist eine kostengünstige Version der UNICODE-Multibyte-Codierung. In UTF-8 werden englischsprachige Zeichen, Zahlen, Semikolon-Klammern und alle möglichen anderen Symbole durch ein Byte dargestellt, das der Standard- ASCII-Codierung entspricht . Daher stellt ihre Darstellung im Skizzencode keine Schwierigkeiten dar: Nach der Kompilierung wird die Zeichenfolge der englischsprachigen Zeichen unverändert in die ladbare Hex-Datei übertragen und ist für den 8-Bit-Controller klar, wie sie sagen, "ohne Übersetzung".

Während dieser Konvertierung wird jedes Zeichen wie in jedem Programm in einer beliebigen Programmiersprache direkt in Form seines Codes dargestellt, dh der Seriennummer in der Schriftartentabelle, aus der das Programm den Grafikstil des entsprechenden Zeichens extrahiert. In der Systemdatei System5x7.h der openGLCD- Bibliothek wird die Anzahl der Zeichen durch die Variable font_Char_Count vom Typ uint8_t dargestellt , dh sie darf ein Byte nicht überschreiten. Daher können kyrillische Zeichen, die in UTF-8 zwei Bytes belegen , nicht auf die übliche Weise an die Steuerung übertragen werden.

Frühere Versuche
, . 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 . , , . .

Lösung


Der Autor ging nicht auf die Eingeweide von Bibliotheksfunktionen ein, sondern schrieb für openGLCD ein Add-In in Form der Funktion outstr () , das alle Elemente der Eingabezeichenfolge durchläuft und sie über den Auswahloperator Switch weiterleitet . Es fängt kyrillische Zeichen aus der Zeichenfolge ab und ersetzt sie durch Einzelbyte -Codes, die der aktualisierten Schriftartdatei System5x7R.h entsprechen .

Für den russischen Großbuchstaben "F" lautet die Ersatzzeichenfolge beispielsweise wie folgt:

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

Hier ist 0xA4 das niedrige Byte der Codierung des Buchstabens "F" in UTF-8 (siehe Link oben). In Übereinstimmung mit dieser Codierung wurde eine neue Schriftartdatei System5x7R.h kompiliert . Grundsätzlich können Sie mit diesem Ansatz in der Schriftart eine beliebige Codierung russischer Zeichen und anderer Glyphen verwenden, die Sie in die Schriftart einfügen möchten. Wenn nur ihre Gesamtzahl 128 Teile nicht überschreitet: vom Anfang der Tabelle bis zum Zeichen 0x7F (127 ist das letzte Zeichen der Standard-ASCII-Tabelle), ist es ratsam, die Schriftart intakt zu lassen.

Es stimmt, ich habe mir ein paar Freiheiten mit der ASCII-Tabelle erlaubt. Tatsache ist, dass in der Originalschrift System5x7.hDas Gradsymbol befindet sich in der letzten Zeile der Tabelle und belegt das 0x80-Zeichen, das wir bereits in kyrillischer Sprache haben. Um die Prozedur zum Erstellen einer kyrillischen Tabelle gemäß UTF-8 nicht zu verletzen, wurde diese Zeile aus der Datei geworfen. Und das Gradsymbol wird anstelle des ASCII-Zeichens „~“ (Nummer 0x7E) angehängt, das in der Schriftart noch nicht für den vorgesehenen Zweck verwendet wurde. Mit einem solchen Ersatz können Sie das Gradsymbol im Skizzentext direkt über die Tastatur in Form eines „~“ -Symbols eingeben.

Eine weitere Freiheit ergibt sich aus der Tatsache, dass der Autor die durchgestrichene Null nicht toleriert - das Archaische der ADCU und monochrome Textanzeigen. Daher wird die Null in der modernisierten Schriftart durch die Glyphe des Buchstabens „O“ ersetzt. Wer sich an puristische Prinzipien hält, kann einfach die System5x7R.h- Schriftartdatei löschendiese Einfügung (die alte Glyphe der durchgestrichenen Null wird auskommentiert, ihr Code ist 0x30).

In der modernisierten openGLCD- Bibliothek , die Sie über den Link am Ende des Artikels herunterladen können, wurde eine weitere Korrektur vorgenommen: Die Reihenfolge der Verbindung der Pins für Displays mit dem ks0108-Controller wurde geändert. Warum der Autor der Bibliothek diese Reihenfolge gewählt hat (siehe Tabelle unter dem Link auf der offiziellen Arduino-Website ), ist unbekannt. In der aktualisierten Version wird die Anzeigeverbindung (zum Beispiel der beliebte MT-12864J wird ausgewählt) nach diesem Schema ausgeführt:

MT-12864J Anschlussplan
image

Der variable Widerstand R1 wird hier gemäß der Empfehlung des Herstellers angeschlossen , und der Widerstand R2 dient zur Begrenzung des Hintergrundbeleuchtungsstroms, wenn er nicht an die 5-V-Spannung, sondern direkt an die Eingangsstromquelle (Vin Arduino-Ausgang) mit einer höheren Spannung angeschlossen wird.

Ein Beispiel für die Anzeige des russischen Alphabets MT-12864J, gemischt mit Latein, sowie Zahlen und dem Gradsymbol ist auf dem Foto dargestellt:

Bild

Skizzieren Sie Text für dieses Beispiel:

Der Text der Skizze mit dem Abschluss des russischen Alphabets
#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\libraries, wie gewöhnlich. Eine Beispielskizze befindet sich separat im selben Archiv (nicht im Ordner "Beispiele" der Bibliothek). Das Anschließen eines Displays an den ks0108-Controller gemäß dieser Bibliothek ist in der obigen Abbildung dargestellt. Wenn Sie zusätzlich die Verbindungsreihenfolge der Pins ändern möchten, suchen Sie die Datei PinConfig_ks0108-Uno.h im Ordner Arduino \ library \ openGLCD \ config \ ks0108 und bearbeiten Sie die darin enthaltenen Zeilen unter der Überschrift "Daten-Pin-Definitionen" und konzentrieren Sie sich dabei auf die Korrekturen des Autors.

In der nächsten Veröffentlichung werden wir versuchen, uns mit der Russifizierung von Kleinbuchstaben zu befassen. Wie Sie sehen werden, ist bei ihnen alles einfacher und komplizierter.

Source: https://habr.com/ru/post/de400749/


All Articles