Escrever texto em russo em telas gráficas com o controlador ks0108 ou seus análogos ainda apresenta dificuldades significativas. A biblioteca openGLCD, recomendada pelos sites oficiais do Arduino, na configuração original da versão mais recente no momento não contém fontes cirílicas, exceto a fonte cp437font8x8. Na prática, é de pouca utilidade, porque na parte do idioma russo ele suporta a codificação Win-1251 . Portanto, para gerar caracteres em uma fonte desse tipo, eles devem ser inseridos no texto com códigos octais ou hexadecimais (e ao mesmo tempo existirem ambiguidades com a letra minúscula "I", como o próprio criador da fonte indica no comentário), ou ainda escrever uma função de conversão separada, como esta fez arduinecpara a biblioteca Adafruit-GFX.Além disso, cp437font8x8 é grande para telas de 128x64 pixels. O tamanho ideal da fonte para etiquetas auxiliares em um monitor permanece o System5x7. Aqui, focamos na russificação da fonte do sistema, embora o leitor possa russificar independentemente qualquer outra fonte com base nessa amostra (especialmente se ela tiver uma tela maior).Qual é o problema?
Para começar, vamos nos aprofundar nas raízes do problema. O Arduino IDE é um editor de texto comum do Windows que funciona na codificação universal UTF-8 , como qualquer outro nas versões modernas do Windows (bloco de notas, por exemplo). UTF-8 é uma versão econômica da codificação multibyte UNICODE. No UTF-8, caracteres, números, colchetes de ponto e vírgula e todos os tipos de outros ícones em inglês são representados por um byte que corresponde à codificação ASCII padrão . Portanto, sua representação no código de esboço não apresenta dificuldades: após a compilação, a sequência de caracteres em inglês é transferida para o arquivo hexadecimal carregável sem alterações e é clara para o controlador de 8 bits, como se costuma dizer, “sem tradução”.Durante essa conversão, cada caractere, como em qualquer programa em qualquer linguagem de programação, é representado diretamente na forma de seu código, ou seja, o número de série na tabela de fontes, da qual o programa extrai o estilo gráfico do caractere correspondente. O ficheiro de fonte System5x7.h biblioteca openGLCD número variável de caracteres representados font_Char_Count tipo uint8_t , isto é, não pode exceder um byte. Portanto, caracteres cirílicos, que em UTF-8 ocupam dois bytes , não podem ser transmitidos ao controlador da maneira usual.Tentativas anteriores, . 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 . , , . .
Solução
O autor não entrou nas funções das bibliotecas, mas escreveu para o openGLCD um complemento na forma da função outstr () , que itera sobre todos os elementos da string de entrada, passando-os pelo operador de seleção Switch . Ele captura caracteres cirílicos da sequência e os substitui por códigos de byte correspondente ao arquivo de fonte atualizado System5x7R.h .Por exemplo, para a letra maiúscula do russo "F", a sequência de substituição será assim:case '': GLCD.PutChar(0xA4); break;
Aqui 0xA4 é o byte baixo da codificação da letra "F" em UTF-8 (veja o link acima). De acordo com essa codificação, um novo arquivo de fonte System5x7R.h foi compilado . Em princípio, com essa abordagem na fonte, você pode usar qualquer codificação de caracteres russos e quaisquer outros glifos que desejar inserir na fonte. Se apenas o número total não exceder 128 peças: do início da tabela ao caractere 0x7F (127 é o último caractere da tabela ASCII padrão), é recomendável deixar a fonte intacta.É verdade que me permiti algumas liberdades com a tabela ASCII. O fato é que, na fonte original System5x7.ho ícone de grau é colocado na última linha da tabela, ocupando o caractere 0x80, que já temos em cirílico. Para não violar o procedimento de construção de uma tabela cirílica de acordo com UTF-8, essa linha foi lançada do arquivo. E o ícone de grau é anexado em vez do caractere ASCII “~” (número 0x7E), que na fonte ainda não foi usado para a finalidade pretendida. Mas essa substituição permite que você insira o ícone de grau no texto do esboço diretamente do teclado na forma de um símbolo “~”.Outra liberdade se deve ao fato de o autor não tolerar o zero riscado - o arcaico da ADCU e o texto monocromático. Portanto, o zero na fonte modernizada é substituído pelo glifo da letra "O". Aqueles que aderem a princípios puristas podem simplesmente excluir o arquivo de fonte System5x7R.hesta inserção (o antigo glifo de zero riscado é deixado comentado, seu código é 0x30).Na biblioteca openGLCD modernizada , que pode ser baixada no link no final do artigo, foi feita mais uma correção - a ordem de conexão dos pinos dos monitores com o controlador ks0108 foi alterada. Por que o autor da biblioteca escolheu esse pedido (veja a tabela no link no site oficial do Arduino ) é desconhecido. Na versão atualizada, a conexão do monitor (por exemplo, o popular MT-12864J é selecionado) é realizada de acordo com este esquema:Diagrama de conexão MT-12864J O resistor variável R1 é conectado aqui de acordo com a recomendação do fabricante , e o resistor R2 serve para limitar a corrente de luz de fundo se não estiver conectado à tensão de 5 V, mas diretamente à fonte de alimentação de entrada (saída Vin Arduino) com uma tensão mais alta.Um exemplo da exibição do alfabeto russo MT-12864J misturado ao latim, além de números e o ícone de grau, é mostrado na foto:Texto de esboço para este exemplo:O texto do esboço com a conclusão do alfabeto russo#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");
}
Como os arquivos com a função outstr.h e a fonte System5x7R.h estão localizados no diretório raiz da biblioteca atualizada, eles devem ser colocados com links separados no início do esboço usando a diretiva #include . Para inscrições no idioma inglês, ainda é conveniente usar as funções padrão println / print , mas se você precisar traduzir uma linha no texto em russo, deverá especificar explicitamente o caractere "\ n".Você pode baixar a versão corrigida da biblioteca aqui . A biblioteca descompactada (pasta openGLCD ) deve ser colocada na pasta Arduino \ librariescomo sempre. Um esboço de exemplo está localizado no mesmo arquivo separadamente (não na pasta Exemplos da biblioteca). A conexão de um monitor com o controlador ks0108 de acordo com esta biblioteca é mostrada no diagrama acima. Se você quiser alterar adicionalmente a ordem de conexão dos pinos, procure o arquivo PinConfig_ks0108-Uno.h na pasta Arduino \ libraries \ openGLCD \ config \ ks0108 e edite as linhas sob o título "Definições de pinos de dados" e, mais tarde , concentrando-se nas correções do autor.Na próxima publicação, tentaremos lidar com a russificação dos monitores em minúsculas. Como você verá, com eles tudo é mais fácil e mais complicado.