Конвертирование текста для ЖКИ на контроллере HD44780
Автор: technik-1017 Кодировка символов индикатора на контроллере HD44780 не соответствует кодировке исходных текстов проекта (у нас, как правило, это CP1251). Поэтому, для корректного отображения текста на индикаторе, его необходимо преобразовать. Существует два основных способа преобразования текста: - преобразование на уровне исполнения; Далее все примеры будут демонстрироваться для компилятора IAR Embedded Workbench (www.iar.com). Язык программирования – Си. Способ 1. Преобразование на уровне исполнения Данный способ позволяет, при задании значений строковых переменных в исходных файлах проекта, использовать национальный шрифт. Текст, требующий вывод на индикатор, также хранится в памяти микроконтроллера в кодировке исходных файлов проекта, что не соответствует кодировке индикатора. В связи с этим, текст, перед каждым выводом на индикатор, необходимо конвертировать. Такое преобразование требует наличия во Flash таблицы перекодировки, а также использования ресурсов микроконтроллера. Для современных микроконтроллеров это уже не является проблемой, но всё же это бесполезная работа для микроконтроллера. Данный способ упрощает жизнь разработчику, но усложняет микроконтроллеру. Реализовать преобразование можно определив массив на 256 байт, где каждому коду символа в кодировке CP1251 (порядковый номер элемента в массиве) соответствует код символа в кодировке индикатора (значение): const uint8_t __flash TableLCDDecode[] = Выводимый на индикатор текст определяется удобным для разработчика способом: const uint8_t __flash MsgAttention[] = "Внимание"; Далее, где то в исходных файлах (у меня, например, в прерывании), каждый раз перед записью символа в индикатор, подменяем его символом из таблицы: data = TableLCDDecode[data]; Способ 2. Преобразование на уровне компиляции Единственный способ заставить микроконтроллер выводить текст на индикатор без накладных расходов, это хранить текст во Flash уже в кодировке индикатора. Т.е. необходимо произвести преобразование до формирования исполняемого файла. Это можно сделать либо вручную (например, сторонними программами), либо попытаться доверить эту работу препроцессору языка Си. Наличие в исходных файлах проекта выводимого на индикатор текста в виде последовательности кодов не совсем наглядно, нужно было придумать другой способ преобразования. В итоге, используя препроцессор языка Си, была создана серия макросов (файл lcd_conv.h). Макрос конвертирует текст из кодировки CP1251 в кодировку индикатора. На выходе макроса получается строка соответствующая массиву байт с завершающим кодом 0x00. Макрос начинается с префикса LCD_TEXT_XX, где XX это количество символов в строке (отсчёт начинается с единицы). Макросы поддерживают преобразование до 80 символов, что соответствует количеству символов индикатора 2004 (4 строки по 20 символов). Избавиться от количества символов в названии макроса не получается в связи с неработоспособностью функции sizeof() в препроцессоре. Если нам необходимо вывести на индикатор слово «Внимание», то макрос будет выглядеть следующим образом: LCD_TEXT_08("Внимание") где «08» это количество символов в слове «Внимание». После выполнения данного макроса на выходе получаем строку: {0x42, 0xBD, 0xB8, 0xBC, 0x61, 0xBD, 0xB8, 0x65, 0x00} Если в макросе ошибочно будет указано меньшее количество символов, то на экране будет отображена только часть строки. Если в макросе будет указано большее количество символов, то компилятор выдаст ошибку. Пример использования: // подключаем заголовочный файл с макросом
Данный макрос без изменений может использоваться с любым компилятором языка Си.
Файлы: Все вопросы в Форум.
|
|
||||||||||||
|
||||