Escribir texto en ruso en pantallas gráficas con el controlador ks0108 o sus análogos aún presenta dificultades significativas. La biblioteca openGLCD, recomendada por los sitios oficiales de Arduino, en la configuración original de la última versión en este momento no contiene ninguna fuente cirílica, excepto la fuente cp437font8x8. En la práctica, es de poca utilidad, porque en la parte del idioma ruso es compatible con la codificación Win-1251 . Por lo tanto, para generar caracteres en dicha fuente, deben insertarse en el texto con códigos octales o hexadecimales (y al mismo tiempo hay ambigüedades con la letra minúscula "I", como indica el creador de la fuente en el comentario), o aún escribir una función de conversión por separado, como esta hizo arduinecpara la biblioteca Adafruit-GFX.Además, cp437font8x8 es grande para pantallas de 128x64 píxeles. El tamaño de fuente óptimo para las etiquetas auxiliares en dicha pantalla sigue siendo System5x7. Aquí nos centramos en la rusificación de la fuente del sistema, aunque el lector puede rusificar independientemente cualquier otra fuente basada en esta muestra (especialmente si tiene una pantalla más grande).Cual es el problema
Para comenzar, profundicemos en las raíces del problema. Arduino IDE es un editor de texto de Windows normal que funciona en codificación universal UTF-8 , como cualquier otro en las versiones modernas de Windows (Bloc de notas, por ejemplo). UTF-8 es una versión económica de la codificación multibyte UNICODE. En UTF-8, los caracteres en inglés, los números, los puntos y comas y otros tipos de íconos están representados por un byte que coincide con la codificación ASCII estándar . Por lo tanto, su representación en el código de boceto no presenta ninguna dificultad: una cadena de caracteres en inglés después de la compilación se transfiere al archivo hexadecimal cargable sin cambios y es clara para el controlador de 8 bits, como dicen, "sin traducción".En el proceso de esta conversión, cada carácter, como en cualquier programa en cualquier lenguaje de programación, se representa directamente en la forma de su código, es decir, el número de serie en la tabla de fuentes, de donde el programa extrae el estilo gráfico del carácter correspondiente. El archivo de fuentes System5x7.h biblioteca openGLCD número variable de caracteres representada font_Char_Count tipo uint8_t , es decir, no puede exceder de un byte. Por lo tanto, los caracteres cirílicos, que en UTF-8 ocupan dos bytes , no pueden transmitirse al controlador de la manera habitual.Intentos previos, . 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 . , , . .
Solución
El autor no profundizó en las funciones de la biblioteca, pero escribió para openGLCD un complemento en forma de la función outstr () , que itera sobre todos los elementos de la cadena de entrada, pasándolos a través del operador de selección Switch . Captura caracteres cirílicos de la cadena y los reemplaza con códigos de un solo byte correspondientes al archivo de fuente actualizado System5x7R.h .Por ejemplo, para la letra mayúscula rusa "F", la cadena de reemplazo será así:case '': GLCD.PutChar(0xA4); break;
Aquí 0xA4 es el byte bajo de la codificación de la letra "F" en UTF-8 (ver enlace arriba). De acuerdo con esta codificación, se ha compilado un nuevo archivo de fuente System5x7R.h . En principio, con este enfoque en la fuente, puede usar cualquier codificación de caracteres rusos y cualquier otro glifo que desee insertar en la fuente. Si solo su número total no supera las 128 piezas: desde el comienzo de la tabla hasta el carácter 0x7F (127 es el último carácter de la tabla ASCII estándar), es aconsejable dejar la fuente intacta.Es cierto, me permití un par de libertades con la tabla ASCII. El hecho es que en la fuente original System5x7.hEl icono de grado se coloca en la última fila de la tabla, ocupando el carácter 0x80, que ya tenemos en cirílico. Para no violar el procedimiento para construir una tabla cirílica de acuerdo con UTF-8, esta línea se arrojó del archivo. Y se adjunta el ícono de grado en lugar del carácter ASCII "~" (número 0x7E), que en la fuente todavía no se usó para su propósito previsto. Pero tal reemplazo le permite ingresar el icono de grado en el texto del boceto directamente desde el teclado en forma de un símbolo "~".Otra libertad se debe al hecho de que el autor no tolera el cero tachado: lo arcaico de las pantallas de texto ADCU y monocromo. Por lo tanto, el cero en la fuente modernizada se reemplaza por el glifo de la letra "O". Aquellos que se adhieren a los principios puristas pueden simplemente eliminar el archivo de fuente System5x7R.heste inserto (el antiguo glifo de cero tachado se deja comentado, su código es 0x30).En la biblioteca modernizada de openGLCD , que puede descargar desde el enlace al final del artículo, se ha realizado una corrección más: se ha cambiado el orden de conexión de los pines para pantallas con el controlador ks0108. Se desconoce por qué el autor de la biblioteca eligió este orden (consulte la tabla en el enlace del sitio web oficial de Arduino ). En la versión actualizada, la conexión de pantalla (por ejemplo, se selecciona el popular MT-12864J) se realiza de acuerdo con este esquema:Diagrama de conexión MT-12864J La resistencia variable R1 se conecta aquí de acuerdo con las recomendaciones del fabricante , y la resistencia R2 sirve para limitar la corriente de retroiluminación si no está conectada al voltaje de 5 V, sino directamente a la fuente de alimentación de entrada (salida de Vin Arduino) con un voltaje más alto.En la foto se muestra un ejemplo de la visualización del alfabeto ruso MT-12864J mezclado con latín, así como los números y el icono de grado:Boceto de texto para este ejemplo:El texto del boceto con la conclusión del alfabeto ruso.#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);
GLCD.print("~C");
GLCD.println("@;/.,|<>()=-_{}\"'");
GLCD.CursorTo(4,7);
GLCD.print("MT-12864J");
}
Dado que los archivos con la función outstr.h y la fuente System5x7R.h se encuentran en el directorio raíz de la biblioteca actualizada, deben colocarse con enlaces separados al comienzo del boceto utilizando la directiva #include . Para las inscripciones en inglés, todavía es conveniente usar las funciones estándar println / print , pero si necesita traducir una línea en el texto ruso, debe especificar explícitamente el carácter "\ n".Puede descargar la versión corregida de la biblioteca aquí . La biblioteca desempaquetada (carpeta openGLCD ) debe colocarse en la carpeta Arduino \ bibliotecascomo siempre Un boceto de ejemplo se encuentra en el mismo archivo por separado (no en la carpeta Ejemplos de la biblioteca). La conexión de una pantalla con el controlador ks0108 de acuerdo con esta biblioteca se muestra en el diagrama anterior. Si desea cambiar adicionalmente el orden de conexión de los pines, busque el archivo PinConfig_ks0108-Uno.h en la carpeta Arduino \ bibliotecas \ openGLCD \ config \ ks0108 y edite las líneas debajo del encabezado "Definiciones de pines de datos" y más, enfocándose en las correcciones del autor.En la próxima publicación, trataremos de abordar la rusificación de las pantallas en minúsculas. Como verás, con ellos todo es más fácil y más complicado.