Приветствую Вас, Гость! Регистрация RSS

Среда, 24.04.2024
Главная » Статьи » Cтатьи

Дорабатываем библиотеку lcd.h среды CodeVisionAVR 3.12. Вывод кирилицы на ЖКД

ВВЕДЕНИЕ

В этой статье я расскажу как доработать штатную библиотеку lcd.h интегрированной среды разработки CodeVisionAVR 3.12. Разработчики по каким-то причина "зарубили" директиву #pragma rl+/#pragma rl-, которая позволяла выводить кирилицу на экран ЖКД. Начиная с версии 2.03.5 это директива перестала работать. Но все же существует выход - небольшая доработка, абсолютно не нарушающая логику работы библиотеки в целом. Вы спросите - "А зачем лезть в штатную библиотеку, когда можно написать свою с нуля?". Так-то оно правильно, но зачем изобретать велосипед, когда имея первый и если он подходит для определенной модернизации, то соответственно выполнить эту модернизацию. Приступим.


ОСНОВНАЯ ИДЕЯ

Для того, что бы выводить кирилицу на ЖКД осуществим некоторые вещи: 

  • Напишем массив символов кирилицы (прописные и заглавные соответственно)
  • Напишем массив байтов соответствующих байтам зашитым в ЖКД.
  • Напишем функцию по определению символа и байта (который нужно отправить в ЖКД).

  •  

НЕМНОГО ТЕОРИИ О ЖКД

Теперь посмотрим внутрь ЖКД. Оставим в стороне внутреннюю архитектуру и взглянем на страницу знакогенератора (она же таблица символов), который содержит символы для вывода на экран.



Каждый символ находиться по своему адресу. Например, символ А (англ.) находиться по адресу LHLL(4) LLLH(1) (читается как сверху-слево)или 0х41, т.е. отправляя соответствующий байт, экран ЖКД будет отображать символ А. Таким же образом отображаются символы кирилицы (русские символы). Как видно из таблицы символов некоторые символы используются как для вывода латиницы, так и кирилицы. Кодировка латиницы четко совпадает с расположением символов в таблицы, поэтому их можно в тексте программы писать таким образом - 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd', ну или в по-байтовом виде. Таким же образом можно выводит цифры и знаки. C символами кирилицы такой фокус не катит - 'Ж', 'Д', 'ч'. Для решения данной сложности необходимо в нужный момент (когда требуется вывести символ кирилицы) отправлять байт соотвествующий символу. Теперь решения рассмотрим подробнее . . .

ВЫВОД КИРИЛИЦЫ НА ЖКД

Для вывода кирилицы на экран ЖКД, соотвественно определяем символ и отправляем байт, который имеет отношение к нужному нам символу. Напишем массив этих самых символов, в который будем "лезть" для поиска соответствия. Код массива имеет вид:



Логика работы заключается в использования цикла while для нахождения символа в массиве в соответсвии с исходным символом. Местоположение символа можно определять по счетчику, который используется в качестве переменной. Об этом разъясню позже. Теперь пришла очередь массиву, который собственно содержит байты для отправки в ЖКД. Код имеет вид:



Как видно, емкость массивов одинаковая и это очевидно. Местоположение байта соответствует положению символа кирилицы. В такой гармонии легко определять символ и отправлять его байт в ЖКД. Поэтому применяем счетчик, который будет останавливаться при совподении символа, и по нему же будет осуществляться отправку байта в ЖКД. В общем логика понятна, думаю, если немного покумекав за чашечкой кофэ, то можно сообразить как это все работает wink

ПРИСТУПИМ К ПРОГРАММИРОВАНИЮ

Теперь нам нужно всем этим "хозяйством" управлять. А управлять мы будем при помощи одной единственно функции, которая имеет вид:



Этот прототип функции записываем в файле \INC\lcd.h:



Собственно реализация функции имеет следующий вид:



В 4 строке переменная i собственно является счетчиком, которая будет определять байт для отправки в ЖКД. Первая конструкция if анализирует диапазон cимволов латиницы, цифр, знаков - здесь происходит чистая отправка байтов (почему так я писал в начале статьи). Вторая конструкция if определяет диапазон символов кирилицы - здесь происходит интересный механизм работы цикла (тут в принципе уже сразу видно логику работы): сравнивается символ chr, и пока он не равен символу из массива, в теле цикла выполняется инкремент счетчика i. Как только символ найден цикл прекращается и соответствующий байт отправляется в ЖКД (функция в строке 11). Таким образом происходит работа при поступлении следующего символа. ВАЖНО! чтобы местоположение символа соотвествовало местоположению байта.

В штатных функциях вывода строки библиотеки \LIB\lcd.lib подменяем функцию lcd_putchar на lcd_char таким образом:



Собственно исходный код тестовой программы имеет вид:

 

 

 

 

 

Категория: Cтатьи | Добавил: Автор (06.04.2015)
Просмотров: 7041 | Комментарии: 2 | Теги: доработка библиотеки lcd, lcd.h, pragma rl | Рейтинг: 5.0/2
Всего комментариев: 2
1 nik  
1
Русские буквы в таблице символов CP-1251 расположены по алфавиту за исключением буквы Ё. Буква А(заглавная) имеет код 192. То есть для получения кода буквы достаточно из её кода вычесть 192 откорректировать код на 1 если получили число от 5 до 37 = 229(код буквы е прописная) - 192 если больше 37 то прибавить 2. Отдельно сделать проверку а Ё код 168 и ё код 184. Получаем выигрыш в скорости и экономии памяти. Если русские буквы в другой кодировке то вычисления надо делать соответствии с той таблицей.

2 Евгений  
0
кириЛЛица

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]